2011年4月14日 星期四

[Android] Building AOSP & Back to Original Shipping Image @ Nexus One 、Ubuntu 10.04 x86 & Mac OSX 10.6.7

device01 device02


AOSP 全名是 Android Open Source Project,既然有 Open Source 那就要編一下啊~不過,這真的是條不歸路 XD 在此就紀錄一下編出 AOSP 跟還原到原廠設置的流程,其中後者過程算是不滿意但還可以接受狀態,因為我沒找到官方公佈的 image 檔,而是從 xda-developers (md5sum: bef86698cafc88ca03fff5758571d9d6) 那邊下載到的,若有人知道官方處,麻煩留言一下下啊,感謝!


警告,私自更動手機狀態,將可能喪失保固,請自行評估與負責,此篇僅為個人筆記


另外一提,手上這隻 Nexus One 其 bootloader 早已解鎖(unlock)過了,在此就不多談 unlock 的過程。關於編譯環境是 Ubuntu 10.04 x86 的作業系統,並更新至最新狀態,但一切都是在 VirtualBox 4.0.4 r70112 上運行,巧的是 Host 也是 Ubuntu 10.04 Desktop x84,以下操作皆為 Guest OS 上頭,於 Host 機器上僅需手動調整 VirtualBox ,讓手機 USB 掛載上去。


Guest OS Ubuntu 10.04 x86 額外安裝便利的操作環境:


sudo apt-get install openssh-server vim 


如果 add-apt-repository not found 那就多安裝一下 python-software-properties。


編譯自己的 AOSP:


主要流程:http://source.android.com/source/ ,強烈建議先看過 Initializing the Build Environment、Downloading the Source 和 Building and Running 章節。


Step 1:安裝 Java SDK


$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk


Step 2:安裝編譯環境


$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev mesa-common-dev


Updated @ 2011/05/09:


mesa-common-dev 並非官方文件上有提到的,但在編譯時會碰到以下問題


host C++: libEGL_translator <= development/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp
In file included from development/tools/emulator/opengl/host/libs/Translator/EGL/../include/EGL/egl.h:36,
                 from development/tools/emulator/opengl/host/libs/Translator/EGL/EglOsApi.h:19,
                 from development/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp:16:
development/tools/emulator/opengl/host/libs/Translator/EGL/../include/EGL/eglplatform.h:89:20: error: GL/glx.h: No such file or directory
In file included from development/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp:16:
development/tools/emulator/opengl/host/libs/Translator/EGL/EglOsApi.h:23:19: error: GL/gl.h: No such file or directory
...
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libEGL_translator_intermediates/EglX11Api.o] Error 1


這是 make libEGL_translator 時所碰到的,解法就是安裝 mesa-common-dev 就可以搞定啦。也能先用相關指令確認系統是否已經有相關函式庫:


$ dpkg -l | grep mesa-common
ii  mesa-common-dev                      7.7.1-1ubuntu3                                  Developer documentation for Mesa


因為我是 x64 環境,所以額外再安裝相關的 32bit 函式庫:


$ sudo apt-get install gcc-multilib g++-multilib libc6-i386 libc6-dev-i386


Step 3:設定系統 USB 裝置事項


$ sudo vim /etc/udev/rules.d/51-android.rules


# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>”


記得要把 <username> 更新為使用的帳號名稱


Step 4:下載 Android 程式碼


$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://android.git.kernel.org/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir yydroid
$ cd yydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git
$ repo sync


其中 yydroid 是要擺放 source 的目錄,可以自行修改名稱。而下載程式碼的部份,在 2011/04/12 所抓到的是 5.5 GB 大小,使用 500~2000 KB/s 的速度,大概花費 45 分鐘,以下是用 time 測得:


real 41m13.241s
user 4m46.860s
sys 1m20.600s


Updated @ 2011/04/13:


在另一台 Host 是 AMD X4 945 + 8GB RAM 其 OS 是 Win 7 x64,配給編譯的 Guest OS 是 2GB RAM + CPU x2 ,其網路確定最高速是 5Mb/s 對稱網路,全速抓最高也才 500~600 KB/s,用 time 測試結果:


real 209m24.113s
user 2m45.690s
sys 2m15.280s


可以參考網路速度。


Step 5:編譯原始碼


初始化環境


$ cd yydroid
$ source build/envsetup.sh


在編譯過程前,必須先取得 Nexus One 相關 binary 資料(此過程不確定是不是抓 Drivers ,有興趣可以去查看 extract-files.sh),而抓取資料需使用 adb 指令,如果沒有安裝過 android sdk,那就先編譯 adk 出來


$ make adb
$ PATH=~/yydroid/out/host/{host-type}/bin/:$PATH
$ adb root


抓取 Nexus One 資料


別忘了把手機設定為開發模式


[設定]->[應用程式]->[開發]->[USB偵錯]


確認有連到手機


$ adb devices
HT#########    device


開始抓資料


$ cd ~/yydroid/device/htc/passion
$ ./extract-files.sh


190 KB/s (26116 bytes in 0.133s)
415 KB/s (80036 bytes in 0.188s)
203 KB/s (18516 bytes in 0.088s)
117 KB/s (11542 bytes in 0.096s)
6 KB/s (587 bytes in 0.092s)
185 KB/s (17684 bytes in 0.093s)
450 KB/s (122442 bytes in 0.265s)
496 KB/s (122442 bytes in 0.240s)
474 KB/s (122442 bytes in 0.252s)
11 KB/s (1156 bytes in 0.102s)
99 KB/s (9220 bytes in 0.090s)
208 KB/s (27612 bytes in 0.129s)
407 KB/s (79936 bytes in 0.191s)
478 KB/s (163008 bytes in 0.332s)
581 KB/s (1746672 bytes in 2.931s)
503 KB/s (206768 bytes in 0.401s)
371 KB/s (60440 bytes in 0.159s)
280 KB/s (34548 bytes in 0.120s)
104 KB/s (9320 bytes in 0.087s)
539 KB/s (449992 bytes in 0.815s)
142 KB/s (14240 bytes in 0.097s)
514 KB/s (357740 bytes in 0.679s)
152 KB/s (13984 bytes in 0.089s)
380 KB/s (86344 bytes in 0.221s)
329 KB/s (54872 bytes in 0.162s)


開始編譯


$ cd ~/yydroid
$ lunch full_passion-userdebug
$ make -j 4


使用的 Host 機器是 AMD X4 955 + 4GB RAM ,配給編譯的 Guest OS 是  1.5GB RAM + CPU x1,用 time 測試結果:


real 101m48.827s
user 104m18.890s
sys 8m21.430s


Updated @ 2011/04/13:


在另一台 Host 是 AMD X4 945 + 8GB RAM 其 OS 是 Win 7 x64,配給編譯的 Guest OS 是 2GB RAM + CPU x2,採用 lunch full-eng 後,用 time 測試結果:


real 60m4.647s
user 112m57.410s
sys 10m51.210s


在 Mac mini OSX 10.6.7,2GB RAM,CPU 是 2GHz Intel Core2 Duo,僅使用 SSH 登入後執行相關動作,採用 lunch full-eng 後,用 time 測試結果:


real    89m54.709s
user   139m58.045s
sys     15m54.753s


在 AMD X4 955 + 4GB RAM 中,採用 lunch full-eng 後,用 time 測試結果:


real    25m22.341s
user   98m34.990s
sys     6m16.400s


Step 6:刷機啦!


看一堆文章都用刷機字眼,我記得以前修課時都是用燒這個字眼 XD 反正入境隨俗,給他刷下去吧!在刷機之前,必須將 Nexus One 狀態切換至 fastboot mode,此時才能進行刷:


a. 把手機關機
b. 按住 "軌跡球" + "Power 鍵" 開機,即可進入神秘的模式
c. 使用 "音量鍵+/-" 來移動選擇項目,請選擇 Fastboot 並用 "Power 鍵" 選定,進入後可以看到 Fastboot 字樣,其背景顏色是紅色的


接著切換到 Ubuntu 操作,如果跟我一樣用 VirtualBox 的話,請先手動掛載 USB 裝置並挑選 htc 字樣,接著切換到 Gest OS 上,也就是剛剛編譯環境:


$ cd ~/yydroid/
$ fastboot devices (可以查看有沒連線的手機) 
$ fastboot -w flashall (正式刷機) 


--------------------------------------------
Bootloader Version...: 0.35.0017
Baseband Version.....: 5.08.00.04
Serial Number........: HT##########
--------------------------------------------
checking mid...
OKAY [  0.007s]
checking product...
OKAY [  0.005s]
checking version-bootloader...
OKAY [  0.006s]
checking version-microp...
OKAY [  0.006s]
checking version-baseband...
OKAY [  0.007s]
sending 'boot' (2320 KB)...
OKAY [  1.758s]
writing 'boot'...
OKAY [  0.922s]
sending 'recovery' (2558 KB)...
OKAY [  1.965s]
writing 'recovery'...
OKAY [  1.002s]
sending 'system' (92329 KB)...
OKAY [ 69.955s]
writing 'system'...
OKAY [ 30.144s]
erasing 'userdata'...
OKAY [  4.402s]
erasing 'cache'...
OKAY [  2.300s]
rebooting...

finished. total time: 112.537s


接著就會看到手機重開了,其畫面就是文章上頭的照片,很精簡的介面,沒有其他客製化的 app ,附帶一提,也沒有 Android Market 喔。往後安裝程式可以透過 adb install your_app.apk 的方式。過陣子在抽空去了解 Market 的事宜,網路上的文章只提了一下下(Android Market and AOSP)。


還原到原廠系統:


在網路上打滾一會兒,因為不曉得該怎樣下關鍵字,最後幸運找到囉!關鍵字就是 OEM、Original Shipping Image 等。另外,我也查到 Nexus One 因為 bootloader unlocking 後,似乎就沒保固了?因為 unlock 是不可逆的動作,盡管還是可以把作業系統恢復到原廠啦。


恢復到原廠系統,需要找到原廠 image 檔案,我找了一陣子,終於在 http://forum.xda-developers.com/showthread.php?t=614057 找到囉!但還不夠完美,理論上應該找到官方才對,而不是找到其他人釋出的版本,且 Android 很 Open ,所以系統被別人塞了甚麼東西,也是存在許多資安問題的,總之,目前我只找到此解 Orz 下載檔案,可以用 md5sum 確認一下,應該是 bef86698cafc88ca03fff5758571d9d6 才對。


把該檔案解壓出來,僅需要 boot.img 、 system.img 和 recovery.img 即可,接著剛上面 Step 6 狀態一樣,把 Nexus One 切換到 Fastboot mode ,並且在 Ubuntu 上透過 fastboot devices 查看是否有連街到,有連到就行啦,以下是連續動作:


changyy@Lab:~/yydroid$ fastboot devices
HT########## fastboot
changyy@Lab:~/yydroid$ fastboot erase userdata
erasing 'userdata'...
OKAY [  4.521s]
finished. total time: 4.521s
changyy@Lab:~/yydroid$ fastboot erase cache
erasing 'cache'...
OKAY [  2.461s]
finished. total time: 2.462s
changyy@Lab:~/yydroid$ fastboot flash boot  /path/boot.img 
sending 'boot' (2044 KB)...
OKAY [  1.585s]
writing 'boot'...
OKAY [  0.880s]
finished. total time: 2.465s
changyy@Lab:~/yydroid$ fastboot flash system  /path/system.img 
sending 'system' (116663 KB)...
OKAY [ 88.869s]
writing 'system'...
OKAY [ 40.625s]
finished. total time: 129.494s
changyy@Lab:~/yydroid$ fastboot flash recovery /path/recovery.img
sending 'recovery' (2294 KB)...
OKAY [  1.761s]
writing 'recovery'...
OKAY [  0.981s]
finished. total time: 2.742s
changyy@Lab:~/yydroid$ fastboot reboot
rebooting...

finished. total time: 0.040s


依序動作清除資料(erase userdata, erase cache)、刷 boot、system 和 recovery 部分,最後是讓 Nexus One 重開機啦!


device03 device04


可以看到版本是 ERD79 且為 2.1 版,接著更新一下,就可以更新到 GRI40 和 2.3.3 囉


device05 device07


收工!有空要來研究一下 root 的部分,暫時已知會動到 /system/xbin/su 和 /system/bin/su 的部分,但採用的是修改過的 su 原始碼,相關資料:


ChainsDD (Adam Shanks) - https://github.com/ChainsDD


https://github.com/CyanogenMod/android_system_extras/tree/gingerbread/su


http://android.git.kernel.org/?p=platform/system/extras.git;a=blob;f=su/su.c#l62


呼,其實這樣搞一遍也滿好玩的 XD 但找資料跟編譯很花時間啊啊啊。


@ 2011/04/14 Building AOSP on Mac OSX 10.6.7


整體流程:



  1. 建立區分大小寫的硬碟空間

  2. 安裝 Xcode 和 MacPorts

  3. 透過 MacPorts 安裝相關環境

  4. 剩下流程如同 Ubuntu 環境

    • 下載 AOSP 程式碼

    • 取得 Nexus One 相關資料 & 編譯




如果要在 Mac OSX 編譯 AOSP ,首先要處理 case sensitive 的問題,因為 Mac OSX 預設跟 Windows 一樣檔名不分大小寫。測試 case sensitive 的方式:


$ touch /tmp/test && ls -la /tmp/TEST


若找的到那就是不分大小寫


所以,就需要建立一個可以區分大小寫的空間,這時候可以不必重新切硬碟,而可採取建立一個映像檔的方式,用掛載映像檔的方式來使用空間。建立映像檔可透過 [應用程式]-> [工具程式] ->[磁碟工具程式] -> [新增映像檔]


01


接下來的新增映像檔畫面,如果沒有像下圖很多選項可以選,僅有指定位置等一兩種選項,那請去 [家目錄]->[資源庫]->[Preferences] 將 com.apple.DiskUtility.plist 先移到桌面,在重新啟動 磁碟工具程式 應該就可以解決。在這邊大小採用官網介紹的 12 GB ,最重要的是格式要挑區分大小寫的,如此一來應該就沒啥問題囉


02


建立好的樣貌如下圖,左邊就可以看到建立好的 android.dmg ,以及預設幫你先啟動了,但由於顯示為"磁碟映像檔",可能在後續動作有點需要打中文,此時可以透過點選桌面上的 [磁碟映像檔] -> [簡介] -> [名稱與副檔名] 更改成純英文數字的,如 Android 等,此時該空間的路徑是在 /Volumes/Android ,也可以透過 df -h 指令查看,若預設沒更改名稱則是在 /Volumes/磁碟映像檔 。


03


接著要安裝 Xcode 和 MacPorts。前者可以在 http://developer.apple.com/ 網站上下載,可註冊免費的 AppleID 並下載 Xcode 回來,請下載 Xcode 3 系列,如 xcode_3.2.6_and_ios_sdk_4.3.dmg 等,因為現況 Xcode 4 僅包含 MacOSX10.6.sdk,如果使用 Xcode 4 時,編譯過程會說找不到 MacOSX10.5.sdk。使用 Xcode 3 安裝時,請記得勾選 Mac OSX SDK 4。如果不幸先安裝了 Xcode 4 的話,要嘛上網查如何安裝 Mac OSX SDK 4,不然就是把 Xcode 4 移除 (sudo /Developer/Library/uninstall-devtools --mode=all) 並重開機後,再安裝 Xcode 3 囉,至於 Xcode 檔案大小約 4.5 GB,下載會需要一陣子。


接著是安裝 MacPorts 的部份,可參考 [Mac] 安裝 MacPorts & 解決防火牆問題 @ Mac OSX 10.6.7,安裝完 MacPorts 後,則依據 AOPS 官網簡介,安裝下列東西


$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git-core gnupg


若是 Mac OSX 10.4 則需在安裝 bison


$ POSIXLY_CORRECT=1 sudo port install bison


然而 AOSP 又提到 gmake 3.8.2 有問題,需手動安裝 gmake 3.8.1


$ sudo mkdir -p /opt/local/var/macports/sources/asop/dports && cd /opt/local/var/macports/sources/asop/dports
$ sudo svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
$ sudo vim /opt/local/etc/macports/sources.conf
file:///opt/local/var/macports/sources/asop/dports
$ sudo portindex /opt/local/var/macports/sources/asop/dports
$ sudo port install gmake @3.81


最後,可以去下載 AOSP 程式碼,並進行編譯囉,後續流程跟 Ubuntu 環境一樣。


沒有留言:

張貼留言