• Android Studio 导入自己编译的 framework.jar


    一、编译生成 framework.jar 包

    系统级 App 开发,很多时候需要访问 framework 层隐藏的接口(接口前的注释里加了@hide),有时候甚至是定制的系统,在 framework 层加入了新的接口,为了使用这些接口,需要自己编译 framework 的源码生成 jar 包,如果编译 debug 版本,直接把 out/target/product/projectXX/system/framewor framework.jar 下面拷出来,
    如果是 user 版本:
    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

    二、将 framework.jar 导入 Android Studio 工程

    1. 将framework.jar放在Module的libs下面
       

    2. 添加对 framework.jar 的依赖
      在 module 的 build.gradle 文件中添加:

    1. repositories {
    2. flatDir {
    3. dirs 'libs'
    4. }
    5. }

    同时, dependencies 中添加依赖:

    1. dependencies {
    2. compileOnly fileTree(dir: 'libs', include: ['*.jar'])
    3. }

    注意:
    使用 compileOnly(默认是 implementation),compileOnly 表示 jar 包只参与编译,不会打包进去。

    如果同时还需要依赖其它 jar 包,并且其它需要打包进去,则分开对每个 jar 包单独进行依赖。

    1. compileOnly files('libs/framework.jar')
    2. implementation files('libs/XXX.jar')
    1. 在工程的根目录下打开build.gradle,并找到allprojects,加入如下代码:
      1. gradle.projectsEvaluated {
      2. tasks.withType(JavaCompile) {
      3. options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
      4. }
      5. }

    2. 或者在 module 的 build.gradle 文件中添加如下代码:
    1. gradle.projectsEvaluated {
    2. tasks.withType(JavaCompile) {
    3. Set<File> fileSet = options.bootstrapClasspath.getFiles()
    4. List<File> newFileList = new ArrayList<>();
    5. //"../framework.jar" 为相对位置,需要参照着修改,或者用绝对位置
    6. newFileList.add(new File("libs/framework.jar"))
    7. newFileList.addAll(fileSet)
    8. options.bootstrapClasspath = files(newFileList.toArray())
    9. }
    10. }
    1. 在 module 的 build.gradle 文件中,加入如下代码:
    1. preBuild {
    2. doLast {
    3. //此处文件名根据实际情况修改:
    4. def imlFile = file("../.idea/modules/xxxlib/xxx.xxxlib.iml")
    5. try {
    6. def parsedXml = (new XmlParser()).parse(imlFile)
    7. def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
    8. parsedXml.component[1].remove(jdkNode)
    9. def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
    10. new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
    11. groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
    12. } catch (FileNotFoundException e) {
    13. // nop, iml not found
    14. println "no iml found"
    15. }
    16. }
    17. }

    这个 task 在编译之前, 自动更改module.iml,将下面代码会移动最后

    <orderEntry type="jdk" jdkName="Android API 30 Platform" jdkType="Android SDK" />
    

    才能在编译时使用我们引入的 framework.jar。

     

  • 相关阅读:
    delphi 中几种多线程操作方式
    Python爬虫实战,requests+re模块,Python实现爬取豆瓣电影《魔女2》影评
    【机器学习】岭回归和LASSO回归详解以及相关计算实例-加利福尼亚的房价数据集、红酒数据集
    二维码生成和解析工具包-zxing
    【知识拓展】HTTP、WebSocket 和 RPC:区别与使用场景详解
    reactHook实现EventBus
    ArcGIS JS API 演示Demo
    Kafka-exporter监控消费速度与生产速度差异规则
    第一章 软考架构师之计算机系统组成与体系结构
    带着问题去分析:Spring Bean 生命周期 | 京东物流技术团队
  • 原文地址:https://blog.csdn.net/yzwfeng/article/details/125540849