不得不說,Android升級的速度非常之快,手機廠商也在不停的追趕Android的步伐,力求更快更多的搶占市場!每次Android升級之后,用不了多久,三星、HTC等一些大廠商就會發布搭載最新android系統的產品,有時甚至完成了系統的深度定制,而一些低配、中低檔的手機則無法得到升級,誘使更多的屌絲尋找刷機ROM升級嘗鮮。。。對於程序員來說,不必去論壇尋找各種ROM,完全可以自己獲取手機的源代碼,自編自改,既是樂趣,也可以提升自己。。。
目前CyanogenMod官方支持的機型已經很多,只要你的手機不是太老太爛,都能找到相應的ROM。 但是看官方支持列表 ,你會發現大部分中配、低配,特別是arm-v6 CPU的手機最多只能升級到cm7 (android2.3),而無法升級到cm10.1(android4.2)。 本文將講解如何下載和編譯CM10.1源代碼,重點講述如何編譯出這些低配、中配機型的cm10.1-ROM。 請一定要有耐心完成這件事情,各個環節肯定會遇到這樣那樣的問題,甚至編譯出的ROM讓你刷機后無法開機,只有耐心的嘗試和探索,你才會取得成功!成功之后,你就可以盡情的更改源碼,向別人分享你制作的ROM!
一. 編譯 CyanogenMod官方 支持 升級到 cm10.1 的機型 ROM (官方支持列表)
閱讀上一篇文章 Ubuntu12.10-amd64系統上搭建Android4.2(JellyBean)源碼開發環境,按照步驟一路執行,將 “第4步的 3)初始化repo”,修改為下圖命令
然后 repo sync 同步源碼,同步源碼完成后 ,執行下列步驟並編譯源碼:
$ cd ~/myandroid/vendor/cm
$ ./get-prebuilts //(這一步是為了下載Term.apk並解壓到當前propritary目錄)
(只需執行一次,以后編譯無需執行)
$ cd ~/myandroid
$ source build/envsetup.sh
$ breakfast captivatemtd //(這一步會自動從github下載 三星I897[代號captivatemtd]設備的驅動和內核; 注意 必須是CM官方支持升級到cm10.1的設備才能使用這個命令下載到//內核和驅動!!!) (只需執行一次,以后編譯無需執行)
命令執行到這里,你會發現多出了 myandroid/device/samsung/captivatemtd 目錄,這個目錄下 有一個
extract-files.sh
的腳步!
接下來你要准備 三星I897這台真機,並且已經刷上了CM10.1的ROM,已root,與電腦連接,且在你的ubuntu系統上執行命令 adb devices 可以識別這台設備!(如果無法識別,自己百度google去)
$ cd ~/myandorid/device/samsung/captivatemte
$ chmod a+x extract-files.sh
$ ./extract-files.sh // (這條命令實際上都是組織好的的adb pull,它將真機中的部分庫和依賴文件拷貝到本地源碼環境,輔助編譯!因為部分庫和依賴文件的源碼我們無法獲取,
//相關廠商只提供了這些編譯好的東東!這一部很重要,如果跳過,即時編譯ROM成功,刷機后手機也跑不起來的!) (只需執行一次,以后編譯無需執行)
說明: 如果你不想預先把手機刷成CM10.1,可以以文本打開extract-files.sh,就看到里面其實都是拷貝文件的操作。那么你解壓從官方獲取的cm10.1的rom壓縮包,逐個拷貝相應文件到源碼環境相應目錄,並編輯相應目錄的mk文件,加入 "PRODCUT_COPY_FILES + =..." 這樣的語句也是可以的,但是很麻煩!
以下開始真正編譯:
$ croot
$ brunch captivatemtd
編譯過程中遇到錯誤了不要怕,百度google吧。。。親。。。編譯完成后的ROM在out目錄下,自己找找看!
二. 編譯 CyanogenMod官方 不支持 升級到 cm10.1 的機型ROM (例如 三星S5660, 三星S5830,LG-P509...)
這類設備不受CM官方支持升級到CM10.1, 他們有一些共同特點:低配、中低配、中配、RAM小、CPU頻率低、CPU采用ARM-V6指令集等。我認為最主要的原因是CPU采用ARM-V6指令集的問題,ARM-V6 指令集沒有ARM-V7指令集的指令廣,一個很顯著的表象就是ARM-V6機器在網頁上不能直接看在線flash! Android4.2.2基線的linux內核比較新,如果強制將這些機器升級到cm10.1,相機應用是個瓶頸!我們在網上看到這些低配機器的cm10.1,是因為其他團隊或個人 基於CM的代碼、專有內核(往往不是最新的linux 3.*內核)、驅動 進行再次開發 ,經過不懈努力才取得的成果!
這里介紹下編譯這類手機cm10.1 ROM的方法:
a) 下載cm10.1源碼后, 首先明確你要支持的機型,並弄清楚這個機型的代號(比如三星S5660的代號是gio,三星S5830的代號是cooper),在 github 搜索 這個代號(比如 gio),找到類似下列的源碼資源(源碼必須有代表android4.2基線的分支):
android_device_samsung_msm7x27-common
android_kernel_samsung_msm7x27
這些就是需要的的! 依賴關系自己研究,呵呵! 這個時候你還不能高興,就算你找到這些了,你編譯成功了,ROM還是不能用,。。。你得點進去看看這是哪個牛逼的人 貢獻的代碼,並進入他的github主頁,
(branch這里應該是jellybean或者cm-10.1或者其他代表android4.2的基線分支)
點擊“Jellaxy” 進入這個人的主頁后,你會發現他fork並維護了很多項目,仔細閱讀下這些項目的說明和提交記錄,我們需要使用其中一些項目替換自己下載的CM源碼項目,比如替換framework/av目錄等!
b) ubuntu文件瀏覽界面,CTRL+H 使隱藏目錄可見,然后在 ~/myandroid/.repo/ 目錄下 新建 local_manifest.xml,在其中添加以下內容:
<remove-project>節點表示刪除CM源碼項目,<project>則表示使用這個節點的項目,特別注意的是你下載cm源碼的時候使用的是分支cm-10.1,如果這個project的分支名 是代表android4.2的基線,但
不等於cm-10.1,那么你在project節點上必須加上 version="branch名稱,例如jellybean".
c> 重新同步,會下載local_manifest.xml 中補充的代碼源!
$ cd ~/myandroid/
$ repo sync
d) 同步完成后,你就得到了這個設備的內核和驅動以及部分 閉源 的庫 和依賴文件! 依次執行下列命令
$ cd ~/myandroid/vendor/cm
$ ./get-prebuilts //
(只需執行一次,以后編譯無需執行)
$ cd ~/myandroid
$ source build/envsetup.sh
接下來你要准備 真機,並且已經刷上了CM10.1的ROM,已root,與電腦連接,且在你的ubuntu系統上執行命令 adb devices 可以識別這台設備!(如果無法識別,自己百度google去)
$ cd ~/myandorid/device/samsung/gio
$ chmod a+x extract-files.sh
$ ./extract-files.sh
開始編譯:
$ lunch cm_gio-eng
$ make
或者 $ brunch gio
等價於 以上兩條命令
注意:如果 ~/myandroid/device/samsung/gio/ 目錄下沒有 extract-files.sh 腳本,那么你從CM官方android_device_samsung_gio,branch為cm-7的分支下復制一個腳本補充下,或者打開本地
~/myandroid/vendor/samsung/gio
~/myandroid/vendor/samsung/msm7x27-common
這兩個目錄下的 mk文件, 你會發現 mk文件中很多 "PRODCUT_COPY_FILES + =..." 這樣的語句, 細心的對比 這兩個目錄下包含的文件 和 你從網上下載的ROM中system/lib下的文件, 缺少什么文件,你就復制一個文件到vendor/samsung下對應深層目錄,然后在mk中寫一句 "PRODCUT_COPY_FILES + =..." 這樣的語句,以后你就不需要執行 extract-files.sh腳本了!
當然,你也可以跳過執行extract-files.sh腳本,先保證把源碼編譯通過后,對比你編譯產生的ROM和網上的ROM,少了什么依賴文件,你就根據這個自己寫extract-files.sh腳本唄!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
對於采用高通msm7x27平台的中低配手機,包括 三星S5660,三星S5830,中興skate,中興blade,LG-P500,LG-P505,LG-P506,LG-P509等手機,androidarmv6團隊已經整合了全套代碼!可以摒棄上列復雜步驟,extract-files.sh腳本也不需要! 注意下載源碼的時候直接下載androidarmv6團隊整合過的源碼,所有步驟如下:
$ mkdir myandroid
$ cd myandroid
$ repo init -u git://github.com/androidarmv6/android.git -b cm-10.1
$ repo sync
$ cd ~/myandroid/vendor/cm
$ ./get-prebuilts //
(只需執行一次,以后編譯無需執行)
$ cd ~/myandroid
$ source build/envsetup.sh
$ brunch DEVICENAME (for ex: brunch gio)
小結:無論你是編譯什么ROM,一定要有足夠的耐心,特別是對中低配機型,因為官方不支持升級到 cm-10.1, 整合起來真的很麻煩,需要慢慢摸索 !如果遇到編譯問題,通過百度
Google慢慢摸索解決! 如果驅動內核實在編譯不過,而自己技術水平有限,不妨換套代碼,找其他大神的github主頁換套內核驅動!既然是整合,就不僅僅是內核驅動的問題,你還可能要
替換一下framework等源代碼! 我第一次整合三星S5660的cm10代碼花費了半個月,后來直接使用androidarmv6團隊的cm10.1代碼,也花費了一周...蹦擦擦啊。。