framework-jar-for-android
发布时间 :
字数:1.2k
阅读 :
不同版本 AndroidStudio 引入 Framework
单独模块引入 framework.jar
- 只适用 Android Studio 4.x 及以上版本
配置生成*.iml文件
在File >> Settings >> Build… >> Build Tools >> Gradle 中勾选generate *.iml,否则项目中将没有Application.app.main.iml这个文件
将framework.jar放入app/libs中
build.gradle(:app)中添加framework.jar依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| dependencies { compileOnly files("libs/framework.jar") } gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add("-Xbootclasspath/p:$rootProject.rootDir/app/libs/framework.jar") } } preBuild { doLast { 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 30 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() } } }
|
至此,MainActivity中framework.jar的测试代码将不再报红
全局引入 framework.jar
将framework.jar放入项目根目录下的libs中
build.gradle(:app)中添加framework.jar依赖
1 2 3
| dependencies { compileOnly files("../libs/framework.jar") }
|
修改项目级build.gradle文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| subprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add("-Xbootclasspath/p:$rootProject.rootDir/libs/framework.jar") } preBuild { doLast { def rootProjectName = rootProject.name.replace(" ", "_") def projectName = project.name.replace(" ", "_") def iml_path = "$rootProject.rootDir\\.idea\\modules\\" + projectName + "\\" + rootProjectName + "." + projectName + ".main.iml" def imlFile = file(iml_path) try { def parsedXml = (new XmlParser()).parse(imlFile) def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } def sdkString = jdkNode.'@jdkName' parsedXml.component[1].remove(jdkNode) 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->Make Project使配置生效,framework.jar中隐藏api或者系统级api将可正常调用并且不会报红,测试结果如下图所示:
上述使用的framework.jar一定是从以下路径获得,否则可能无法在android studio中编译通过,并且正常运行,android 12 版本
out\target\common\obj\JAVA_LIBRARIES\framework-minus-apex_intermediates\classes.jar
较新版本引入 framework.jar
测试Android Studio版本为–>Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1
app/build.gradle
1 2 3 4
| dependencies { compileOnly files('libs/framework.jar') }
|
build.gradle
测试的AS版本【Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| subprojects { gradle.projectsEvaluated {
getTasks().configureEach {
if (it.name.endsWith('JavaWithJavac')) { it.dependsOn('processDebugResources') } } getTasks().withType(JavaCompile.class).configureEach { def newFiles = new ArrayList<>() newFiles.add(0, file('app/libs/framework.jar')) newFiles.addAll(it.classpath.files) it.classpath = files(newFiles.toArray()) }
prepareKotlinBuildScriptModel { doLast(new Action<Task>() { @Override void execute(Task task) { println('开始执行xxx.app.main.iml依赖重排序逻辑') def imlFilePath = String.format("%1s/.idea/modules/app/%2s.app.main.iml", rootProject.rootDir, rootProject.name) if (!new File(imlFilePath).exists()) { println('要重排序的iml文件【' + imlFilePath + '】不存在') return } def document = DocumentBuilderFactory.newInstance() .newDocumentBuilder() .parse(imlFilePath) def root = document.getDocumentElement() def jdkNode = (root.getElementsByTagName('orderEntry').item(0) as Element) if (jdkNode.getAttribute('type') != 'jdk') { println('首个orderEntry不是jdk,不用重新排序') return } def parentNode = jdkNode.getParentNode() parentNode.removeChild(jdkNode) parentNode.appendChild(jdkNode) def transformer = TransformerFactory.newInstance().newTransformer() transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8") transformer.transform(new DOMSource(root), new StreamResult(new FileOutputStream(imlFilePath)))
println('iml依赖重排序完成') } }) } } }
|
部分内容参考自:https://blog.csdn.net/u014175785/article/details/116235760
测试用Android 14源码编译framework.jar下载链接:
https://download.csdn.net/download/lmjssjj/89107722
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nathanwriting@126.com
文章标题:framework-jar-for-android
字数:1.2k
本文作者:Nathaniel
发布时间:2025-01-03, 23:48:12
最后更新:2025-08-03, 12:21:06
原始链接:http://example.com/2025/01/03/framework-jar-for-android/
版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。