之前嘗試編譯 AOSP 後,發現編譯後裡頭很乾淨,連 Android Market 都沒有,頓時不知道該怎樣安裝軟體,變成安裝軟體必須找到 apk 檔案,並且使用 adb install *.apk 或 adb push *.apk /system/app 的方式安裝,十分不方便,我有嘗試從 Apps - Android Market 網頁安裝,但都沒反應?!所以就著手研究在 AOSP 上安裝 Android Market 的嘗試,倒是看了不少文章都說 AOSP 預設是不會包含任何 Google app 的,可能是 License 問題或是 Google 並沒有 Open source 的關係,總之找到的解法要嘛就是去跟 Google 要(?),不然就是安裝網路上可以找到的 android market.apk 檔案,只是 android market 使用上會需要綁帳號的,對於別人做的東西還是要三分保留啊,以免帳密被第三方取得!總之,我就東看看西摸摸,搞懂了一些東西,決定從原先 Android 2.3.3 中取得相關 Android market 程式,拼拼湊湊弄出功能囉。
首先,從 Nexus One with Android 2.3.3 裡,在 /system/app 裡撈出 Android Market app,但找了很久都沒看到!最後才知道,這個 Android market app 是叫作 Vending.apk 啦,但是擺進 AOSP 裡後,卻看不到 Android Market 耶?找了一些文章,才知道 Nexus One 裡的 Google app 都有兩種東西: apk 跟 odex 檔案,兩者要搭配在一起才能使用,但我把兩者透過 adb push 到 AOSP 裡也依舊看不到,所以就改從事反組譯類的工作 XD
從 把玩"魔術師" -- 認識、把玩 APK 檔 這篇文章中,得知 odex 是最佳化後的產物並且搭配 apk 使用的,如果要整合成使用單一 apk 檔,就必須整 odex 資訊整合回 apk 啦。多虧這篇文章,我又認識 dsixda Android Kitchen。簡單來說,這是一個製作客製化 ROM 的整合工具,包括建立 ROM 啊、重新 sign apk 等,我只需要的是將 odex 整進 apk 檔案,這些東西是分類在 decode 部分。
參考 Android Kitchen 之 decode 後,得知負責 decode 的也有 open source:smali - An assembler/disassembler for Android's dex format,而取得 smali.jar baksmali.jar 後,就能工作啦!
總結流程:
- 從 Nexus One with Android 2.3.3 官方環境中,取得 Android Market 及其相關函式庫(主要是 Vending 跟 GoogleServicesFramework)
- $ adb pull /system/app /tmp
- $ adb pull /system/framework /tmp
- 這不見得需要,因為我後來在 decode 的過程中並沒使用 XD
- 使用 smali 將 odex 整進 apk 中
- 將 Vending.odex 併入 Vending.apk
- 將 GoogleServicesFramework.odex 併入 GoogleServicesFramework.apk
- 連續動作,假設 Vending 跟 GoogleServiceFramework 都擺在 app 中:
- $ ls
app baksmali-1.2.6.jar framework smali-1.2.6.jar
$ ls app
GoogleServicesFramework.apk GoogleServicesFramework.odex Vending.apk Vending.odex
$ java -Xmx512m -jar baksmali-1.2.6.jar -d framework/ -x app/Vending.odex
$ java -Xmx512m -jar smali-1.2.6.jar -o classes.dex out
$ zip -r -q app/Vending.apk classes.dex
$ rm -rf out/ classes.dex
$ java -Xmx512m -jar baksmali-1.2.6.jar -d framework/ -x app/GoogleServicesFramework.odex
$ java -Xmx512m -jar smali-1.2.6.jar -o classes.dex out
$ zip -r -q app/GoogleServicesFramework.apk classes.dex
$ rm -rf out classes.dex
- $ ls
- 將整合好的 Android Market 及相關函式庫擺進 AOSP 裡
- 使用 adb install
- $ adb install Vending.apk
1172 KB/s (1091549 bytes in 0.909s)
pkg: /data/local/tmp/Vending.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] - 算是預期中的結果 XD 解法應該是重新 sign apk
- $ java -jar signapk_files/signapk.jar signapk_files/testkey.x509.pem signapk_files/testkey.pk8 GoogleServicesFramework.apk GoogleServicesFramework-signed.apk
$ java -jar signapk_files/signapk.jar signapk_files/testkey.x509.pem signapk_files/testkey.pk8 Vending.apk Vending-signed.apk
$ adb install GoogleServicesFramework-signed.apk
1196 KB/s (1123115 bytes in 0.917s)
pkg: /data/local/tmp/GoogleServicesFramework-signed.apk
Success
$ adb insatll Vending-signed.apk
1221 KB/s (1089904 bytes in 0.871s)
pkg: /data/local/tmp/Vending-signed.apk
Success - 但開始使用時,卻發現無法登入 Google,猜想應該是重新 sign apk 的影響,所以就改用 adb push 啦
- $ java -jar signapk_files/signapk.jar signapk_files/testkey.x509.pem signapk_files/testkey.pk8 GoogleServicesFramework.apk GoogleServicesFramework-signed.apk
- $ adb install Vending.apk
- 使用 adb push
- $ adb root
restarting adbd as root
$ adb remount
remount succeeded
$ adb push Vending.apk /system/app
1150 KB/s (1091549 bytes in 0.926s)
$ adb push GoogleServicesFramework.apk /system/app
- $ adb root
- 使用 adb install
收工!接著就可以從 AOSP 啟用 Android Market 囉!一開始執行會看到一個 alert 錯誤視窗,但流程接著是選擇網路、指定 Google Account 後,重新啟動 market 後是正常了,嘗試安裝一下 Angry Birds,跑起來沒啥問題,應該是搞定啦。
目前的 Android Market 是 2.13 版,網路上倒可以找到 2.2.11 版的,但我沒啥需求,先用這就好 :D 這篇主要是學到整合 odex 跟 apk 的方式囉,接下來就可以專心改改 AOSP 啦!
沒有留言:
張貼留言