高版本 Android Studio 集成 framework.jar
前言
最近工作需要在项目中集成系统的 framework.jar,以此来调用系统的定制功能,但是按照之前方案配置之后发现无法调用 framework.jar 中的方法,默认使用的还是 Android SDK 里面的方法。
经过一系列的排查之后终于找到解决方案,做此分享。
集成 framework.jar 方案
导入 framework.jar
首先将 framework.jar 导入项目中,以一个简单 Demo 项目举例,项目中有一个 app 模块,项目结构如下(只列出了关键文件)
1 | # 项目结构 |
- 将 framework.jar 文件复制到
Demo/app/libs
路径下; - 在
Demo/app/build.gradle.kts
文件中添加依赖:
1 | dependencies { |
配置依赖优先级
仅仅在项目中导入 framework.jar 是没有效果的,你会发现之前被标记为 @hide
的接口现在还是不能使用,导入的 framework.jar 中的定制方法还是不能调用,与之前不同的是此时你可以调用 framework.jar 中系统原生不存在的类,这样的效果当然不能让我们满意。
这是由于默认情况下,Android SDK 中的资源优先级是高于手动导入的资源的,因此我们需要手动修改这个优先级,这部分定义在项目根目录下 .idea/modules/app/xxxx.iml
中,所以接下来需要在对应模块的 build.gradle.kts
中添加配置。
在 Demo 项目中,我们要在 Demo/app/build.gradle.kts
中修改:
1 | import groovy.namespace.QName |
方法 changeSdkOrder
的参数为模块对应的 .iml
配置文件路径,可按照自己的项目配置,按需修改。
如此一来,在项目中就可以尽情的使用 framework.jar 中的方法了。
配置引导类路径
经历了上面两个步骤的配置,在开发过程中已经可以正常使用 framework.jar 中的内容的,在本地 Android Studio 中也能正常编译运行,但是如果你们公司配置在服务器编译构建就还是会报错,那就需要在项目根目录的 build.gradle.kts
中添加相关配置。
在 Demo 项目中,我们要在 Demo/build.gradle.kts
中修改:
1 | ... |
通过上面的配置,我们将 framework.jar 添加到引导类路径中,无论是在本地还是在服务器构建,就都不会出现问题了。
高版本 Android Studio 适配
讲了这么多,终于到了我们这篇文章的重点,就是高版本 Android Stuido (这里特指 3.6.3
之后的版本)的适配。
作者这边使用的 Android Studio 版本是 Iguana
,按照上面的步骤配置完之后发现并没有起作用,具体现象就是导入的 framework.jar 中的定制方法不能调用,只可以调用 framework.jar 中系统原生不存在的类,那不就是 依赖优先级 的配置失效了吗,打开 Demo/.idea/modules/app/Demo.app.main.iml
文件,发现里面只剩简单的几行配置,依赖优先级 相关的几个节点都没有了,那该怎么配置?
经过多次 Google、百度、Bing 无果,能找到的都是已知的配置,最终找到了 Android Studio 中的一个配置项,路径在 File -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle 中,有一个 Generate *.iml files for modules imported from Gradle
,把这个选项勾选上,restart Android Studio,.iml
文件中的配置就恢复了。
经过多个版本的多次尝试,最终发现:在 Android Studio 3.6.3
版本及以前,Generate *.iml files for modules imported from Gradle
选项默认是勾选上的,而在 3.6.3
之后的版本,该选项默认是没有勾选的。经历了九九八十一难,终于解决了这个奇葩的问题,感谢各位的观看!