我是怎么一步步將SystemUI導入到AndroidStudio的


這篇文件可能是你看過的寫的最詳細的關於SystemUI如何導入AS的文章了~

下面要講的,是我如果一步步將SystemUI導入到AndroidStudio的。

(備注:本文所講內容的開發環境  ->   Android版本9.0  AndroidStudio 3.4   gradle插件版本 3.5)

修改系統相關模塊的代碼,如果是小的修改還好,如果是需要改動比較多,那能將源碼導入到AndroidStudio來修改是最好不過的了,修改效率會提高很多。

這篇文件針對下面幾點展開:

   一、下載SystemUI源碼;

   二、將SystemUI代碼導入Eclipse,在Eclipse中導出工程gradle文件;

   三、將SystemUI代碼導入AndroidStudio;

   四、導入過程遇到的問題及解決;

講述重點會放在第四部分,遇到的問題及解決。

一、下載SystemUI源碼

SystemUI的代碼,直接在Android源碼中下載到本地來即可,在framewrok/bace/packages/目錄下。

二、將SystemUI代碼導入Eclipse,在Eclipse中導出工程gradle文件

我們的終極目標是把SystemUI的代碼導入到AndroidStudio,之所以先把工程導入到Eclipse,是借助eclipse幫我們生成工程需要的gradle文件,AndroidStudio的工程是依靠gradle來構建,有了這個gradle文件,下一步就可以導入AndroidStudio了。

導出gradle文件也很簡單,選擇我們的工程,右擊,選擇Export,選擇Generate Gralde build files,然后一直next即可。

三、將SystemUI代碼導入AndroidStudio

有了上面第二部分的導出的gralde文件,就可以打開AndroidStuido,找到工程目錄,導入工程即可。

導入工程后,會有報錯,那肯定是正常的,不然就不會有第四部分的內容了。這里注意下gradle的版本,eclipse中導出的gradle版本可能會是比較舊的,這個需要根據自己的需要和提示的錯誤修改下。我是把gradle插件版本修改成了3.5.0

導入到AndroidStuido后的工程目錄結構

四、導入過程遇到的問題及解決

將Android源碼模塊的代碼導入到AndroidStudio之所以麻煩,就是源碼模塊的代碼可能會涉及到引用的相關資源比較多,所謂的資源,就是jar或者系統其它的一些類。

1)查看Android.mk涉及用到哪些資源

源碼的編譯,是依靠.mk來進行編譯,查看Android.mk,能幫我們大致了解下這個項目會用到哪些外部資源。

  LOCAL_STATIC_ANDROID_LIBRARIES 里面的,就是需要打包編譯進apk的jar包

 ----------------
    LOCAL_STATIC_ANDROID_LIBRARIES := \
    SystemUIPluginLib \
    SystemUISharedLib \
    android-support-car \
    android-support-v4 \
    android-support-v7-recyclerview \
    android-support-v7-preference \
    android-support-v7-appcompat \
    android-support-v7-mediarouter \
    android-support-v7-palette \
    android-support-v14-preference \
    android-support-v17-leanback \
    android-slices-core \
    android-slices-view \
    android-slices-builders \
    android-arch-core-runtime \
    android-arch-lifecycle-extensions \
LOCAL_JAVA_LIBRARIES  里面的jar,是只在編譯的時候引用即可,不需要打包進apk,這些jar是系統本身的jar
-----------------

LOCAL_JAVA_LIBRARIES := telephony-ext \
    telephony-common \
    android.car \
    ims-common

2) 將需要的jar包導入到工程

查看了Android.mk的內容,我們接下來就需要把相關的jar包導入到工程。好了,那這些jar包如何找呢。

從Android.mk的內容我們看到,有2類jar包,一類是需要打包進apk的,一類是只需要編譯階段引用的。那我們找包的時候,也分2種情況來。

LOCAL_STATIC_ANDROID_LIBRARIES 里面引用到的jar,可以在這個路徑下找到對應的jar包:

這里列出的是androidx.annotation_annotation.jar的路徑,
其它jar包也是類似方式查找,在./out/soong/.intermediates/prebuilts/sdk/current目錄下

./out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.annotation_annotation/
android_common/turbine-combined/androidx.annotation_annotation.jar

LOCAL_JAVA_LIBRARIES  里面引用到的jar,是在out/target/project/......./system/framework/目錄下可以找到。

3) 問題:導入的不同jar包,包含了相同的內容

通過上面的方式找到的jar,發現有個問題,就是不同的jar包,基本都包含了相同的內容。編譯的時候會報Duplicate class 的錯誤。

從下面這張圖,我們可以看到,導入的3個不同的jar,都包含了相同的android.arch.、android.support.等等這些類,這個就導致編譯直接報類重復了。
​​300
這個問題,在網上找了很多的解決方法,基本都是說導入jar包的時候,采用exclude字段,把重復的group或者module移除掉,不過我試的時候,直接提示gradle DSL 沒有exclude。

我一直覺的可能是我找的jar包不對,不應該都包含有相同內容的,如果有知道原因的,可以和我說下,非常感謝!

4)修改jar包,將jar包重復內容刪除,再重新生成jar包

后面是沒其它頭緒了,就試着把jar包重復的內容刪除,再重新合成jar包。

具體做法就是,把jar包后綴修改成zip,然后解壓,刪除重復的內容(這里刪除內容,我只是刪除了相關的重復類,本來的META-INF文件夾沒有動)后,再通過jar cvf 命令,重新生成jar。

這個過程,就是不停的刪除重復內容,然后再導出,再編譯。

5)問題: More than one file was found異常

編譯的時候,還遇到了下面的問題,說是META-INF/*** 內容有多個地方都有, 這個問題,我覺得的可能和上面第4點的內容有關, 刪除重復包的時候,我還是保留原來的META-INF文件夾沒有動。

More than one file was found with OS independent path
 'META-INF/androidx.legacy_legacy-support-core-ui.version'

這個問題可以通過添加 packagingOptions {...}來進行解決,在工程的build.gradle 文件中添加,下面就是我添加的,提示那個有多的,就加下。

android {

    compileSdkVersion 28

    defaultConfig {
        applicationId "com.android.systemui"
        minSdkVersion 28
        targetSdkVersion 28
        versionCode 29
    }

    packagingOptions {
        exclude 'META-INF/androidx.mediarouter_mediarouter.version'
        exclude 'META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version'
        exclude 'META-INF/androidx.lifecycle_lifecycle-livedata-core.version'
        exclude 'META-INF/androidx.appcompat_appcompat.version'
        exclude 'META-INF/androidx.swiperefreshlayout_swiperefreshlayout.version'
        exclude 'META-INF/androidx.cursoradapter_cursoradapter.version'
        exclude 'META-INF/androidx.media_media.version'
        exclude 'META-INF/androidx.drawerlayout_drawerlayout.version'
        exclude 'META-INF/androidx.print_print.version'
        exclude 'META-INF/androidx.versionedparcelable_versionedparcelable.version'
        exclude 'META-INF/androidx.interpolator_interpolator.version'
        exclude 'META-INF/androidx.palette_palette.version'
        exclude 'META-INF/androidx.fragment_fragment.version'
        exclude 'META-INF/androidx.customview_customview.version'
        exclude 'META-INF/androidx.documentfile_documentfile.version'
        exclude 'META-INF/androidx.vectordrawable_vectordrawable.version'
        exclude 'META-INF/androidx.legacy_legacy-support-core-utils.version'
        exclude 'META-INF/androidx.loader_loader.version'
        exclude 'META-INF/androidx.lifecycle_lifecycle-runtime.version'
        exclude 'META-INF/androidx.viewpager_viewpager.version'
        exclude 'META-INF/androidx.asynclayoutinflater_asynclayoutinflater.version'
        exclude 'META-INF/androidx.lifecycle_lifecycle-viewmodel.version'
        exclude 'META-INF/androidx.recyclerview_recyclerview.version'
        exclude 'META-INF/androidx.core_core.version'
        exclude 'META-INF/androidx.arch.core_core-runtime.version'
        exclude 'META-INF/androidx.vectordrawable_vectordrawable-animated.version'
        exclude 'META-INF/androidx.slidingpanelayout_slidingpanelayout.version'
        exclude 'META-INF/androidx.slice_slice-core.version'
        exclude 'META-INF/androidx.coordinatorlayout_coordinatorlayout.version'
        exclude 'META-INF/androidx.legacy_legacy-support-core-ui.version'
    }
}

6) 問題:Duplicate class,support包合androidx包引用有沖突
 錯誤提示:

Duplicate class android.support.v4.app.INotificationSideChannel found 
in modules android-arch-lifecycle-extensions.jar 
(android-arch-lifecycle-extensions.jar) and classes.jar (androidx.core:core:1.1.0-beta01)

解決方法: 在gradle.properties中添加啟用androidx支持,gradle.proerties文件本來是沒有的,沒有的話,就自己創建個

android.useAndroidX=true

7) 問題:adb push apk進入,重啟,提示權限錯誤

android.view.InflateException: Binary XML file line #87:
 uid=10014 needs permission android.permission.READ_CONTACTS
 to read lock_screen_owner_info_enabled for user 0

錯誤提示,需要android.permission.READ_CONTACTS 權限,這個權限在manifest中是有申請的了。后面參考了https://blog.csdn.net/grindstone_fos/article/details/53924295 提供的方法解決了。

方法就是:執行adb命名,給與相應權限。我是遇到有2個權限需要通過下面方式來執行下才行。

adb shell pm grant "com.android.systemui" "android.permission.READ_CONTACTS"
         adb shell pm grant "com.android.systemui" "android.permission.READ_EXTERNAL_STORAGE"

8)問題: 提示資源找不到

好不容易解決了上面的一堆的問題,下面是接着報了個資源找不到的問題。這個沒查到是啥原因,后面是把調用到的代碼暫時屏蔽了。

	Line 1145: 12-28 14:27:52.209 E/AndroidRuntime( 2422): FATAL EXCEPTION: main
	Line 1146: 12-28 14:27:52.209 E/AndroidRuntime( 2422): Process: com.android.systemui, PID: 2422
	Line 1147: 12-28 14:27:52.209 E/AndroidRuntime( 2422): android.content.res.Resources$NotFoundException: Resource ID #0x0
	Line 1148: 12-28 14:27:52.209 E/AndroidRuntime( 2422): 	at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:216)
	Line 1149: 12-28 14:27:52.209 E/AndroidRuntime( 2422): 	at android.content.res.Resources.getDimensionPixelSize(Resources.java:727)
	Line 1150: 12-28 14:27:52.209 E/AndroidRuntime( 2422): 	at androidx.slice.widget.ListContent.<init>(ListContent.java:103)
	Line 1151: 12-28 14:27:52.209 E/AndroidRuntime( 2422): 	at androidx.slice.widget.ListContent.<init>(ListContent.java:88)
	Line 1152: 12-28 14:27:52.209 E/AndroidRuntime( 2422): 	at com.android.keyguard.KeyguardSliceView.showSlice(KeyguardSliceView.java:161)
	Line 1153: 12-28 14:27:52.209 E/AndroidRuntime( 2422): 	at com.android.keyguard.KeyguardSliceView.onChanged(KeyguardSliceView.java:343)

9)問題:AndroidRunTime 空指針異常

OverviewProxyService.java 中報了個空指針異常,獲取到的 mRecentsComponentName 為空,也就是通過mContext.getString(com.android.internal.R.string.config_recentsComponentName)沒法獲取到對應的資源,后面是直接改成將string的內容寫進去了。

寫在后面

導這個工程花了比較多的時間,還好沒有放棄~~

------- 2020.02.04   21:31 立春

=======================================================================

*本人從事Android Camera相關開發已有5年,
*目前在深圳上班,
*小伙伴記得點我頭像關注,也可以關注我的微信公眾號【小馳筆記】,希望和更多的小伙伴一起交流 ~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM