在此先要明確聲明一下:
由于android平臺的更新?lián)Q代過于頻繁,偶的做法不一定好用,也不一定完全正確(只是記錄一下偶在自己的nexus one上面做的一些實驗而已)。依照偶的做法出現(xiàn)了您的手機出現(xiàn)任何問題,偶都是不負(fù)責(zé)的喔??!
英文好的朋友可以不必看著偶聒噪,直接看英文官方的參考網(wǎng)站即可:
http://forum.xda-developers.com/showthread.php?t=566235只用android源代碼做一些簡單實驗的朋友可以參考下面這幾個網(wǎng)站:
http://nhenze.net/?tag=build-androidhttp://developer.htc.com/adp.html說起android刷機包,聽起來非常神秘,實際上它僅僅是一個經(jīng)過數(shù)字簽名的zip壓縮包而已。如果要自己制作刷機包,則必須了解刷機包的基本工作原理,偶首先從android系統(tǒng)的啟動說起:
android系統(tǒng)啟動的時候,首先會進行一些諸如硬件自檢之類的操作,這些操作完成以后(至少它應(yīng)該知道當(dāng)前的機器有沒有電),會檢查一下當(dāng)前手機按鍵的狀態(tài)(接下來就是所謂刷機模式切換了,不同的android手機有不同的按鍵組合用來進入刷機模式),如果此時按鍵狀態(tài)處于刷機組合,那么系統(tǒng)會調(diào)用ROM里面的一個叫做recovery的程序(這時就是進入了所謂的刷機程序了,它只是一個工具性質(zhì)程序,用于檢查刷機包的完整性和數(shù)字簽名的合法性。對于目前大多數(shù)root過的機器而言,數(shù)字簽名的合法性都不會成問題,然后由recovery程序?qū)⑺C包進行解壓,然后把刷機包里面的文件寫入到ROM中去,以此完成刷機過程);如果此時按鍵沒有標(biāo)明是刷機模式,那么系統(tǒng)會創(chuàng)建內(nèi)存盤,開始從ROM里面載入相應(yīng)的文件系統(tǒng),并把相關(guān)的文件拷貝到內(nèi)存盤中,進而引導(dǎo)linux啟動,然后是啟動虛擬機dalvik,然后就是創(chuàng)建工作進程載入和運行framework,然后就會看到待機的畫面。當(dāng)然在這個過程中還發(fā)生了許多事情,啟動了許多服務(wù),為了簡化起見,對于啟動過程偶只講解到此,感興趣的朋友可以自己結(jié)合著linux的啟動過程加以對比來學(xué)習(xí)。
現(xiàn)在來總結(jié)一下,實際上刷機包就是一個ROM文件的壓縮包,進入刷機模式后,recovery程序會把刷機包里面的文件寫入ROM存儲區(qū)替換ROM存儲區(qū)的原有文件;當(dāng)下次啟動手機的時候,會從ROM中載入剛剛替換過的文件,并利用這些文件來啟動和運行系統(tǒng)。這就是刷機包的全部功能和作用,看不懂的朋友可以反復(fù)看幾次,刷機的本質(zhì)就是文件的覆蓋和替換操作,偶相信各位一定能看懂!
OK,現(xiàn)在大家已經(jīng)知道ROM文件的zip壓縮包就是所謂的刷機包。制作刷機包的過程就是準(zhǔn)備這些文件,然后重新把這些文件壓縮成一個zip包的過程,在制作的最后,使用簽名工具簽個名,就可以測試和發(fā)布刷機包了。雖然說起來就是一句話的事情,但是實際上準(zhǔn)備這些文件的過程是非常痛苦和漫長的。
那么update.zip壓縮包里面的都包含哪些文件?這些文件又都是如何做出來的呢?hoho,現(xiàn)在開始漸漸接觸到問題的本質(zhì)了,解壓縮這個update.zip壓縮包以后我們可以看到兩個目錄和一個文件:
boot.img <---文件,這是編譯內(nèi)核源代碼生成的內(nèi)核映像,然后與android源碼編譯出來的ramdisk.img一起通過mkbootimg工具創(chuàng)建出來的,圖省事的朋友也可以從網(wǎng)上其他的刷機包里面拷貝一個能用的出來即可,基本上都差不多。
META-INF <---目錄,這個目錄是手工創(chuàng)建的,主要用來存放一個升級腳本update-script(這個腳本的內(nèi)容與system目錄中包含的文件有很大關(guān)聯(lián))以及保存若干刷機包內(nèi)的apk文件的簽名。
system <---目錄,這個目錄就是編譯android的平臺源代碼生成的,
其實最好的學(xué)習(xí)方式就是把現(xiàn)在互聯(lián)網(wǎng)上的那些update.zip包給解包,然后自己一個一個文件地看和分析,然后修改,嘗試做自己的刷機包。
對于這個boot.img,基本思路是編譯android kernel代碼,生成內(nèi)核image然后利用mkbootimg感興趣的朋友可以參考下面這兩個wiki網(wǎng)站:
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Imageshttp://android-dls.com/wiki/index.php?title=Replace_Recovery_Partition下面的做法偶都是在linux下面完成的(slackware 13.1):
(1)下載和編譯android的源代碼,具體過程不再贅述
如果各位還不知道repo sync之類的命令的話,可以參考網(wǎng)上的關(guān)于下載android源代碼以及編譯的文章,據(jù)偶所知這些文章非常豐富。編譯之前一定要注意平臺的選擇,不同平臺的驅(qū)動程序是不一樣的!這些參數(shù)可以通過:
$ cd android-src <---進入android的源代碼目錄
$ . build/envsetup.sh <---設(shè)置環(huán)境變量,運行完畢后,你可以輸入一下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的朋友可以嘗試此參數(shù),雙核的朋友可以試試-j3,否則就老老實實運行make即可
。
然后就是一個漫長的等待,這個時間大概有1-2小時左右(偶的機器比較慢),完全編譯完畢以后硬盤的占用大概需要8個G左右。
(2)編譯完成以后,進入wayne@wayne:~/android-src/out/target/product/generic目錄,應(yīng)該會看到如下的文件:
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里面都有什么呢?這里面的東西其實就是當(dāng)前目錄下的一個叫做system的目錄里面的內(nèi)容了,只是保存成了yaffs文件系統(tǒng)的格式。我們可以通過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進行解包,然后修改里面的內(nèi)容了。
unyaffs使用方法非常簡單:
$ unyaffs system.img [回車]
即可將system.img解包成一個叫做system的目錄,里面包含了整個android的文件系統(tǒng)
(3)剛剛開始,不適合一切從頭來,還是老實一些,先從修改別的大牛們做得刷機包開始吧
首先拷貝一個從網(wǎng)上下載下來的刷機包,然后找一個目錄解壓縮(當(dāng)然,這是最保險的做法,自己做這些目錄也沒有任何問題,只是比較費時間而已)
$ unzip xxxxxx.zip <--- 這個xxxxx.zip就是從網(wǎng)上下載的某刷機包(一定要跟你的代碼版本基本一致喔,偶在這里用的是2.1的刷機包)
(4)替換原有的system目錄
解壓縮刷機包以后,會看到在開篇的時候提到的兩個目錄,一個文件:
boot.img
META-INF
system
好了,可以把system目錄拷貝到別的路徑下備份一給,防止這些修改發(fā)生別的問題。然后把wayne@wayne:~/android-src/out/target/product/generic這個目錄下面的system拷貝到當(dāng)前的工作目錄下。注意,這個system目錄里面有很多“符號鏈接”指向了toolbox。這些鏈接其實沒啥用,可以通過后面的update-script自動進行創(chuàng)建的,因此,需要用一個腳本把這些鏈接都刪掉。
可以參考:
http://forum.xda-developers.com/showthread.php?t=566235這個網(wǎng)頁附件給出來的DeleteExtras.txt改寫成一個DeleteExtras.sh腳本來清除這些符號鏈接。
(5)修改update-script腳本
修改META-INF/com/google/android目錄下的那個叫做update-script的腳本,只要修改一下即可,主要是刪除一些不存在的文件以及增加一些文件的權(quán)限之類的定義(語法十分清晰,一目了然)。把需要“預(yù)裝”到刷機包里面的apk安裝程序都準(zhǔn)備好,將這些apk拷貝到system/app目錄下即可。那個boot.img能不改就不改,因為這東西涉及到驅(qū)動和內(nèi)核的問題,出了問題刷機包就啟動不了了。
(6)重新打包成update.zip
$ zip -r update.zip . <---注意這最后的“.”是必不可少的,代表是當(dāng)前路徑下的意思。
(7)為做好的刷機包簽名
在上面提到的鏈接中,有一個叫做AutoSign的工具,打開一看是一個jar格式的工具包。
/Files/shenhaocn/autosign.zip
運行如下命令對刷機包進行簽名:
$ java -jar autosign.jar update.zip update_signed.zip
ok,簽名完畢后,就可以備份一下手機里面的東西,測試一下了。
下面是相關(guān)的帖子和內(nèi)容
How to create your own ROM update.zip for the T-Mobile MyTouch 3GThings 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.htmlextract 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/listOr download a prebuilt win32 version here.
http://jiggawatt.org/badc0de/android/index.htmlNote 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 "http:// 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=547718or here
http://docs.google.com/Doc?docid=0AZ...g3ejN3eg&hl=enTurn 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.html9.
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
轉(zhuǎn)自:http://www.g3top.com/
轉(zhuǎn)自:http://www.cnblogs.com/shenhaocn/archive/2010/05/25/1743685.html