前言
前段時間負(fù)責(zé)了一個系統(tǒng)設(shè)置的項目,里面用到了大量的系統(tǒng)隱藏方法,所以自己用Eclipse打了一個系統(tǒng)jar包,但是導(dǎo)入到Android studio的時候,中間踩了很多坑,現(xiàn)在總結(jié)一下,防止大家踩坑。
正文
按照下面步驟一步一步來,基本不會出現(xiàn)大問題。
1、將系統(tǒng)jar包放到module的libs文件夾下

2、在Module下的build.gradle添加
provided files('libs/android_framework.jar')
注意
provided作用是只在編譯時使用,最終不會打包到Apk中
更新 :在Android studio3.0后,provided被compileOnly替代
3、在Project下的build.gradle文件中添加
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app/libs/android_framework.jar')
}
}
app/libs/android_framework.jar 為jar包路徑,app為Module名
注意:gradle.projectsEvaluated是放在allprojects標(biāo)簽內(nèi)。

這個時候基本就算大功告成了,但是,你會發(fā)現(xiàn),使用系統(tǒng)隱藏方法的地方還是會爆紅,那是因為Android Studio在編譯時優(yōu)先使用系統(tǒng)的Sdk。

解決辦法:
找到Module下的.iml文件,在里面將你導(dǎo)入的jar包放在sdk之前,這樣Android studio編譯時優(yōu)先使用導(dǎo)入的系統(tǒng)jar而不是sdk中的。

通過代碼改變,在module的build.gradle中最后添加如下代碼重新編譯后,會發(fā)現(xiàn)順序變化
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 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
}
}
}
最終,Android studio在編譯時優(yōu)先使用導(dǎo)入的jar包,什么系統(tǒng)隱藏方法啥的,使用起來暢通無阻!!
