轉自:http://www.g3top.com/
在此先要明確聲明一下:
由於android平台的更新換代過於頻繁,偶的做法不一定好用,也不一定完全正確(只是記錄一下偶在自己的nexus one上面做的一些實驗而已)。依照偶的做法出現了您的手機出現任何問題,偶都是不負責的喔!!
英文好的朋友可以不必看著偶聒噪,直接看英文官方的參考網站即可:
http://forum.xda-developers.com/showthread.php?t=566235
只用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的朋友可以嘗試此參數,雙核的朋友可以試試-j3,否則就老老實實運行make即可。
然後就是一個漫長的等待,這個時間大概有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
或者下載 win32 版本
http://jiggawatt.org/badc0de/android/index.html
注意你需要在cygwin.com下載 cygwin1.dll and cygz.dll (zlib0 package).
在linux下編譯方法非常地簡單,只需要下載原始碼,然後運行:
$ 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格式的工具包。
/Files/shenhaocn/autosign.zip
運行如下命令對刷機包進行簽名:
$ java -jar autosign.jar update.zip update_signed.zip
ok,簽名完畢後,就可以備份一下手機裡面的東西,測試一下了。
下面是相關的文章和內容
How to create your own ROM update.zip for the T-Mobile MyTouch
3G
Things you will need to perform this:
Java SE Dev Kit from Sun.
java.sun.com
May need Cygwin with zlib0 package, from
cygwin.com
This will give you Android 1.6 with all the Google
applications, Root access.
I never found one place where all this information
is all together, so that is why I compiled this together.
Now anyone can do
this themselves.
Thanks to all the hard work others have done before
this.
1.
First Root your phone and install a new Recovery image,
either Amon Ra or Cyanogens Recovery image.
Instructions for one-click root:
http://theunlockr.com/2009/08/22/how...-in-one-click/
2.
Download
the Android 1.6 System image from
http://developer.htc.com/google-io-device.html
extract
the contents of signed-google_ion-img-14721.zip.
3.
You now need to
extract the contents of system.img using a tool called unyaffs. The source code
is here:
http://code.google.com/p/unyaffs/downloads/list
Or download
a prebuilt win32 version here.
http://jiggawatt.org/badc0de/android/index.html
Note you
may also need cygwin1.dll and cygz.dll (zlib0 package). Found at
cygwin.com
Of course if you already have Cygwin installed with the GCC
packages, you can just compile it yourself. Then also
if you comment out the
line 67 to "// symlink(oh->alias, full_path_name);"
then it will not
create the copies of the symbolic link file, and you will not have to worry
about deleting duplicate
symbolic link files later.
Now in the
directory where system.img exists, create a new directory called "system"
go
into the "system" directory.
type the following command:
unyaffs
..\system.img
That should extract all the files from the system.img file
into the system directory.
4.
Now we just need to clean up some items.
Since the system.img is a linux file system, it has symbolic
links built
into it, but when we extracted it, it just created duplicate files, if you used
the prebuilt unyaffs.exe.
So we can just delete the duplicates and have a
script recreate the symlink on install.
So we need to delete some extra
files from the system\bin directory.
Run the attached DeleteExtras.bat file
from the same directory where system.img is in.
If you notice, all the files
it deletes are 28 byte files, and if you open them in notepad only
contain:
"!<symlink>toolbox..."
And we will remake the symbolic link
when it is installed.
5.
Now from the directory where the
system.img is, enter the following commands
mkdir META-INF
mkdir
META-INF\com
mkdir META-INF\com\google
mkdir
META-INF\com\google\android
Now copy the included file
"update-script.txt" into the "META-INF\com\google\android" directory
and
RENAME it to just "update-script".
This update-script gets run to recreate
the symbolic links.
Not sure if these two are needed but they are in some
custom ROMs here:
Copy the two files "fix_permissions" and "flash_image" to
the "system\bin" directory.
6.
-- Optional --
These add root
and Superuser access to the ROM, plus the Terminal Emulator
application.
Copy the file "su" from Cyanogen's rom to the folder
"system\bin"
Copy the file "Superuser.apk" to the folder "system\app"
Copy
the file "Term.apk" to the folder "system\app"
You can also replace the
"system\etc\apns-conf.xml" with a more complete one from here:
http://forum.xda-developers.com/showthread.php?t=547718
or
here
http://docs.google.com/Doc?docid=0AZ...g3ejN3eg&hl=en
Turn
data roaming off by default by editing line in the build.prop
file:
ro.com.android.dataroaming=false
Also to fix the Market program
to show "Protected" applications change the ro.build.fingerprint line to the
following:
ro.build.fingerprint=tmobile/opal/sapphire/sapphire:1.5/COC10/150449:user/ota-rel-keys,release-keys
Only
phones with a fingerprint of a "released" device can access some market
applications.
--------------
7.
Now we just need to create a
ZIP file for the final ROM
Zip up the following file and two
folders:
boot.img
META-INF
system
8.
Now sign the zip
file.
See here how to sign a ZIP file for flashing it.
http://androidforums.com/developer-1...ning-roms.html
9.
Copy
it to your SD card, boot into recovery, wipe, apply the update, Reboot.
You
are now running Android 1.6!
/Files/shenhaocn/update-script.txt
/Files/shenhaocn/DeleteExtras..txt