1. 程式人生 > >Android Studio 編寫系統APP

Android Studio 編寫系統APP

現狀
現在Android Studio正在變得越來越流行,幾乎所有的APP開發者都開始使用Android Studio, 那我們如何才能夠在AS裡呼叫自己的framework.jar而不是SDK裡的呢。

問題
當我們需要寫一些系統內建的APP時,比如Launcher, Setting之類的,它們經常會使用到一些隱藏的API,而這些API在SDK裡是找不到的,或者使用一些我們自己ROM裡編寫的介面,這時候我們就需要引用我們自己的framework.jar, 否則Android Studio裡是編譯不過的。

方案
下面就來介紹一下如何在AS裡引用自己的framework.jar編寫一個系統APK:

  1. 正確找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

  2. 拷貝libs資料夾下,並修改名字

    將classes.jar拷到/projectpath/app/libs/下,並重命名為framework.jar

  3. 在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檔案裡仍然會提示語法錯誤,這個暫時還沒有找到解決辦法