Android平台刷機包製作研究(1)

來源:互聯網
上載者:User

好久沒有上部落格來看看,甚至使用者名稱和密碼都記得不那麼真切了。言歸正傳,最近有朋友問偶如何製作android平台的刷機包的問題。總算說服自己研究一下 如何製作一個android平台的刷機包,可能我瞭解的方法還不是很全面,也走了不少的彎路,但是以此做為一串探索的足跡,希望能為來者節約寶貴的時間, 也請對此感興趣的各位同仁盡量避免偶曾經犯過的錯誤。

在此先要明確聲明一下:
由於android平台的更新換代過於頻繁,偶的做法不一定好用,也不一定完全正確(只是記錄一下偶在自己的nexus one上面做的一些實驗而已)。依照偶的做法出現了您的手機出現任何問題,偶都是不負責的喔!!

英文好的朋友可以不必看著偶聒噪,直接看英文官方的參考網站即可:
http://forum.xda-developers.com/showthread.php?t=566235
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images

只用android原始碼做一些簡單實驗的朋友可以參考下面這幾個網站:
http://nhenze.net/?tag=build-android
http://developer.htc.com/adp.html

說起android刷機包,聽起來非常神秘,實際上它僅僅是一個經過數位簽章的zip壓縮包而已。如果要自己製作刷機包,則必須瞭解刷機包的基本工作原理,偶首先從android系統的啟動說起:

android 系統啟動的時候,首先會進行一些諸如硬體自檢之類的操作,這些操作完成以後(至少它應該知道當前的機器有沒有電),會檢查一下當前手機按鍵的狀態(接下來 就是所謂刷機模式切換了,不同的android手機有不同的按鍵組合用來進入刷機模式),如果此時按鍵狀態處於刷機組合,那麼系統會調用ROM裡面的一個 叫做recovery的程式(這時就是進入了所謂的刷機程式了,它只是一個工具性質程式,用於檢查刷機包的完整性和數位簽章的合法性。對於目前大多數 root過的機器而言,數位簽章的合法性都不會成問題,然後由recovery程式將刷機包進行解壓,然後把刷機包裡面的檔案寫入到ROM中去,以此完成 刷機過程);如果此時按鍵沒有標明是刷機模式,那麼系統會建立記憶體盤,開始從ROM裡面載入相應的檔案系統,並把相關的檔案拷貝到記憶體盤中,進而引導 linux啟動,然後是啟動虛擬機器dalvik,然後就是建立背景工作處理序載入和運行framework,然後就會看到待機的畫面。當然在這個過程中還發生了 許多事情,啟動了許多服務,為了簡化起見,對於啟動過程偶只講解到此,感興趣的朋友可以自己結合著linux的啟動過程加以對比來學習。

現 在來總結一下,實際上刷機包就是一個ROM檔案的壓縮包,進入刷機模式後,recovery程式會把刷機包裡面的檔案寫入ROM儲存區替換ROM儲存區的 原有檔案;當下次啟動手機的時候,會從ROM中載入剛剛替換過的檔案,並利用這些檔案來啟動和運行系統。這就是刷機包的全部功能和作用,看不懂的朋友可以 反覆看幾次,刷機的本質就是檔案的覆蓋和替換操作,偶相信各位一定能看懂!

OK,現在大家已經知道ROM檔案的zip壓縮包就是所謂的刷 機包。製作刷機包的過程就是準備這些檔案,然後重新把這些檔案壓縮成一個zip包的過程,在製作的最後,使用簽名工具簽個名,就可以測試和發布刷機包了。 雖然說起來就是一句話的事情,但是實際上準備這些檔案的過程是非常痛苦和漫長的。

那麼update.zip壓縮包裡面的都包含哪些檔案?這些檔案又都是如何做出來的呢?hoho,現在開始漸漸接觸到問題的本質了,解壓縮這個update.zip壓縮包以後我們可以看到兩個目錄和一個檔案:

boot.img   <---檔案,這是編譯核心原始碼產生的核心映像,然後與android源碼編譯出來的ramdisk.img一起通過mkbootimg工具建立出來的,圖省事的朋友也可以從網上其他的刷機包裡面拷貝一個能用的出來即可,基本上都差不多。

META-INF   <---目錄,這個目錄是手工建立的,主要用來存放一個升級指令碼update-script(這個指令碼的內容與system目錄中包含的檔案有很大關聯)以及儲存若干刷機包內的apk檔案的簽名。

system   <---目錄,這個目錄就是編譯android的平台原始碼產生的,

其實最好的學習方式就是把現在互連網上的那些update.zip包給解包,然後自己一個一個檔案地看和分析,然後修改,嘗試做自己的刷機包。

對於這個boot.img,基本思路是編譯android kernel代碼,產生核心image然後利用mkbootimg感興趣的朋友可以參考下面這兩個wiki網站:
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images

http://android-dls.com/wiki/index.php?title=Replace_Recovery_Partition

下面的做法偶都是在linux下面完成的(slackware 13.1):
(1)下載和編譯android的原始碼,具體過程不再贅述
如果各位還不知道repo sync之類的命令的話,可以參考網上的關於下載android原始碼以及編譯的文章,據偶所知這些文章非常豐富。編譯之前一定要注意平台的選擇,不同平台的驅動程式是不一樣的!這些參數可以通過:
$ cd android-src    <---進入android的原始碼目錄
$ . build/envsetup.sh <---設定環境變數,運行完畢後,你可以輸入一下help命令,看看google的團隊提供了多少有用的便利命令,這對於我們以後修改代碼重新編譯非常有協助。
$ lunch generic-eng   <---開始配置android的原始碼的編譯選項
運行上述命令後會看到如下輸出:
wayne@wayne:~/android-src$ lunch generic-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.1-update1
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ECLAIR
============================================

$ make -j2   <---只有雙核的CPU的朋友可以嘗試此參數,四核的朋友可以試試-j4,否則就老老實實運行make即可:D。

然後就是一個漫長的等待,這個時間大概有1-2小時左右(偶的機器比較慢),完全編譯完畢以後硬碟的佔用大概需要8個G左右。

(2)編譯完成以後,進入wayne@wayne:~/android-src/out/target/product/generic目錄,應該會看到如下的檔案:
android-info.txt  
data                 
obj                       
ramdisk.img  
sdk      
system      
userdata.img
clean_steps.mk    
installed-files.txt  
previous_build_config.mk  
root         
symbols  
system.img
這 裡的system.img是不是很眼熟?!對拉,這個就是刷機包裡面好像也有一個叫做什麼system的目錄,那麼這個system.img裡面都有什麼 呢?這裡面的東西其實就是目前的目錄下的一個叫做system的目錄裡面的內容了,只是儲存成了yaffs檔案系統的格式。我們可以通過unyaffs工具 來把system.img給解開來看看,就明白偶說話了。
unyaffs的代碼為:
http://code.google.com/p/unyaffs/downloads/list
編譯方法非常地簡單,只需要下載原始碼,然後運行:
$ gcc -c unyaffs.c
$ gcc -o unyaffs unyaffs.o
即可產生這個unyaffs的解包工具,利用這個工具就可以把自己產生的system.img進行解包,然後修改裡面的內容了。
unyaffs使用方法非常簡單:
$ unyaffs system.img [斷行符號]
即可將system.img解包成一個叫做system的目錄,裡麵包含了整個android的檔案系統(何為檔案系統?!如果提出這個問題的話,偶就不多說什麼了,回家啃啃大學裡面電腦專業的作業系統那本書吧)

(3)剛剛開始,不適合一切從頭來,還是老實一些,先從修改別的大牛們做得刷機包開始吧
首先拷貝一個從網上下載下來的刷機包,然後找一個目錄解壓縮(當然,這是最保險的做法,自己做這些目錄也沒有任何問題,只是比較費時間而已)
$ unzip xxxxxx.zip   <--- 這個xxxxx.zip就是從網上下載的某刷機包(一定要跟你的代碼版本基本一致喔,偶在這裡用的是2.1的刷機包)

(4)替換原有的system目錄
解壓縮刷機包以後,會看到在開篇的時候提到的兩個目錄,一個檔案:
boot.img
META-INF
system
好 了,可以把system目錄拷貝到別的路徑下備份一給,防止這些修改發生別的問題。然後把wayne@wayne:~/android-src/out /target/product/generic這個目錄下面的system拷貝到當前的工作目錄下。注意,這個system目錄裡面有很多“符號連結” 指向了toolbox。這些連結其實沒啥用,可以通過後面的update-script自動進行建立的,因此,需要用一個指令碼把這些連結都刪掉。
可以參考:
http://forum.xda-developers.com/showthread.php?t=566235
這個網頁附件給出來的DeleteExtras.txt改寫成一個DeleteExtras.sh指令碼來清除這些符號連結。

(5)修改update-script指令碼
修 改META-INF/com/google/android目錄下的那個叫做update-script的指令碼,只要修改一下即可,主要是刪除一些不存在 的檔案以及增加一些檔案的許可權之類的定義(文法十分清晰,一目瞭然)。把需要“預裝”到刷機包裡面的apk安裝程式都準備好,將這些apk拷貝到 system/app目錄下即可。那個boot.img能不改就不改,因為這東西涉及到驅動和核心的問題,出了問題刷機包就啟動不了了。

(6)重新打包成update.zip
$ zip -r update.zip .   <---注意這最後的“.”是必不可少的,代表是當前路徑下的意思。

(7)為做好的刷機包簽名
在上面提到的連結中,有一個叫做AutoSign的工具,開啟一看是一個jar格式的工具包。可是讓人鬱悶的是這個工具包的作者在製作jar包的時候,忘記了在MANIFEST.MF中添加一個叫做:
Main-Class: testsign
的入口指定,偶重新折騰了一下,總算是利用手頭的工具,重新做了一個jar包,才解決這個問題。
為了方便大家的使用,偶將這個修改後的簽名工具做為附件貼出來,以節約大家的時間。
另外,需要提一下的是,這個簽名工具是使用jdk1.6.10的jdk製作的,因此,要求各位的java配套工具的版本一定要滿足。
運行如下命令對刷機包進行簽名:
$ java -jar testsign.jar update.zip update_signed.zip

ok,簽名完畢後,就可以備份一下手機裡面的東西,測試一下了。

祝各位好運!

 

http://blog.chinaunix.net/link.php?url=http://blogimg.chinaunix.net%2Fblog%2Fupfile2%2F100310105708.gz

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.