今天編譯了android 2.3源碼,即gingerbread。原始碼是通過"repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread"取出的。
編譯完成後,啟動SDKManager發現在"Installed packages"中無法找到編譯出來的android-2.3
進入編譯結果目錄 out/host/linux-x86/sdk/android-sdk_eng.cmoaciopm_linux-x86/tools 發現android-2.3是存在的,那為什麼SDKManager檢測不到呢?
很蛋疼的查看了sdkmanager的原始碼,終於找到問題所在
sdkmanager的原始碼存放在sdk/sdkmanager下,包含三個工程
1. app:sdkmanager主介面及介面邏輯
2. lib/sdklib:sdkmanager核心邏輯
3. lib/sdkuilib:sdkmanager的子UI組件代碼
SdkManager.reloadSdk()是檢測installed packages的方法,檢測標準如下
1. 校正build.prop檔案,
從ro.build.version.release擷取apiName
從ro.build.version.sdk擷取apiNumber
從ro.build.version.codename擷取apiCodeName(optional)
2. 校正source.properties
Pkg.Revision
非必須
3. 校正sdk.properties
非必須
4. 校正platforms/[sdk-version]/目錄下的關鍵檔案是否存在
android.jar
framework.aidl
tools/aapt
tools/aidl
tools/dx
tools/lib/dx.jar
看到這裡,終於知道SDKManager無法檢測到Install packages的原因了,我所檢出的android gingerbread原始碼編譯出的sdk目錄結構與SDKManager檢測邏輯是不一致的。
android在2.3對sdk目錄結構進行了調整,將platform下面的tools檔案夾移動到SDK根目錄下,命名為platform-tools(裡麵包含了該platform的aapt和adb等工具。這樣,platform在各作業系統下都統一了,不需要再為不同作業系統發布不同的platform,僅發布不同的platform-tools即可)。
可見gingerbreak代碼分支中sdkmanager的代碼不是“最新的”,沒有與編譯出來的sdk目錄結構保持一致。google也有失誤的時候,這麼大的項目也可以理解
瞭解了以上事實,於是乎做了軟連結,騙過sdkmanager,重啟檢測一切正常
PS : android-sdk目錄的tools下的andriod命令,指定-v參數可以顯示error和warning的日誌,通過這個參數就能查看到sdkmanager的警告和錯誤記錄檔了
本文轉載自:http://blog.csdn.net/cmoaciopm/article/details/6710243