Android Studio 引用framework.jar方法

打印 上一主题 下一主题

主题 928|帖子 928|积分 2784

参考文章:[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依赖

  1. dependencies {
  2.     compileOnly files("libs/framework.jar")
  3. }
  4. //修改jar加载顺序,解决引入报红问题,执行clean project 即可,不同AS版本修改位置不一样。
  5. preBuild {
  6.         //需要先在File >> Settings >> Build... >> Build Tools >> Gradle 中勾选generate *.iml,
  7.         //否则项目中将没有My_Application.app.main.iml这个文件
  8.         def imlFile = file("$rootProject.rootDir/.idea/modules/app/My_Application.app.main.iml")
  9.         try {
  10.             def parsedXml = (new XmlParser()).parse(imlFile)
  11.             def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
  12.             parsedXml.component[1].remove(jdkNode)
  13.             def sdkString = "Android API 34 Platform"
  14.             new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
  15.             groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
  16.         } catch (FileNotFoundException e) {
  17.             e.printStackTrace()
  18.         }
  19. }
  20. //修改编译时候引用不到报错问题,执行build APK 即可通过。
  21. android {
  22.         ...
  23.     gradle.projectsEvaluated {
  24.         tasks.getByName("compileDebugJavaWithJavac") {
  25.             //经过验证发现,修改classpath会导致编译task列表顺序紊乱,从而报错提示找不到R.class相关内容;
  26.             //因此此处需要显式声明javac的task依赖resource编译完成
  27.             dependsOn("processDebugResources")
  28.             classpath = reorderClasspath(classpath.getFiles())
  29.         }
  30.         tasks.getByName("compileReleaseJavaWithJavac") {
  31.             //同上,release与debug分别声明对应的task依赖
  32.             dependsOn("processReleaseResources")
  33.             classpath = reorderClasspath(classpath.getFiles())
  34.         }
  35.     }
  36. }
  37. // 新增一个函数,以便多次调用
  38. def reorderClasspath(Set<File> classpathSet) {
  39.     List<File> newFileList =  new ArrayList<>()
  40.     File sdkFile = null
  41.     for (File f : classpathSet) {
  42.         //将android.jar放到-classpath参数末尾即可
  43.         if ("android.jar" == f.getName()) {
  44.             sdkFile = f
  45.         } else {
  46.             newFileList.add(f);
  47.         }
  48.     }
  49.     if (sdkFile != null) {
  50.         newFileList.add(sdkFile)
  51.     }
  52.     return files(
  53.             newFileList.toArray()
  54.     )
  55. }
复制代码
5、 修改结束,举行测试吧。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表