framework-jar-for-android

  1. 不同版本 AndroidStudio 引入 Framework
    1. 单独模块引入 framework.jar
    2. 全局引入 framework.jar
    3. 较新版本引入 framework.jar

不同版本 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 {
//测试版本 Android Studio Giraffe | 2022.3.1 Patch 1
//需要先在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 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 {
//所有project配置完成后调用
gradle.projectsEvaluated {
/**
* 1、解决编译失败问题
*/
getTasks().configureEach {
/**
* compileDebugAndroidTestJavaWithJavac
* compileDebugJavaWithJavac
* compileDebugUnitTestJavaWithJavac
* compileReleaseJavaWithJavac
* compileReleaseUnitTestJavaWithJavac
*/
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())
}
/**
* 2、以下内容不添加不影响编译,但是在代码中会存在方法调用报红现象,同样也就没有代码提示功能,要想实现方法调用不
* 报红,需添加compileOnly files('libs/framework.jar')到对应模块dependencies中,并且在当前文件当前
* 位置下方添加以下内容
*/
//为什么是prepareKotlinBuildScriptModel任务而不是网上其他版本的preBuild任务,因为执行Sync Now操作就是执
//行prepareKotlinBuildScriptModel任务,在Build小锤子日志窗口中有显示,而preBuild基本上要手动去执行,所
//以这里用其代替preBuild任务,如果Sync Now还是有报红,手动打开xxx.app.main.iml然后再关闭应该就可以了
prepareKotlinBuildScriptModel {
doLast(new Action<Task>() {
@Override
void execute(Task task) {
println('开始执行xxx.app.main.iml依赖重排序逻辑')
//在【File | Settings | Build, Execution, Deployment | Build Tools | Gradle】位置
//勾选generate *.iml files for modules imported from Gradle选项,如不这样操作项目中将
//不会生成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()
//删除带jdk属性的orderEntry节点
def jdkNode = (root.getElementsByTagName('orderEntry').item(0) as Element)
if (jdkNode.getAttribute('type') != 'jdk') {
println('首个orderEntry不是jdk,不用重新排序')
return
}
def parentNode = jdkNode.getParentNode()
//移除第一个jdk节点
parentNode.removeChild(jdkNode)
//将jdk节点添加到最后
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" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏