AndroidStudio中使用自己编译的framewokr jar包编译

背景:
在主机厂或者有Android系统源码,通常会改framework下的代码,比如隐藏接口要开放或者新增一些api等,但因为AS中使用的是标准的api jar,在AS工程编译时会出现找不到函数实现等问题。
解决方案:将编译出来的framework jar包放在AS工程中,配置编译优先级
操作步骤:
1.拷贝源码编译出来的framewokr的jar包到AS工程里
在AS工程app目录下新建libs_provided文件夹,将源码编译生成目录out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar,拷贝到libs_provided目录下,同时不妨重命名为framework.jar

2.将自己编译出来的framework.jar加入编译
2.1选中framewokr.jar右键-->添加为lib


图片1.png

2.2修改工程依赖,将framework.jar配置为仅参与编译的方式
点击工具栏“File”-->Project Structure


图片2.png

选择Dependencies Tab将framework.jar配置为Compile only
图片3.png

3.修改build.gradle(Project)
3.1添加os判断函数
def isWindows() {
return System.properties['os.name'].contains('windows')
}


图片4.png

3.2 allprojects节点下添加如下代码
gradle.projectsEvaluated {
//兼容不同os路径配置
if (isWindows()){
//方式1
tasks.withType(JavaCompile){
options.compilerArgs.add('-Xbootclasspath/p:app\lib_provided\framework.jar')
}
}else{
tasks.withType(JavaCompile){
options.compilerArgs.add('-Xbootclasspath/p:app/lib_provided/framework.jar')
}
}
//方式2
// tasks.withType(JavaCompile) {
// options.compilerArgs << '-Xbootclasspath/p:app/lib_provided/framework.jar'
// }
}


图片5.png

4.修改jar优先级(先于jdk/sdk)

preBuild {
doLast {
def imlFile = file(project.name + ".iml")
println('Change ' + project.name + '.iml order')
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 " + android.compileSdkVersion.substring("android-".length()) + " Platform"
new groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
} catch (FileNotFoundException e) {
// nop, iml not found
}
}


补充:
gradle中判断os
1.导包
import org.apache.tools.ant.taskdefs.condition.Os
2.定义os函数
def osFamily() {
if (Os.isFamily(Os.FAMILY_MAC)) return 'mac'
if (Os.isFamily(Os.FAMILY_UNIX)) return 'linux'
if (Os.isFamily(Os.FAMILY_WINDOWS)) return 'windows'
return null
}
3.判断
osFamily() == 'windows'

参考文章:

1.Android Studio 优先源码编译的framework.jar(android.jar)

<u>https://blog.csdn.net/lei1217/article/details/71627916</u>

2.Android Studio中解决framwork.jar和SDK api冲突的方法

<u>https://blog.csdn.net/zhiwenwei/article/details/80592734</u>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容