Android Studio Giraffe引用framework.jar方法
1 单独模块引用framework.jar配置方法
1.1 添加测试代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//自编译framework.jar测试代码
float aaa = AdaptiveIconDrawable.MASK_SIZE;
int bbb = WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
Log.e(TAG, "onCreate: " + aaa + " " + bbb);//onCreate: 100.0 2019
}
}
1.2 配置生成*.iml文件
在File >> Settings >> Build… >> Build Tools >> Gradle 中勾选generate *.iml,否则项目中将没有My_Application.app.main.iml这个文件
1.3 将framework.jar放入app/libs中
1.4 build.gradle(:app)中添加framwork.jar依赖
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的测试代码将不再报红
----------------------------我是分割线----------------------------
2023-11-15 更新
上次更新的是单独模块引用framework.jar的配置方法,今天带来的是全局所有模块引用framework.jar的配置方法
2 全局模块引用framework.jar配置方法
2.1 同上
2.2 同上
2.3 将framework.jar放入项目根目录下的libs中
2.4 build.gradle(:app)中添加framwork.jar依赖
dependencies {
compileOnly files("../libs/framework.jar")
}
2.5 修改项目级build.gradle文件
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将可正常调用并且不会报红,测试结果如下图所示:
----------------------------我是分割线----------------------------
2024-01-20 更新
上述使用的framework.jar一定是从以下路径获得,否则可能无法在android studio中编译通过,并且正常运行,android 12 版本
out\target\common\obj\JAVA_LIBRARIES\framework-minus-apex_intermediates\classes.jar
----------------------------我是分割线----------------------------
2024-12-26 更新
测试Android Studio版本为–>Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1
app/build.gradle
dependencies {
//必须添加
compileOnly files('libs/framework.jar')
implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout
}
build.gradle
//测试的AS版本【Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1】
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依赖重排序完成')
}
})
}
}
}
----------------------------我是分割线----------------------------
2025-03-08 更新
测试Android Studio版本为–>Android Studio Meerkat | 2024.3.1
Java环境:Android Studio自带JDK21
MainActivity测试代码
import android.graphics.drawable.AdaptiveIconDrawable;
import android.view.WindowManager;
float aaa = AdaptiveIconDrawable.MASK_SIZE;
int bbb = WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
Log.e("liyiwei", "onCreate: " + aaa + " " + bbb);
app/build.gradle
dependencies {
compileOnly files('libs/framework.jar')
}
在【File | Settings | Build, Execution, Deployment | Build Tools | Gradle】位置勾选generate *.iml files for modules imported from Gradle选项,如不这样操作项目中将不会生成xxx.app.main.iml这个文件
build.gradle
import org.w3c.dom.Element
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerFactory;
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) {
def imlFilePath = String.format("%1s/.idea/modules/app/%2s.app.main.iml"
, rootProject.rootDir
, rootProject.name.replace(' ', '_'))
if (!new File(imlFilePath).exists()) {
throw new FileNotFoundException('【' + imlFilePath + '】不存在')
}
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') {
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)))
}
})
}
}
}
部分内容参考自:https://blog.youkuaiyun.com/u014175785/article/details/116235760
测试用Android 14源码编译framework.jar下载链接:
https://download.youkuaiyun.com/download/lmjssjj/89107722
https://download.youkuaiyun.com/download/weixin_46297800/88104543
如果这篇文章有帮助到你,欢迎打赏支持我的创作。