参考文章:[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、 修改结束,进行测试吧。
标签:jar,app,classpath,iml,framework,Studio,Android From: https://blog.csdn.net/weixin_56061795/article/details/144424238