观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

版权声明

本文来自博客园,作者:观心静 ,转载请注明原文链接: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

posted on 2022-08-22 17:51  观心静  阅读(628)  评论(0编辑  收藏  举报