版权声明
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/16613716.html
前言
此博客讲解如何在Android studio中架入framework包。framework架包的最大目的肯定是想调用系统代码。但是请注意framework架的jar包是不参与apk编译的,你还需要apk有系统级权限与系统签名:Android系统开发 编译系统签名的APP
Framework架包的目的与结果
在开始架包前,先说明一下架包的目的与结果。如果不弄懂这个,那么你可能无法判断自己是否架包成功。首先架包是为了项目调用系统的API。 但是不等于Android studio上不会出现代码错误提示。 架包的目的是解决在Android studio编译apk时不会出现错误。意思是说就算IDE上已经显示红色的错误代码了,但是我们依然可以编译出apk。
Framework包的生成目录
out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
如果未生成,可以执行下 make javac-check-framework
Framework架包流程
引入framework.jar
在build中增加引用代码
注意!下面的 compileOnly files('libs\\framework.jar') 别忘记添加到自己的项目里了
这里说明一下,其实只要添加 compileOnly files('libs\\framework.jar') 到这一步已经ok了.. 剩下的都不需要在配置了。虽然Android studio会提示代码错误,但是已经可以顺利编译apk了。
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { compileSdk 31 defaultConfig { applicationId "com.zh.demo" minSdk 22 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures{ viewBinding = true } } dependencies { compileOnly files('libs\\framework.jar') implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' } //此段代码的作用是移动.app.iml文件中的Android api 位置顺序 preBuild { doLast { //def imlFile = file(project.name + ".iml") def imlFile = file("..\\.idea\\modules\\app\\" + project.parent.name + ".app.iml") try { def parsedXml = (new XmlParser()).parse(imlFile) def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } parsedXml.component[1].remove(jdkNode) def sdkString = "Android API " + android.compileSdkVersion.substring("Adroid-".length()) + " Platform" new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK']) groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile)) } catch (FileNotFoundException e) { // nop, iml not found } } }
打开.iml文件构建
Framework架包的结果验证
怎么样才算架包成功。其实framework架包的关键是想把依赖顺序改变。让优先依赖的android.jar包变成framework.jar。 这里我们可以查看app.iml 文件了解依赖顺序。
.app.iml 路径图:
将Android Api 依赖从最上面移动到最下面
查看External Libraries, 成功架包后 Android Studio default JDK 会改变引用位置
在代码中引用framework的代码,架包成功后kotlin代码可能会报错。但是无关紧要,因为不影响编译apk。重点是我们可以调用ActivityManager.getCurrentUser() 这种系统级Api了。 点击ActivityManager也可以查看到路径已经被引用到framework.jar了
End
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/16613716.html