开发过程中遇到,要调用系统@hide的方法,这个要使用framework.jar
第一步:保证framework.jar 的版本匹配
第二步:把jar包放到libs文件下,并add to library,这个时候在build.gradle文件里看到
dependencies {
.....
implementation files('libs/framework.jar')
}
要把它改成
dependencies {
.....
provided files('libs/framework.jar')
}
这样个provided 的作用是我们只需要编译成功,不需要把这个包打到apk中。
第三步:修改项目根目录下的build.gradle
allprojects {
repositories {
jcenter()
google()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xbootclasspath/p:app/libs/framework.jar'
}
}
}
放到allprojects中是要作用到所有的子模块上,tasks.withType(JavaCompile) 是在 javac 的 task 中加入一个参数,就是在 Xbootclasspath 增加自己的 jar 包
第四步:更改jar包编译顺序优先于android.jar
dependencies {
....
provided files('libs/framework.jar')
}
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
}
}
}
这个时候有可能还会遇到这个错误
Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
解决办法
在项目上右键,选择"Open Module Setting" ,点击“Dependences”,看到
{include=[*.jar], dir=libs},remove掉,应该就OK了