Android Studio IDE 導入系統framework.jar包方案
Eclipse app 開發中需要使用到 framework.jar ,引入方法很簡單;但目前趨勢 App 開發都轉入Android Studio IDE 開發, AS IDE 對引入 framework.jar 方法角復雜,記錄導入不打包的第三方 jar 包方案,本文已 classes-full-debug.jar 作為測試jar包;
1. classes-full-debug.jar copy 到 /libs 目錄中;
2. AS IDE 引入 classes-full-debug 包
AS Module 右鍵 classes-full-debug.jar --> Add as Library --> 選擇需要引入jar包Module,當前 Model build.gralde 增加了剛引入jar包
compile files('libs/classes-full-debug.jar')
3. 改變classes-full-debug.jar作用域屬性
Module --> Open Module Setting --> Dependencies --> libs/ classes-full-debug.jar --> 屬性改為Provided ;
Model build.gralde文件更新:
provided files('libs/classes-full-debug.jar')
4. 修改 classes-full-debug.jar 相對于Android.jar 優先級
project 中 build.gradle 增加如下代碼:
allprojects {
repositories {
jcenter()
}
//添加以下代碼,使classes-full-debug.jar包編譯先于android.jar
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:setting\\libs\\classes-full-debug.jar')
}
}
}
完成上述流程后,系統部分API仍然會顯示紅色,且無法跳轉到定義處,給開發帶來諸多不便,傳統解決方案 Module.iml 中手動修改jar包引入順序,android.jar 包手動放置最后;

image_1avveruh812d4vso129e1a6tq909.png-79.8kB
但每次項目同步后,android.jar 優先級高于framework.jar,也是比較郁悶的一件事情。
痛點解決方案:
內部分享中,同事分享了一個新的解決方案,無需手動調整jar 包優先級,在build.gradle 中添加如下代碼,實現自動調整
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': "Android API 25 Platform", 'jdkType': 'Android SDK'])
groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
} catch (FileNotFoundException e) {
// nop, iml not found
}
}
}
注意事項:“Android API 25 Platform”替換為編譯所使用的Android SDK版本