Android Studio 編寫系統APP
阿新 • • 發佈:2018-11-09
現狀
現在Android Studio正在變得越來越流行,幾乎所有的APP開發者都開始使用Android Studio, 那我們如何才能夠在AS裡呼叫自己的framework.jar而不是SDK裡的呢。
問題
當我們需要寫一些系統內建的APP時,比如Launcher, Setting之類的,它們經常會使用到一些隱藏的API,而這些API在SDK裡是找不到的,或者使用一些我們自己ROM裡編寫的介面,這時候我們就需要引用我們自己的framework.jar, 否則Android Studio裡是編譯不過的。
方案
下面就來介紹一下如何在AS裡引用自己的framework.jar編寫一個系統APK:
正確找framework.jar
在原始碼的out目錄下找到我們自己的framework.jar, 它在
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
特別要注意的是,並不是
out/target/product/your_target/system/framework/framework.jar
第一個是完整的java library, 而第二個jar包更像是SDK裡的framework.jar拷貝libs資料夾下,並修改名字
將classes.jar拷到/projectpath/app/libs/下,並重命名為framework.jar
在android studio工程下的build.gradle修改成如下
注意重點新增
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
provided files('libs/framework.jar')//重點新增 provided表示只引用,而不編譯到APK裡去
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support' , module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
testCompile 'junit:junit:4.12'
}
//gradle打包時,也需要指定我們自己的framework.jar的位置
//重點start新增
allprojects {
repositories {
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xbootclasspath/p:app/libs/framework.jar'
}
}
}
//重點end新增
4.修改顯示語法錯誤
完成上面這些之後,使用gradle編譯的apk使用的就是我們自己的framework.jar裡的API。但是這裡還有一個小問題,就是你會發現如果程式碼裡呼叫我們自己新增的API介面時,AS裡提示沒有這個介面,會顯示這裡有語法錯誤。但是事實上,gradle編譯的時候確實可以編譯通過,並生成可以執行的APK。 這是因為Android Studio裡永遠會將SDK作為第一個語法解析的jar包。我們可以將/projectpath/app/app.iml裡下面的
<orderEntry type="jdk"jdkName="Android API 23 Platform"jdkType="Android SDK"/>
放到最後去,也就是在我們自己的framework.jar之後。然後Android Studio就不會有語法錯誤提示了。
注意,這樣修改之後,只有java檔案不會提示語法錯誤,kotlin檔案裡仍然會提示語法錯誤,這個暫時還沒有找到解決辦法