Android Studio 工程导入 AOSP 编译的 android.jar

使用场景
  1.需要使用 framework 中的 @SystemApi 文件或者 @hide 的 API 接口
  2.定制 Framework 层业务,即有 客制化 的 API 接口
补充知识点
  1.framework 源码即 AS 工程目录中 External Libraries 下的 < Android API xx Platform > 下的原生 SDK 的 android.jar
    所在路径:Sdk\platforms\android-29\android.jar
  2.compileSdkVersion:AS 本地开发环境中的 依赖的 sdk 编译版本,即决定了 < Android API xx Platform > 中 xx 的值,如 < Android API 29 Platform >
  3.targetSdkVersion:APP版本开发中的适配版本
  4.buildToolsVersion:工程的构建工具版本,即 Gradle 版本
备注:
  以下内容使用的 framework.jar 为个人源码编译得的,才有其中的如 SystemProperties 类。

实际场景

在这里插入图片描述
  如上图所示,当我们在项目中使用一些 @SystemApi 文件或者 @hide 接口时,直接使用工程中 Gradle 为我们加载的 sdk 中 android.jar 时会出现无法使用的异常报错,这将导致无法正常编译,或者哪怕你做的是系统应用开发,可以使用源码正常编译,但整个工程都是红色提示,这也会愁死那些有强迫症的码农。
  那么解决方案就来了,如何正常使用它或者消除红色提示呢?

导入离线 android.jar

这边以原生 sdk 中的 30 android.jar 为例,客制化的平台 源码编译 的 framework 包请注意注释

配置 jar 包的优先级

  • 将工程想要依赖的 framework 包放置 app module 的 libs 下,

    dependencies {
        //Android N/O:
        //out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
        //Android P/Q:
        //out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jar
        //Android R:
        //out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jar
        compileOnly files('libs/framework9.jar')
    //    implementation files('libs\\framework30.jar')
    }
    
    // place in first line of gradle.
    import groovy.xml.XmlUtil
    
    // not contained in any attribute, put it in the outermost layer
    // make SDK directory's android.jar set in libs behind
    preBuild {
        doLast {
            // 配置 framework.ja r优先于原生SDK中的 android.jar
            def imlFile = file("${project.rootDir}\\.idea\\modules\\app\\simple-use-aosp.app.iml")
            //这里是此module的iml文件路径,一定要写对
    //        def imlFile = file(project.name + ".iml")
            println 'path=' + projectDir.absolutePath
            println 'Change ' + imlFile.name + ' order'
            try {
                def parseXml = new XmlParser().parse(imlFile)
                def jdkNode = parseXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
                parseXml.component[1].remove(jdkNode)
                def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
                println 'sdkString ' + sdkString + ' '
                new Node(parseXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
                XmlUtil.serialize(parseXml, new FileOutputStream(imlFile))
            } catch (FileNotFoundException e) {
                //nop, iml not found.
                println e.printStackTrace()
            }
        }
    }
    
  • 将其配置加载优先于原生 sdk 的 android.jar
    Project 的 build.gradle

    allprojects {
        ......
        gradle.projectsEvaluated {//Gradle 提供的生命周期回调方法:所有project配置完成后调用
            tasks.withType(JavaCompile) {
                options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework9.jar')
            }
        }
    }
    

    其中,需要注意的是以上配置必须配置在 allprojects 才会生效

做完以上配置之后,就可以进行编译使用了
参考 Demo

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值