2011年5月6日 星期五

[Android] Android Market and AOSP @ Nexus One、Android 2.3.3

android_market01 android_market02


之前嘗試編譯 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 後,就能工作啦!


總結流程:



  1. 從 Nexus One with Android 2.3.3 官方環境中,取得 Android Market 及其相關函式庫(主要是 Vending 跟 GoogleServicesFramework)


    • $ adb pull /system/app /tmp

    • $ adb pull /system/framework /tmp

      • 這不見得需要,因為我後來在 decode 的過程中並沒使用 XD





  2. 使用 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






  3. 將整合好的 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 啦





    • 使用 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






收工!接著就可以從 AOSP 啟用 Android Market 囉!一開始執行會看到一個 alert 錯誤視窗,但流程接著是選擇網路、指定 Google Account 後,重新啟動 market 後是正常了,嘗試安裝一下 Angry Birds,跑起來沒啥問題,應該是搞定啦。


android_market03 android_market04 android_market05 android_market_2.13


目前的 Android Market 是 2.13 版,網路上倒可以找到 2.2.11 版的,但我沒啥需求,先用這就好 :D 這篇主要是學到整合 odex 跟 apk 的方式囉,接下來就可以專心改改 AOSP 啦!


沒有留言:

張貼留言