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