1. 程式人生 > >基於MAC Android 8.1原始碼下載編譯閱讀

基於MAC Android 8.1原始碼下載編譯閱讀

      學Android也有比較長的一段時間了,但是對於android原始碼的認識自己總感覺似懂非懂,因為自己也仔細看過相關的書籍、對於遇到過的一些問題也分析過原始碼,但還是覺得對於Android底層程式碼的實現存在一隻半解,很多時候都處於程式碼開發、遇到問題再去谷歌百度的狀態,沒有對Android有個相對細節性的系統整體認識,所以這就需要以後在學習的過程中加強原始碼閱讀和理解。基於目前大多數看原始碼都是通過http://androidxref.com/ 看的,個人感覺雖然方便查詢,但是不利於整體性閱讀,程式碼跳轉感覺特別不方便。因此參考官網和相關網上經驗,記錄下載Android原始碼遇到的問題。

一、Android原始碼下載編譯

這個過程就不仔細敘述,官網和其他經驗網上很多,在此,我就簡單列舉一些我看過的網頁,基本按照上述步驟就可以下載安裝完成:

官網:https://source.android.com/setup/

清華大學開源軟體映象站:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/  (推薦給不能翻牆的同學)

Mac 10.12編譯Android原始碼:https://www.jianshu.com/p/1513fc9e1a74

這篇文章其實跟官網的步驟差不多,但是分系列解釋,遇到的問題基本在mac上下載編譯都遇到過,所以基本完全按照這個步驟進行,但也可能遇到其所沒有遇到的問題。

Android原始碼、核心編譯:https://www.cnblogs.com/palance/p/5187103.html

上面幾篇文章可以對比看一下,步驟基本一致,如果可以儘量去官網,介紹和解釋都比較詳細。

二、遇到的問題

這部分是我要寫的主要內容,幫我記錄一下在Android原始碼、下載、編譯遇到的問題,方便以後我及其他同學遇到這些問題時能夠快速解決。

首先,先複製幾個網址,給出其他人遇到的問題的解決方法,其中都有我遇到的問題和沒有遇到的問題,針對我遇到的問題後續我會詳細列出,如果遇到的其他問題,可以參考這些網頁進行借鑑吧。

https://blog.csdn.net/it_liuchengli/article/details/77040806

https://blog.csdn.net/dengjiamingcsu/article/details/79695657

https://blog.csdn.net/yanzi1225627/article/details/69941284

https://blog.csdn.net/h649305597/article/details/80322488

https://blog.csdn.net/txl19881019/article/details/44081865

https://source.android.com/setup/

其中,具體我遇到的問題有:

1.使用行動硬碟下載編譯。

對於剛使用Mac的不久的我來講,Mac給日常開發帶來很好的體驗,然後其硬碟儲存空間相對比較小,因此不忍心將原始碼下載到本地硬碟中,因此準備採用行動硬碟進行擴充套件,將原始碼下載進去。在此過程中遇到兩個問題:

(1)使用的行動硬碟是NFTS格式,所以對於Mac來講只能讀取, 不能寫入,後來在網上找到一個免費軟體Mounty,參考網頁:https://jingyan.baidu.com/article/a3aad71aa1dde7b1fb0096ab.html

(2)解決了行動硬碟在Mac上寫入問題之後,根據官網下載步驟說明支出,因為Mac預設檔案系統是不區分大小寫的,因此需要建立一個檔案系統來支援大小寫,因此需要新建一個dmg,官網給出的命令列新建的映象位置放在~(通常是User/使用者名稱)檔案目錄下,所以需要修改檔案位置,具體步驟如下:

  • 進入行動硬碟目錄下
  • 建立映象檔案:hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ./android.dmg
  • 掛載映象檔案:hdiutil attach ./android.dmg -mountpoint /Volumes/android;
注意建立的檔案可能為android.dmg.sparseimage,所以掛載的時候應具體而定。

(3)因為行動硬碟有時候需要插拔,所以希望能夠在硬碟掛載之後自動就把該映象掛載,或者更簡單直接執行一個shell指令碼執行,程式碼後面學習再上傳。

2.安裝Gnupg過時

在執行命令 POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg 時候,出現一下錯誤:

Error: gnupg has been deprecated. If you absolutely want to stay on the classic version, install the gnupg1 port. All other users are recommended to install gnupg2.
Error: Failed to configure gnupg: obsolete port
Error: See /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_mail_gnupg/gnupg/main.log for details.
Error: Follow https://guide.macports.org/#project.tickets to report a bug.
Error: Processing of port gnupg failed
  • 1
  • 2
  • 3
  • 4
  • 5

由於gnupg已經過時,如果要繼續使用gnupg的話,改為下載gnupg1;Error中建議大家使用gnupg2,我用的就是gnupg2。需要先關閉gnupg1的埠。

POSIXLY_CORRECT=1 sudo port uninstall gnupg1
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg2

參考網頁:https://blog.csdn.net/dengjiamingcsu/article/details/79695657

3.RPC failed; curl 18 transfer closed with outstanding read data remaining

這個錯誤參考網頁:https://blog.csdn.net/it_liuchengli/article/details/77040806 ,我是採用上面所說的第一種方式就解決了。

4.分配dmg空間不足

在建立dmg檔案時候,官網上指出最少25g,有的建立50g,我就設定dmg大小為80g,後來發現空間不足,因此需要重新分配大小,命令:

hdiutil resize -size <new-size-you-want>g ./android.dmg.sparseimage

其實我認為可以分配大點,因為dmg只是限制你最大空間,不會直接佔用硬碟空間。

5.缺少相應的 MacOsX sdk

internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12"]
ninja: build stopped: subcommand failed.
20:37:11 soong bootstrap failed with: exit status 1
make: *** [run_soong_ui] Error 1
  • 1
  • 2
  • 3
  • 4
這個問題網上也報過,而且一般發生在make clobber命令之後,具體出現這種問題網頁有:https://www.jianshu.com/p/1513fc9e1a74 ,但是我在執行的時候並沒有發生,命令正常執行,但是在我make的時候報了這個錯誤,依照網上的解決方案應該有兩個:一是下載其需要的MacOsX sdk,二是修改原始碼目錄/build/core/combo/mac_version.mk檔案,修改其所需要的mac環境,如下:不管方案一還是方案二需要解決的問題就是MacOsX sdk位置及其當前版本確認。這是在Xcode安裝目錄下,好像一般都是自帶的,具體沒有深究,在網上看有的是自己安裝的,所以目錄一般是Application目錄下,具體看這個問題連結,但是我的Xcode目錄並不是在其所指的位置,但可以通過命令xcode-select -p找到其所安裝的目錄。找到其安裝的目錄之後,發現我的版本是sdk 10.13,而需要的是10.10 10.11 10.12的,所以最簡單的方法採用方案二,直接修改mac_version.mk檔案,然而我去那個目錄下找卻沒有找到,網上也沒有遇到這個問題,所以只能等以後有時間的時候再具體瞭解哪裡修改,所以採用方案一,下載一個10.12版本,解壓放在那個目錄下,記得需要sudo,但是放進去之後好像還不行,因為檢視其許可權,多了個@,可通過如下命令列去除:  xattr -c -r *

參考網頁:https://blog.csdn.net/buyueliuying/article/details/77604225

6.error: Exited sync due to fetch errors

關於這個問題網上有不同的解決方法,目前採用https://blog.csdn.net/txl19881019/article/details/44081865方案使用命令:repo sync -j8

7.bison不能正常使用

[  0% 310/89583] //external/selinux/ch...eckpolicy yacc policy_parse.y [darwin
FAILED: out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h 
BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d  --defines=out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h -o out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c external/selinux/checkpolicy/policy_parse.y
[  0% 317/89583] //system/core/bootstat:bootstat clang++ bootstat.cpp
ninja: build stopped: subcommand failed.
12:58:42 ninja failed with: exit status 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

這個問題通過https://blog.csdn.net/h649305597/article/details/80322488找到,在這個網頁上說明一些7.1,8.1編譯時的錯誤,在此引用其解決辦法:這個錯誤都是由於bison不能正常使用導致的。可以使用

./prebuilts/misc/darwin-x86/bison/bison
  • 1

檢測一下你的原始碼中的bison是否正常工作。 

網上有一些國內複製貼上的解決辦法但我沒有走通,下面是我在谷歌搜尋到的解決方案:

1、定位到原始碼中external/bison資料夾

cd external/bison

2、在資料夾建立文字檔案patch-high-sierra.patch並把下面程式碼複製進去()

With format string strictness, High Sierra also enforces that %n isn't used
in dynamic format strings, but we should just disable its use on darwin in
general.

--- lib/vasnprintf.c.orig   2017-06-22 15:19:15.000000000 -0700
+++ lib/vasnprintf.c    2017-06-22 15:20:20.000000000 -0700
@@ -4869,7 +4869,7 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *
 #endif
                   *fbp = dp->conversion;
 #if USE_SNPRINTF
-# if !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+# if !defined(__APPLE__) && !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
                 fbp[1] = '%';
                 fbp[2] = 'n';
                 fbp[3] = '\0';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3、在控制檯(保證當前目錄是external/bison)執行

patch -p0 < patch-high-sierra.patch  
  • 1

4、返回根目錄

cd ../..  
  • 1

5、編譯bison

make bison
  • 1

6、複製bison到AOSP編譯時尋找bison的位置

cp ./out/host/darwin-x86/obj/EXECUTABLES/bison_intermediates/bison ./prebuilts/misc/darwin-x86/bison/bison 
  • 1

經過我自己的驗證在7.1以後的版本都需要使用這個來解決bison失效的問題,至少現在還是這樣的。報的類似錯誤都可以用這個方式試試。

8.

Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex
FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
GC overhead limit exceeded
Try increasing heap size with java option '-Xmx<size>'
Warning: This may have produced partial or corrupted output.
ninja: build stopped: subcommand failed.

參考網頁:https://blog.csdn.net/brightming/article/details/49763515/通過修改jack-admin檔案,設定Xmx,其最好設定大一點,網頁上給的2048仍然會出現這個錯誤,所以在有的網頁上看最好設定記憶體的一半。

9.編譯成功後,使用emulator啟動模擬器出現啟動正常,但是模擬器彈窗提示System UI isn't responding。

10.將Android原始碼匯入Intellij IDEA中,出現有的引用(如com.android.internal.R)找不到,有些類重複定義。

將原始碼匯入Intellij中,可參考https://www.jianshu.com/p/1d1b8d0de1ed,其實基本按這步驟去操作,應該沒什麼問題,但是我偏偏遇到三個問題:

(1)匯入程式碼之後,發現原始碼目錄下各個子目錄中src目錄沒有在Idea中,但是通過兩次shift卻能找到相應的類,點選工程欄中的定位,定位沒有反應。這個問題通過把原來的moudle移除,然後重新make、執行sh,再新增android.iml,所有程式碼就全部匯入Idea中了。

(2)匯入之後按照參考步驟sync之後,發現com.android.internal.R識別不了,有些程式碼如Activity程式碼出現錯誤提示,其實對於只是看原始碼來講,應該沒什麼問題,自己也可以從原始碼中找到相應的位置,但是這個問題一直膈應我,總覺不舒服,所以花了兩天時間解決(主要還是每次sync時間太長了),剛開始是依賴問題,瞭解Idea中的設定,依賴配置,還是沒有用,後來發現其他類都變成類的圖示,就是這個類是java圖示,點進具體的R檔案中有個提示:file size exceeds configured limit, 才恍然大悟,原來的idea設定問題,導致這個檔案太大編譯不了,後來參考https://blog.csdn.net/u013659732/article/details/68942207?ref=myread,設定idea中的idea.max.intellisense.filesize=9999值,單位是KB,然後就能找到了。

(3)有的類重複定義,如Acitivty等,其實在參考教程,有一步是把dependence的依賴全部刪除,只留下jdk,這兩個問題我覺得類似,其實在編譯的時候生成很多jar檔案等,這樣會導致依賴和原始碼都有對應的類,所以重複定義,我遇到的問題是,我已經按照參考步驟去除依賴,但是還是發現有重複定義類,遇到這類問題看提示看重複定義位置,然後去那個檔案目錄發現其被標記為源根(參考:https://blog.csdn.net/zx48822821/article/details/78640041),如我的問題是Activity類在out一個子目錄下,去找到那個目錄,發現被標記為(源根),右擊,選擇unmark source root,然後重新編譯即可。

   基本上下載、編譯、匯入遇到的問題就這些,除錯可以參考https://www.jianshu.com/p/7c2ab3d9498c、https://www.cnblogs.com/Lefter/p/4176991.html這兩篇文章,我嘗試一下,啟動模擬器和monitor太慢了,所以就沒有嘗試了,之後再急需吧。

注:寫的可能比較亂,以後有時間再繼續進行整理,希望對其他同學有所幫助。