前言:最近遇到一個問題,就是公司做自己的rom,對framwork有改動,添加了自己的api,那么問題來了,我們開發(fā)的階段使用的是android原生的環(huán)境,所以不可能調用得到自己定義的api,或者我們開發(fā)的是系統(tǒng)應用,需要調用SDK中的隱藏API方法,那么為了在Android Studio上編譯通過,我們只能把framwork.jar單獨引進來。
Adnroid Studio 使用SDK隱藏API的方法:
編譯 Android 源碼
找到 \out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar 文件,拷貝出來,重命令 framework.jar。
拷貝 framework.jar,放到 android studio 工程 app/libs 目錄下。
修改android studio工程根目錄的 build.gradle 文件,在 allprojects (沒有的自己添加)下添加如下配置:
這個主要控制應用中調用的是android.jar的類還是我們加入的framework.jar,提升jar調用優(yōu)先級
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
}
}
}
另外一種改法是修改model下面的iml文件,把sdk移到最后,這樣studio就會優(yōu)先使用我們自己的framework.jar;
- 修改android studio工程目錄 app/build.gradle文件,dependencies 中添加 framework.jar。
dependencies {
implementation provided files('libs/framework.jar')
// Android Studio 3.0 之前使用 compile files('libs/framework.jar')
}
- 同理添加其他報錯API的jar包,例如 core.jar
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar;app/libs/core.jar')
}
}
}
dependencies {
implementation provided files('libs/framework.jar')
implementation provided files('libs/core.jar')
// Android Studio 3.0 之前使用 compile files('libs/framework.jar')
// Android Studio 3.0 之前使用 compile files('libs/core.jar')
}
此方案驗證成功。
但是新的問題又來了,framwork.jar非常大,而且在rom里面已經有了,所以打包的時候就沒有必要帶上這個jar了,那么如何在Android studio下設置讓項目打包的時候能編譯通過,但是jar又不會編譯到apk里面呢?
只需要將build.gradle 文件中對應的implementation改為compileOnly就可以了。
dependencies {
// Android Studio 3.0 之前使用 provided files('libs/framework.jar')
compileOnly files('libs/framework.jar')
}
(方法二調用SDK隱藏API方法:我自己驗證失敗報java常量池行數錯誤,這里貼一下:
1、同上考出framework.jar;
2、使用 Android SDK Manager 下載SDK,拷貝出SDK目錄的 android.jar。
3、使用 Beyond Compare 工具比較二者,將 framework.jar 中的同名文件拷貝到 android.jar 中進行覆蓋。
4、使用 新合成的 android.jar 替換原SDK目錄的 android.jar。
5、如果還有其他API報錯,也可用同樣方法,在 \out\target\common\obj\JAVA_LIBRARIES 目錄找到報錯API的jar包,合成進 android.jar。
有關常量池的資料:)。