本文來自粉絲(公號:tmac_lover,武漢風行在線framework開發)投稿。有興趣的可以關注他。
之前我們工作中都是使用Eclipse來編寫system app, 因為Eclipse能夠很方便的引用我們自己ROM的framework.jar。而現在Android Studio正在變得越來越流行,幾乎所有的APP開發者都開始使用Android Studio, 那我們如何才能夠在AS裡調用自己的framework.jar而不是SDK裡的呢。
當我們需要寫一些系統內置的APP時,比如Launcher, Setting之類的,它們經常會使用到一些隱藏的API,而這些API在SDK裡是找不到的,或者使用一些我們自己ROM裡編寫的接口,這時候我們就需要引用我們自己的framework.jar, 否則Android Studio裡是編譯不過的。
下面就來介紹一下如何在AS裡引用自己的framework.jar編寫一個系統APK:
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
將classes.jar拷到/projectpath/app/libs/下,並重命名為framework.jar
像在Ecplise裡的extended library一樣引用framework.jar, 在/projectpath/app/build.gradle的dependencies添加
dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) ... ... testCompile 'junit:junit:4.12' provided files('libs/framework.jar') }
gradle打包時,也需要指定我們自己的framework.jar的位置,在/projectpath/app/build.gradle的buildscript裡添加
gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar') } }
注意,這裡app目錄是一個AS工程的一個module
完成上面這些之後,使用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文件裡仍然會提示語法錯誤,這個暫時還沒有找到解決辦法
公號介紹
悅己之作,方能悅人。韋東山品牌資訊發聲地,幫助您更快入門嵌入式Linux。