参考文章:[Android][踩坑]Android Studio导入framework.jar的各种坑_android_Ryan ZHENG-开放原子开发者工作坊
本文只对以下情况举行分析,其他情况参考上面文章
开发情况:
平台:RK3576 Android14
JDK版本:JDK17
AS版本:Jellyfish | 2023.3.1 Patch1
gradle版本:8.0.1
步骤:
1、找到编译后的framework.jar
Android14的路径,修改名称为framework.jar
out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jar
2、 配置天生*.iml文件
在File >> Settings >> Build… >> Build Tools >> Gradle 中勾选generate *.iml,否则项目中将没有My_Application.app.main.iml这个文件
3、 将framework.jar放入app/libs中
4 、build.gradle(:app)中添加framwork.jar依赖
- dependencies {
- compileOnly files("libs/framework.jar")
- }
- //修改jar加载顺序,解决引入报红问题,执行clean project 即可,不同AS版本修改位置不一样。
- preBuild {
- //需要先在File >> Settings >> Build... >> Build Tools >> Gradle 中勾选generate *.iml,
- //否则项目中将没有My_Application.app.main.iml这个文件
- def imlFile = file("$rootProject.rootDir/.idea/modules/app/My_Application.app.main.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 34 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) {
- e.printStackTrace()
- }
- }
- //修改编译时候引用不到报错问题,执行build APK 即可通过。
- android {
- ...
- gradle.projectsEvaluated {
- tasks.getByName("compileDebugJavaWithJavac") {
- //经过验证发现,修改classpath会导致编译task列表顺序紊乱,从而报错提示找不到R.class相关内容;
- //因此此处需要显式声明javac的task依赖resource编译完成
- dependsOn("processDebugResources")
- classpath = reorderClasspath(classpath.getFiles())
- }
- tasks.getByName("compileReleaseJavaWithJavac") {
- //同上,release与debug分别声明对应的task依赖
- dependsOn("processReleaseResources")
- classpath = reorderClasspath(classpath.getFiles())
- }
- }
- }
- // 新增一个函数,以便多次调用
- def reorderClasspath(Set<File> classpathSet) {
- List<File> newFileList = new ArrayList<>()
- File sdkFile = null
- for (File f : classpathSet) {
- //将android.jar放到-classpath参数末尾即可
- if ("android.jar" == f.getName()) {
- sdkFile = f
- } else {
- newFileList.add(f);
- }
- }
- if (sdkFile != null) {
- newFileList.add(sdkFile)
- }
- return files(
- newFileList.toArray()
- )
- }
复制代码 5、 修改结束,举行测试吧。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |