使用Android Studio 開發 SystemUI

start.

由於用sublime或沒有完整依賴的Studio來開發SystemUI非常難受,所以有了這篇分享,

目標是做到像普通應用一樣在Android Studio裏開發SystemUI,可以正常跳轉,正常依賴,正常編譯,一鍵安裝。

 

1.  將源碼放置到成正常gradle項目的結構

 

2. 將資源目錄分類存放

    sourceSets {

        main {

            res.srcDirs += "src/main/res-flyaudio"

            res.srcDirs += "src/main/res-keyguard"

        }

    }

 

3. 刪除重複定義的資源

系統源碼環境下的編譯方式和 AS 的編譯還是有區別的,系統環境下能使用PRODUCT_CHARACTERISTICS := tv來控制打包的平臺資源,而AS無法處理

<string name="keyguard_missing_sim_message" product="tablet">No SIM card in tablet.</string>
<!-- Shown when there is no SIM card. -->
<string name="keyguard_missing_sim_message" product="default">No SIM card in phone.</string>


error : Found item String/keyguard_missing_sim_message more than one time

可以用腳本僅留下product = "default" 的標籤

 

4. 由於SystemUI需要依賴settingslib和keyguard的內容,可以單獨創建library,在主模塊app中依賴

 

5. 找不到android.support.v7.preference.Preference

    implementation 'com.android.support:preference-v7:26.1.0'
    implementation 'com.android.support:preference-v14:26.1.0'

 

6. 找不到 libcore.util.TimeZoneFinder;

AS的SDK和源碼不一致,需要找到TimeZoneFinder所在的jar引用,可以在out/target/common/obj/JAVA_LIBRARIES中grep  -nr "TimeZoneFinder.class"

找到core-libart_intermediates中對應的jar引用

 

7. 找不到 com.android.internal.telephony.cdma.EriInfo

同理 找到telephony-common_intermediates中對應的jar引用

 

8. 當第三方 jar 和 AS 默認的常規 SDK 發生衝突的時候,會優先使用常規 SDK,需要提升這個 jar 的優先級

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            // 如果有多個jar需要提升優先級,用分號隔開,比如:jar/framework.jar;jar/core-all.jar;
            options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
            options.compilerArgs.add('-Xbootclasspath/p:baselib/libs/telephony.jar')
        }
    }

9. 源碼中動態編譯的jar包如framework.jar一定要使用compileOnly只在編譯的時候引用該jar

 

10. 找不到com.android.internal.R

新建internal library,將frameworks/base/core/res的部分資源拷進去,attrs_manifest.xml  public.xml symbols.xml attrs.xml等內容與AS編譯無關需要刪掉

 

end. 編譯運行

經過重重困難後終於可以在AS中正常編譯了,能夠正常編輯代碼,但是把編譯好的apk push進去還是有很多問題,所以這裏換個思路去編譯apk和安裝

 

由於我用windows的電腦連接服務器來單獨編譯模塊,所以我這邊編譯安裝的思路是本機以AS編輯代碼,通過git同步給服務器,然後mm編譯,編譯完成過後經過smb把編譯產物push到機器中,然後發送一條廣播讓應用掛掉重新加載,達到安裝的目的

 

這裏涉及的命令有點多,所以我用go把代碼同步 -> 編譯 -> 安裝的命令串成一個腳本,做到一鍵編譯安裝運行

 

 

用AS開發SystemUI的坑就排到這裏,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章