版权声明
本文来自博客园,作者:观心静 ,转载请注明原文链接: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
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
来源:https://www.cnblogs.com/guanxinjing/p/16613716.html |