|
這一段時間刷了一堆ROM,安卓係列、CM、Hero、OldMos、隔壁新出的Android2.0,反正都嘗了一下鮮,手機的照相機也刷得再也啓不來了(不知道什麽原因,杯具)。有話說:"久病成良醫",想我們折騰了這麽久的刷機,也得總結總結不是,小弟不才,遠沒成"良醫",但還是想把自己的一些認識和心得寫出來,以期拋磚引玉..., P1 U2 D& L" @. T/ Z* x! i
+ a* @1 `) m* W3 k) D# \" Q
; y+ W3 v( ~! Z& \ \# d" d
" k; N( _, e7 E1 Q- h, c1 t一、刷機原理
# Z/ B* Q; B& t+ i7 G+ X. f) }" N! C2 j% ?# j! a) ^
記得第一次刷機,哪個心理緊張啊。其實緊張什麽呢?就是因爲不明白原理啊,只看到一堆的教程來依葫蘆畫瓢,生怕錯了一步將手機變磚。真正使我對刷機原理有一些理解的是看了這一篇文章:點擊查看) S1 f5 L$ v- f# e4 e5 n4 s6 Y
( B0 I' J( A6 M7 K8 k* m說起來,刷機就是兩種方法:" M% @4 I, U; `$ w* e( \5 O
) _! r8 J8 p J( j. [$ ] Q" t* L9 l
一是recovery方法,就是我們平時將update.zip入到SD卡,然後alt-s的方法,這種方法是調用了recovery的方法將各種img或檔進行複制等操作。想瞭解recovery的工作原理嗎?我也沒找到好的資料,就在這看了看recovery的一些源碼:點擊查看
( q& _ B0 u+ {, B, T* V' s3 m1 F
二是fastboot方法,這個方法其實是比較酷的方法,說白點,fastboot就是將已有的各分區映象檔(img檔,意義上類似我們對光盤做的映象檔)直接覆蓋寫到指定分區中,有點暴力,也有點類似我們平時操作係統的Ghost還原。, A! {8 \6 _5 F
0 @$ l: K o1 z
這兩種方法哪種更好,這就不好比高低了,總的來說:* q& v' Z* H) k+ R$ U7 X+ W
/ G4 g- f! o* R! _( WRecovery方法更簡單,只需要傻瓜式的將update.zip放到SD卡的要目錄下,然後進入Recovery模式alt-s就可以了,但和任何傻瓜式東西一樣,他的靈活度就很小了,而且出錯了也都不知道如何解決。一般來說做Rom的高手爲了保證Rom的可靠性,在安裝程式中都會對一些安裝環境進行一些確定,而各位的手機環境又是千變萬化的,Rom高手也很難考慮周全,另外,Recovery程式本身也有一些環境驗證。1 k; A% x7 A# [3 i
0 O" @1 c7 L) {# Z+ L
fastboot方法更靈活,功能也更強大,fastboot方法不需要依賴於recovery,甚至linux底層刷壞了recovery模式都進不了的情況下也可以通過fastboot方工刷回來。fastboot模式其實是調用spl進行刷機的,所以如果刷spl壞了,fastboot模式應該也進不了,也就是磚了。fastboot方法需要各位電腦上有fastboot程式,同時手機要進入fastboot模式才可以操作,關於這些知識,請參見Google *^_^*
. @+ G! W- I# w, {) p9 ?5 q7 l |1 g1 }7 ?
! o0 x) q, L& q' f2 \8 w1 T二、回頭再來說說Android係統中的各分區(可能分區這個說法不太準確)
0 ?2 Z" J% S: L* \0 C- J" u n F; C3 A, t3 R: P
我瞭解到的Android係統中的分區有:0 _- o% O8 g7 ^ \6 @6 R
, m- ]3 L. z* `hboot(我們刷的SPL就是這玩意),這個分區是最基本的引導分區(類似電腦中的BIOS),這個區壞了,差不多就變磚了,所以我們刷SPL時才要如此小心啊。
& r4 v" E! U+ y9 S2 X- J' B2 V$ w) ~2 H$ t: I% v
boot,這個分區應該是linux操作係統的引導分區。! ~/ g& i8 K* o% q: v
& B7 R0 a/ m% E5 M
radio,這個分區是手機的一些底層設備相關的驅動或功能程式吧,如打電話和發短信等,不同的係統版本會有不同的radio配套,我們平時刷了高版本的ROM後,如果不刷高版本的Radio就有可能導致打電話不正常之類的。
9 x6 M% _9 a. ^8 g n! ~2 \1 t% W5 F7 z4 j; a
recovery,這個分區裝的就是前面提到的recovery程式了,這個刷不同的recovery版本可以帶來不同的功能,有興趣的同學可以基於recovery的源碼自己編譯出一個自己的recovery出來。但一般來說,刷recovery最主要的就是提Root權限。0 } B2 _& n8 E3 A0 o; k
; [! w$ ^. [4 m/ Z
system,是一般發布的ROM的主要功能程式分區了,我們說的ROM功能和自帶程式的定制應該就是基於這個分區的修改和編譯了。( u4 S3 \, B* |' Z# }- p9 ~5 V
' u; E0 u; ~2 w2 p+ @' M3 Y
userdata,用戶數據,不說了。
) n% A) {) c1 x0 v# E
% C: O$ n% ?5 L ], C; | Icache,緩存,一般是用來OTA升級時的緩存,我們說刷SPL可以增加程式區的空間大小就是主要將這個區的大小縮水了然後加大了程式區的分區大小。
3 L6 |: {7 _. z: W H- J) ?8 a) A8 L5 o" _
: A) R1 D; o! `: | c
三、一個典型ROM的剖析
2 v4 c1 B2 y7 Q+ O7 l
5 H% ~7 E6 Y( {' j0 J$ y! P( o$ M我們平時升級的Rom都是打包成適合Recovery方式刷機的包。能夠被Recovery程式識別並處理的包應該有一個固定的格式,我理解的一些重要的約束如下:, J# s% h" c7 A L% Y* f, g. V
. _5 i2 {2 w7 g, j$ P
1)必須是標準的zip壓縮包;
$ g& [# q8 l" M/ N7 z1 d$ T, |* {- F. d8 T9 E
2)recovery腳本必須存入在META-INF\com\google\android\update-script;6 @9 x2 m2 ^8 f& G. Q s0 E
& U& X0 x" E9 V! O8 g6 m& X
3)其他的一些證書和簽名資訊應該都放在\META-INF\下。
) S- \5 [5 r7 V' M1 m' b; ] t# h4 {; n5 s5 b
四、我們有沒有可能自己定制ROM呢# E( c6 }" C$ n. n! D
6 F0 x, F0 Y( j
理論上我們是可以自己定制的。
' C) j5 Q" e3 J" a) D# ]/ ?* h* V* J8 A7 E' A
最簡單的定制應該就是拿一個現有的認爲還不錯的基礎ROM,替換一些資源,加一些係統自帶程式,然後打包發布;: w9 m% C0 a( o( f& P
$ U$ p, [5 \1 l再玩高級一點,就應該自己去修改一些係統自帶的程式,如漢化一些係統原始程式;/ w' J( x! f5 h
( ^4 W! F# \) a
還玩高級一點,就應該自己到android官方站點去下載android係統的源碼來編譯,並基於係統級的定制和移植了,如現在火熱的android2.0源碼編譯係統移植。' c' e9 Y7 Y/ X& k* j
+ c+ y) x4 x2 ^! Z7 M6 o: I! X如果是簡單一點的自製ROM,主要應該會要解決如下幾個問題:2 X# U* _5 t- u/ x# @# G
" q9 x1 t) R8 C6 V1)選定一個比較好和穩定的內核和基礎,就是update.zip包中的哪個boot.img,另外,system目錄中大部分也是直接可用的,就可以作爲自定義Rom的基礎。+ p# \6 g0 \9 J X* S0 L' j4 S' F
. P1 q! w2 c4 f* a1 s( U0 K3 m2)修改係統。例如可以這樣來定制的東西:system\etc\apns-conf.xml,這是設置APN接入點的;system\etc\hosts,這是設置Host文件的,現在有很多人用的包綁定不了GMail,就可以在這個Host檔中增加一條:74.125.93.113 android.clients.google.com (當然,這個地址能用多久也不好說)...還有什麽東西要自己去定制就自己去翻看瞧瞧。
4 j* g/ U: J1 q% S# O
! `5 K$ S* R2 K* i; v, `* K" E- M3)Rom的重新打包簽名。前文已經介紹了一個Rom包的基本結構,但完全按照這個結構打包還是不能被Recovery安裝的,因爲沒有簽名!Rom簽名可以下載一個自動簽名工具Auto-sign,具體到哪下,請Google。(注:Rom簽名工具需要Java1.6支援,所以係統還得有JRE1.6的環境)。, n1 _: c* g. ?- q! G5 ]( n
8 \( |3 G1 Y0 \' g再往下就有點高深了,目前只留心一下這些基礎的東西,錯誤在所難免,歡迎指正,拍磚輕些。
' C" t) @' }9 K8 A1 _6 e' M( p: y& k8 ~% y9 A* G
原文作者: happylo |
|