即使是在我們最好的照看下,也會(huì)偶爾出現(xiàn)小的問(wèn)題。這篇文章會(huì)持續(xù)追蹤在使用 Android 源碼的過(guò)程中出現(xiàn)的問(wèn)題。
在 AOSP 給 toro 的構(gòu)建中(Jelly Bean 4.2.1 之后的版本),CellBroadcastReceiver 并不會(huì)包括在系統(tǒng)中。
在 vendor/samsung/toro/device-partial.mk 中的 PRODUCT_PACKAGES 有一個(gè)排版錯(cuò)誤:有一個(gè) H 替代了 K。
使用 4.2.2 的最后一個(gè)版本包,或者手工的修改排版。
在有些 IceCreamSandwich 或之后的版本構(gòu)造中,在構(gòu)造中會(huì)先打印下面的警告:
/bin/bash: line 0: cd: cts/tools/cts-native-xml-generator/src/res: No such file or directory
有些 makefile 依賴的路徑并不存在。
無(wú)。這是一個(gè)無(wú)害的警告。
這個(gè)模擬器直接由 gingerbread 分支構(gòu)造而且沒(méi)有啟動(dòng),一直卡死在綠屏狀態(tài)下。
gringerbread 分支使用的是 R7 版本的模擬器,該模擬器并沒(méi)有所有必要的特征來(lái)運(yùn)行最近版本的 gingerbread。
使用 R12 版本的模擬器,以及一個(gè)新的匹配工具的核心。不需要清理 build。
$ repo forall platform/external/qemu -c git checkout aosp/tools_r12
$ make
$ emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7
構(gòu)建在 MacOS 10.7 Lion 或者 XCode 4.x 上的模擬器(任何版本)不工作。
一些在開(kāi)發(fā)環(huán)境的更改導(dǎo)致了模擬器不能從工作環(huán)境中編譯。
使用一個(gè) SDK 中的二進(jìn)制文件,該文件可以構(gòu)建在用 XCode 6 的 MacOS 10.6 上,并且可以在 MacOS 10.7 上工作。
WITH_DEXPREOPT=true 以及模擬器構(gòu)建。在模擬器的構(gòu)建中,當(dāng)部分行為的構(gòu)建以及同步(使系統(tǒng)沒(méi)有依賴)時(shí),結(jié)果構(gòu)建沒(méi)有生效。
默認(rèn)情況下,現(xiàn)在所有模擬器構(gòu)建都會(huì)進(jìn)行 Dex 優(yōu)化,這就會(huì)導(dǎo)致每次框架改變都會(huì)請(qǐng)求跟隨所有的依賴,用來(lái)重新優(yōu)化應(yīng)用。
用 export WITH_DEXPREOPT=false 使本地的 Dex 優(yōu)化失效,用 make installclean 刪除已經(jīng)存在的優(yōu)化版本,然后運(yùn)行一個(gè)完整的構(gòu)造,重新生成沒(méi)有優(yōu)化的版本。在進(jìn)行完上述操作之后,部分的構(gòu)造將會(huì)開(kāi)始工作。
Permission Denied所有的構(gòu)建失敗都伴隨著 Permission Denied,可能伴隨著反病毒警告。
有些反病毒程序會(huì)將一些 Android 源碼樹(shù)中的文件錯(cuò)誤的識(shí)別成包含病毒。
經(jīng)過(guò)確認(rèn)沒(méi)有病毒存在后,讓反病毒程序在 Android 源碼樹(shù)中失效。這樣做對(duì)減少構(gòu)建次數(shù)有好處。
構(gòu)建錯(cuò)誤有許多的特征。其中一個(gè)特征是: cc1: error: unrecognized command line option "-m32”
在 PATH 中 Android 構(gòu)建系統(tǒng)使用的是默認(rèn)的編譯器,假設(shè)在 host 中有合適的編譯器生成的二進(jìn)制文件。其他情況(比如使用 Android NDK 或者構(gòu)建內(nèi)核)將會(huì)導(dǎo)致默認(rèn)的編譯器不是主編譯器。
使用 “clean” 腳本,確保沒(méi)有別的操作會(huì)更改默認(rèn)的編譯器。
構(gòu)造失敗有很多特征,可能是由于文件丟失或者文件格式錯(cuò)誤。其中一個(gè)的特征是 member [...] in archive is not an object。
Android 構(gòu)建系統(tǒng)往往使用很多 host 工具并依賴于他們默認(rèn)的行為。有些設(shè)置更改了工具的行為并使他們的行為干擾到了系統(tǒng)構(gòu)建。已知會(huì)導(dǎo)致問(wèn)題的變量是 CDPATH 和 GREP_OPTIONS。
在盡可能少的自定義環(huán)境中構(gòu)建 Android。
在 MacOS 10.7 上構(gòu)建 IceCreamSandwich 4.0.x(和更老的版本)失敗,并提示下面的錯(cuò)誤信息: Undefined symbols for architecture i386: "_SDL_Init”
在 MacOS 10.7 上不能適配 4.0.x
降級(jí)電腦系統(tǒng)到 MacOS 10.6 或者是在 MacOS 10.7 上構(gòu)造當(dāng)前版本。
$ repo init -b master
$ repo sync
當(dāng)使用 XCode 4.3 時(shí)所有的構(gòu)造都失敗
XCode 4.3 的默認(rèn)編譯器從 gcc 改成了 llvm,而 llvm 拒絕過(guò)去可以在 gcc 上通過(guò)的代碼。
使用 XCode 4.2。
在 Ubuntu 11.10 或之后的版本中構(gòu)建 IceCreamSandwich 4.0.x(或者其之前的版本)會(huì)出現(xiàn)類似 <command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default] 的錯(cuò)誤。
Ubuntu 11.10 使用 gcc 標(biāo)記是默認(rèn)的,而 Android 也會(huì)定義一個(gè)默認(rèn)的標(biāo)記,這樣導(dǎo)致了沖突。
可以選擇降級(jí)到 Ubuntu 10.04 或者使用當(dāng)前分支,這樣就可以在 Ubuntu 11.10 或者之后的版本中使用。
$ repo init -b master
$ repo sync
在 http 錯(cuò)誤的時(shí)候 repo 或者是 repo sync 失敗,通常是 403 或者是 500。
有很多引起錯(cuò)誤的原因,其中最常見(jiàn)的是關(guān)聯(lián)到了 http 代理,這是傳輸大數(shù)據(jù)的時(shí)候比較困難。
暫時(shí)還沒(méi)有通用解決方法,使用 python 2.7 以及明確的使用 repo sync -jl 來(lái)改善一些用戶的使用情況。
當(dāng)在一些 VituralBox 安裝中運(yùn)行 repo sync,進(jìn)程伴隨著可能的特征掛起或者失敗。其中一種特征是:DownloadError: HTTP 500 (Internal Server Error: Server got itself in trouble)。
默認(rèn)的 VirualBox 的網(wǎng)絡(luò)行為是使用 NAT(Network Addrss Translation)連接客戶系統(tǒng)來(lái)連接網(wǎng)絡(luò)。繁重的網(wǎng)絡(luò)行為將會(huì)引發(fā) NAT 中的某些代碼。
配置 VirtualBox 讓其使用橋連接來(lái)代替 NAT。
當(dāng)運(yùn)行 repo sync 時(shí),由于無(wú)法識(shí)別 hostname 伴隨著一些錯(cuò)誤導(dǎo)致進(jìn)程失敗。其中一個(gè)錯(cuò)誤是: <urlopen error [Errno -2] Name or service not known>。
有些 DNS 系統(tǒng)在應(yīng)對(duì)大數(shù)量的請(qǐng)求時(shí)需要同步源碼樹(shù)而導(dǎo)致運(yùn)行緩慢(在最壞的假設(shè)情況下可能有好幾百請(qǐng)求)
手工移除相關(guān)的 hostname,并在本地硬編碼那些結(jié)果。
你可以用 nslookup 命令來(lái)移除,這可以給你一系列的數(shù)字 IP 地址(通常是在輸出中的 “Address” 部分)。
$ nslookup googlesource.com
$ nslookup android.googlesource.com
之后你可以在本地硬編碼他們到 /etc/hosts,再在這個(gè)文件中以下面的格式添加兩行:
aaa.bbb.ccc.ddd googlesource.com
eee.fff.ggg.hhh android.googlesource.com
需要注意的是這只在服務(wù)的地址沒(méi)有改變的情況下,所以如果他們更改了地址而你又無(wú)法連接,這時(shí)候你就要重新的獲取 hostname,相應(yīng)的你還要更改 etc/hosts。
在同步時(shí) repo sync 掛起,通常都是在已經(jīng)同步了 99% 的情況下。
在 TCP/IP 堆的設(shè)置會(huì)使一些網(wǎng)絡(luò)環(huán)境變的很糟糕,比如 repo sync 會(huì)既不編譯,也不失敗。
在 Linux 上執(zhí)行 sysctl -w net.ipv4.tcp_window_scaling=0。在 MacOS 上,使 rfc 1323 擴(kuò)展失效。
照相機(jī)和 GSP 在 Galaxy Nexus 上失效。舉個(gè)例子,照相機(jī)應(yīng)用一啟動(dòng)就崩潰。
在 Android 開(kāi)源項(xiàng)目中不提供這些硬件外設(shè)需要專有庫(kù)。
無(wú)。