ROM包詳解


rom里有什么?

解壓縮后可以看到rom里有三個文件,其中boot.img是更新boot分區所需要的文件。這個boot.img主要包括kernel+ramdisk。system/目錄的內容在升級后會放在系統的system分區。主要用來更新系統的一些應用或則應用會用到的一些庫等等。

META-INF目錄下主要有六個文件:

(1).update-binary是一個二進制文件,相當於一個腳本解釋器,能夠識別updater-script中描述的操作。該文件在Android源碼編譯后out/target/product/xxx/system bin/updater生成,可將updater重命名為update-binary得到。(該文件在具體的更新包中的名字由源碼中bootable/recovery/install.c中的宏ASSUMED_UPDATE_BINARY_NAME的值而定)

(2).updater-script:此文件是一個腳本文件,具體描述了更新過程。我們可以根據具體情況編寫該腳本來適應我們的具體需求。(該文件的命名由源碼中bootable/recovery/updater/updater.c文件中的宏SCRIPT_NAME的值而定)

(3).metadata文件是描述設備信息及環境變量的元數據。主要包括一些編譯選項,簽名公鑰,時間戳以及設備型號等。

(4).這個manifest文件定義了與包的組成結構相關的數據。類似Android應用的mainfest.xml文件。

(5).CERT.RSA:與簽名文件相關聯的簽名程序塊文件,它存儲了用於簽名JAR文件的公共簽名。

(6). CERT.SF:這是JAR文件的簽名文件,其中前綴CERT代表簽名者。

 updater-script

根據流程圖,我們先來看看recovery的腳本文件updater-script

一大堆代碼正在靠近...

1 assert(getprop("ro.product.device") == "cooper" || getprop("ro.build.product") == "cooper" || getprop("ro.product.board") == "cooper" || getprop("ro.product.device") == "GT-S5830" || getprop("ro.build.product") == "GT-S5830" || getprop("ro.product.board") == "GT-S5830");  

2 package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");  

3  set_perm(0, 0, 0777, "/tmp/backuptool.sh");  

4 run_program("/tmp/backuptool.sh", "backup");  

5 show_progress(0.500000, 0);  

6 format("ext4", "EMMC", "/dev/block/stl12");  

7 mount("ext4", "EMMC", "/dev/block/stl12", "/system");  

8 package_extract_dir("recovery", "/system");  

9 package_extract_dir("system", "/system");  

10 symlink("busybox", "/system/xbin/[", "/system/xbin/[[",  

11 "/system/xbin/arp",   

12 "/system/xbin/ash",   

13 "/system/xbin/awk",  

14 "/system/xbin/base64",   

15 "/system/xbin/basename",   

16 "/system/xbin/bbconfig",  

17 ..........省略.............  

18 "/system/xbin/xz",   

19 "/system/xbin/xzcat",   

20 "/system/xbin/yes",  

21 "/system/xbin/zcat");  

22 symlink("toolbox", "/system/bin/cat", "/system/bin/cmp",  

23 "/system/bin/date", "/system/bin/dd",   

24 "/system/bin/getevent",  

25 ..........省略.............  

26 "/system/bin/vmstat", "/system/bin/watchprops",  

27 "/system/bin/wipe");  

28 set_perm_recursive(0, 0, 0755, 0644, "/system");  

29 ..........省略.............  

30 set_perm(0, 0, 06755, "/system/xbin/tcpdump");  

31 show_progress(0.200000, 0);  

32 show_progress(0.200000, 10);  

33 package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");  

34 set_perm(0, 0, 0777, "/tmp/backuptool.sh");  

35 run_program("/tmp/backuptool.sh", "restore");  

36 package_extract_file("system/bin/modelid_cfg.sh", "/tmp/modelid_cfg.sh");  

37 set_perm(0, 0, 0777, "/tmp/modelid_cfg.sh");  

38 run_program("/tmp/modelid_cfg.sh");  

39 package_extract_file("system/bin/verify_cache_partition_size.sh", "/tmp/verify_cache_partition_size.sh");  

40 set_perm(0, 0,0777, "/tmp/verify_cache_partition_size.sh");  

41 run_program("/tmp/verify_cache_partition_size.sh");  

42 show_progress(0.200000, 10);  

43 assert(package_extract_file("boot.img", "/tmp/boot.img"),  

44 write_raw_image("/tmp/boot.img", "boot"),  

45 delete("/tmp/boot.img"));  

46 show_progress(0.100000, 0);  

47 unmount("/system");  

 

代碼段1:

48  assert(getprop("ro.product.device") == "cooper" || getprop("ro.build.product") == "cooper" || getprop("ro.product.board") == "cooper" ||       getprop("ro.product.device") == "GT-S5830" || getprop("ro.build.product") == "GT-S5830" || getprop("ro.product.board") == "GT-S5830");  

這段代碼的含義是獲取手機信息,驗證你的手機到底是不是GT-S5830,否則將無法刷入。這是為了防止讓一些其他機型的小白誤刷咱們GT-S5830的Rom從而發生變磚的慘劇。不加這行的Rom所有機型都可以刷入,建議Rom同行或者補丁制作者們一定要加上,人性化關懷。當然,你不加這些,但在補丁或Rom發布時仔細說明適用機型的話也是可以的。代碼段2:

49 format("ext4", "EMMC", "/dev/block/stl12");  

50 mount("ext4", "EMMC", "/dev/block/stl12", "/system");  

51 package_extract_dir("recovery", "/system");  

52 package_extract_dir("system", "/system");   

這是非常重要的一段代碼,第一步,格式化EMMC為ext4格式,分區命名為"/dev/block/stl12,就是咱們常常說的system分區了;
第二步,以ext4格式將此分區掛載到/system掛載點;
最后,解壓縮Rom文件里的recovery和system目錄到/system。
這樣,Rom里的recovery和system文件夾下所有內容已經寫入system分區了。

代碼段3:

53 symlink("busybox", "/system/xbin/[", "/system/xbin/[[","/system/xbin/arp", "/system/xbin/ash", "/system/xbin/awk",         

54 ..........省略.............  

55 "/system/xbin/xz", "/system/xbin/xzcat",   

56 "/system/xbin/yes",          

57 "/system/xbin/zcat");  

58 symlink("toolbox", "/system/bin/cat", "/system/bin/cmp",  

59 ..........省略.............  

60 "/system/bin/vmstat", "/system/bin/watchprops",  

61 "/system/bin/wipe");  

62 set_perm_recursive(0, 0, 0755, 0644, "/system");  

63 ..........省略.............  

64 set_perm(0, 0, 06755, "/system/xbin/tcpdump");  

這是刷機腳本的主體,是最長的一段代碼。
symlink是創建xbin目錄下的各種工具與其存放路徑的鏈接,著名的busybox工具也在其中。set_perm是設置權限,類似Ubuntu下的chmod。這些代碼把相應的文件全部設置成正確的權限。
其中,set_perm_recursive(0, 0, 0755, 0644, "/system");與set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
是以遞歸方式將目錄及目錄下的文件設成相應的權限。
余下的代碼是把一些特殊的文件設置成需要的權限。

 

代碼段4:

65 assert(package_extract_file("boot.img", "/tmp/boot.img"),  

66 write_raw_image("/tmp/boot.img", "boot"),  

67 delete("/tmp/boot.img"));  

這段代碼的動作分三步

.將包中的boot.img提取到/tmp/boot.img。

2).將/tmp/boot.img鏡像文件寫入到boot分區。

3).刪除/tmp/boot.img。

代碼段5:

68 show_progress(0.100000, 0);  

69 unmount("/system");  

show_progress(p, t);是個顯示進程的腳本,即在t秒的時間內顯示的進度條增加p。
unmount("/system");卸載前面掛載的system分區。

 

至此,整個updater-script腳本已經差不多了。如果你想要制作內核單刷包,則只需要代碼段4和5就夠了,如果想要升級,則只需要package_extract_file("system/app", "/system/app")就可以完成基本功能。

 

System

System目錄下有很多文件:

app:放置系統軟件的目錄,所以內置軟件就是在制作Rom包的時候把apk文件放入此文件夾

bin:Android系統本地程序,主要是Linux系統自帶的組件

Etc文件夾:放置android系統配置文件,如apn文件等

Fonts文件夾:放置字體文件,包含標准字體和粗體、斜體、中文、英文等

Framework文件夾:放置android系統平台框架文件及布局控制

Lib文件夾:放置系統底層庫及運行庫文件

Media文件夾:放置系統鈴聲音樂文件夾及開機動畫文件,需要說明一下開機動畫其實是多張靜態圖片的幀動畫效果

Tts文件夾:放置手機的語音文件

Usr文件夾: 放置用戶文件,包含共享、鍵盤布局、時間區域文件等

Vendor文件夾:放置ROM廠商定制內容

Xbin文件夾:放置用戶系統支持程序文件

Build.prop文件:系統屬性配置文件,如我們在設置-關於里看到的內容

如果我們想要修改一些rom的東西,就得在這個文件夾下做動作了,如果對rom自帶的apk不敢興趣,可以將app文件夾下的apk刪除,也可以增加一些自己想要的apk進去;如果想要修改框架層的東西,就要修改Framework文件夾里的內容;如果想要修改開機畫面和系統鈴聲,就要修改Media文件夾里的內容;具體的修改方法會在后面說明。

 boot.img

boot.img是啟動分區boot的鏡像文件,而內核就在這個文件里面;如果我們解開這個img文件,會看到里面包含一個kernel文件、一個ramdisk.gz壓縮包;解壓ramdisk.gz會得到一個ramdisk文件;

kernel是最核心的東西,是不能亂改的(除非你知道你機器的硬件參數)

ramdisk映像是一個最基礎的小型文件系統,它包括了初始化系統所需要的全部核心文件,例如:初始化init進程以及init.rc(可以用於設置很多系統的參數)等文件,如果你您希望了解更多關於此文件的信息可以參考以下網址:
http://git.source.android.com/?p=kernel/common.git;a=blob;f=Documentation/filesystems/ramfs-rootfs-initramfs.txt
以下是一個典型的ramdisk中包含的文件列表:

70 ./init.機型名稱.rc  

71 ./default.prop  

72 ./proc  

73 ./dev  

74 ./init.rc  

75 ./init  

76 ./sys  

77 ./init.goldfish.rc  

78 ./sbin  

79 ./sbin/adbd  

80 ./system  

81 ./data  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM