背景:
在主机厂或者有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
2.2修改工程依赖,将framework.jar配置为仅参与编译的方式
点击工具栏“File”-->Project Structure
选择Dependencies Tab将framework.jar配置为Compile only
3.修改build.gradle(Project)
3.1添加os判断函数
def isWindows() {
return System.properties['os.name'].contains('windows')
}
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'
// }
}
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>