天天看點

AOSP源碼Gallery2和Launcher3導入Android Studio

本文适用于有一定Android源碼編譯能力的開發者,對AOSP沒有什麼概念的同學可以參考涅槃1992發表的文章:自己動手編譯Android源碼(超詳細),正如作者所說,超詳細,也很簡單.

引入

我之前一直從事App開發,換工作後公司正在研發一款類似百度小度的帶屏智能硬體,是以需要定制Android系統.花了一個月熟悉Linux開發環境和Android8.1的源碼結構後,我接下了相冊Gallery2和桌面Launcher3的定制工作.AOSP中Gallery2和Launcher3的源碼結構和普通App開發目錄結構并不一樣,直接導入到Android Studio中并不能運作,隻能當做一個文檔檢視器.網上也有文章講到可以先将源碼導入Eclipse再導入Android Studio的這種曲線救國的方法,但是,Eclipse ? excuse me ? 下面就拿Gallery2作例子,步步講解怎樣将Android Gallery2源碼導入Android Studio中并一鍵運作起來.

環境

AOSP版本:Android 8.1

Ubuntu版本:18.04.1 LTS

流程

将AOSP源碼中的Gallery2直接導入到Android Studio中的目錄結構如下,這顯然不是普通App開發的目錄結構.

AOSP源碼Gallery2和Launcher3導入Android Studio

圖1

建立一個Gallery2_blog工程,包名和原生Gallery2一樣都是com.android.gallery3d,工程位址就用/home/majiheng/majh/workspace/Gallery2_blog,最低api我設定成了21也就是Android L系統,然後一路next就行了,如下圖所示:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖2

下面才是普通App開發的目錄結構:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖3

回過頭看"圖1",其中gallerycommon,src,src_pd這三個檔案夾下是所有Gallery2所涉及到的源碼,我不太明白谷歌的工程師為什麼這樣組織結構,有明白的同學可以留言或私信我.jni,jni_jpegstream是Gallery2用到的所有so檔案的源代碼,也就是說這些檔案你是可以修改的,然後再打包成.so檔案,當然這兩個檔案夾暫時忽略,因為這裡沒有涉及到修改c檔案的需求.res檔案夾包含了Gallery2所有的資源檔案例如圖檔和布局.AndroidManifest.xml不用管,裡面内容暫時不需要修改.

先把gallerycommon,src,src_pd這三個檔案夾中的所有檔案按照包名com.android.gallery3d結構複制到新建立的Gallery2_blog工程中,同時将清單檔案AndroidManifest.xml裡的内容也無損複制過來,結果如下:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖4

接下來把res檔案夾裡的資源全部拷貝到Gallery2_blog工程中來,可以看到,原生相冊Gallery2基本适配了市面上所有的Android裝置,是以各種版本的drawable,layout,mipmap,values很多,由于圖檔太長,部分截圖如下:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖5

由于相冊Gallery2涉及到mp4和gif的播放,是以需要引入.so和.jar檔案,那到底該引入哪些呢?先說.so檔案,到編譯過的AOSP源碼中out/target/product/generic/system/app/Gallery2/lib/arm64目錄下檢視,可以看到3個.so檔案分别是:libjni_eglfence.so,libjni_filtershow_filters.so和libjni_jpegstream.so.但千萬要注意的是:這3個檔案并不是真正的檔案,而是軟連接配接!在該目錄下打開指令視窗輸入ll指令後如下:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖6

實際上這3個真正的.so檔案在目錄out/target/product/generic/system/libs中,将這3個.so檔案複制到Gallery2_blog中的src/jniLibs/armeabi-v7a目錄中,如下圖所示:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖7

先不說需要哪些.jar包,我們先試着運作下,看看報什麼錯.第一個錯誤如下:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖8

實際上還有一大堆錯誤和上面一樣,都是某個在Strings.xml檔案中定義的字元串出現了兩次,并且這些字元串都沒有被使用,這裡為了簡便,把除了中英文所有國際化的values檔案夾都删除了,然後再次試着運作,出現如下錯誤:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖9

出現以上錯誤說明編譯器提醒沒有導入相應的jar包,錯誤詳情如下幾張圖所示:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖10

AOSP源碼Gallery2和Launcher3導入Android Studio

圖11

AOSP源碼Gallery2和Launcher3導入Android Studio

圖12

AOSP源碼Gallery2和Launcher3導入Android Studio

圖13

AOSP源碼Gallery2和Launcher3導入Android Studio

圖14

從上面的錯誤可以總結出來缺少了junit,xmp,mp4parser,apache,v13總共5個jar包,這5個jar包怎麼找?網友可能會說:這個簡單,在gradle裡面直接配置下載下傳就行,這個也可以,不過還可以在AOSP源碼裡面找,具體路徑是out/target/common/obj/JAVA_LIBRARIES,直接在該目錄下搜尋junit,xmp,mp4parser,apache,v13就可以找到相應的檔案夾,比方說搜尋junit,搜尋結果是junit_intermediates檔案夾下的classes.jar.然後把這5個jar包全部放到Gallery2_blog工程下的libs檔案夾中,記得右鍵Add As Library...

試着再次運作,出現如下錯誤:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖15

上述錯誤定位到清單檔案AndroidManifest.xml檔案,無法識别如下兩個授權資訊,可以暫時将這兩個授權注釋掉,具體為什麼會出現這兩個授權資訊,在Android中的權限管理(基于Permission ProtectionLevel)一文中有詳細講解:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖16

再次試着運作一下,出現如下一堆類似錯誤(此時感覺錯誤綿綿不絕):

AOSP源碼Gallery2和Launcher3導入Android Studio

圖17

點進去一個檔案進行檢視,發現裡面的ScriptC_convolve3x3這個類并沒有生成,如下圖所示:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖18

轉到app/build/generated/res/rs和app/build/generated/source/rs目錄下,可以看到這兩個目錄下并沒有生成想對應的native代碼,如下圖所示:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖19

正确生成rs的話,截圖應該如下:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖20

怎樣生成rs?先在src/main目錄下建立一個rs檔案夾,然後到/src/main/java/com/android/gallery3d/filtershow/filters目錄下拷貝字尾為.rs的convolve3x3.rs,grad.rs,grey.rs,saturation.rs,vignette.rs這5個檔案到剛剛建立的rs檔案夾中.然後删除app下的build檔案夾,再次試着運作出現如下錯誤(稍許崩潰中...):

AOSP源碼Gallery2和Launcher3導入Android Studio

圖21

上面這個錯誤是因為v7包和v4包出現沖突所緻,到app下的gradle中注釋掉implementation 'com.android.support:appcompat-v7:28.0.0'再次試着運作下,app正常啟動了,最後附一張Gallery2的圖檔:

AOSP源碼Gallery2和Launcher3導入Android Studio

圖22

AOSP源碼Gallery2和Launcher3導入Android Studio

圖23

最後附上項目git位址:

https://github.com/afterschoolkido/Gallery2_AOSP_AndroidStudio_Version

歡迎star & fork~

文章推薦:

5分鐘适配Android P和Android 8.0劉海屏,可能全網最全總結

Android Retrofit Http加密(無證書加密)

Android WebSocket加密

繼續閱讀