android 單獨編譯某個模塊


  第一次下載好Android源代碼工程后,我們通常是在Android源代碼工程目錄下執行make命令,經過漫長的等待之后,就可以得到Android系統鏡像system.img了。以后如果我們修改了Android源代碼中的某個模塊或者在Android源代碼工程新增一個自己的模塊,是不是還是執行make命令呢?答案是否定的,Google為我們准備了另外的命令來支持編譯單獨的模塊,以及重新打包system.img的命令。在繼續學習Android源代碼之前,就讓我們先來看看這個命令吧。

      一. 首先在Android源代碼目錄下的build目錄下,有個腳本文件envsetup.sh,執行這個腳本文件后,就可以獲得一些有用的工具:

      USER-NAME@MACHINE-NAME:~/Android$ .  ./build/envsetup.sh

      注意,這是一個source命令,執行之后,就會有一些額外的命令可以使用:

      - croot: Changes directory to the top of the tree.

      - m: Makes from the top of the tree.
      - mm: Builds all of the modules in the current directory.
      - mmm: Builds all of the modules in the supplied directories.
      - cgrep: Greps on all local C/C++ files.
      - jgrep: Greps on all local Java files.
      - resgrep: Greps on all local res/*.xml files.
      - godir: Go to the directory containing a file.
      這些命令的具體用法,可以在命令的后面加-help來查看,這里我們只關注mmm命令,也就是可以用它來編譯指定目錄的所有模塊,通常這個目錄只包含一個模塊。
      二. 使用mmm命令來編譯指定的模塊,例如Email應用程序:
       USER-NAME@MACHINE-NAME:~/Android$ mmm packages/apps/Email/
      編譯完成之后,就可以在out/target/product/generic/system/app目錄下看到Email.apk文件了。Android系統自帶的App都放在這具目錄下。另外,Android系統的一些可執行文件,例如C編譯的可執行文件,放在out/target/product/generic/system/bin目錄下,動態鏈接庫文件放在out/target/product/generic/system/lib目錄下,out/target/product/generic/system/lib/hw目錄存放的是硬件抽象層(HAL)接口文件,后面的文章里面,我們會陸續提及到,敬請關注。
      三. 編譯好模塊后,還要重新打包一下system.img文件,這樣我們把system.img運行在模擬器上時,就可以看到我們的程序了。
       USER-NAME@MACHINE-NAME:~/Android$ make snod
 
make snod生成的system.img為sparse格式,system.img有raw ext4 image和 sparse ext4 image格式。
raw ext4 image,即經常說的raw image,使用file觀察它: 其特點是完整的ext4分區鏡像(包含很多全零的無效填充區),可以直接使用mount進行掛載,因此比較大。
另一種是sparse ext4 image,即經常說的simg,使用file觀察它:
?
1
2
$ file system.img
system.img: data
就是說是一個非常普通的dat文件。由於它將raw ext4進行稀疏描述,因此尺寸比較小(沒有全零的無效填充區,一般在300到500M之間)。
android本身提供了源代碼工具在兩者之間轉換,源代碼位於:
1
2
system/core/libsparse/simg2img.c // 將sparse image轉換為raw image;
system/core/libsparse/img2simg.c // 將raw image轉換為sparse image;

如果完整的進行過一次Android的編譯,默認會將simg2img當作主機工具編譯出來,放在out/host/linux-x86/bin/simg2img處。 但默認是不會編譯img2simg的,我們可以手工進行編譯:
?
1
2
3
$ . build/envsetup.sh
$ lunch aosp_hammerhead-userdebug
$ make img2simg_host

這樣就會編譯出out/host/linux-x86/bin/img2simg。 如果要將system.raw.img轉換為system.simg: $ img2simg system.raw.img system.simg
為了方便沒有源代碼的同學,這里提供img2simg的 下載 路徑: http://download.csdn.net/detail/howellzhu/8399215
對於simg2img,到處都可以找到了,還有 windows 版本的,這里就不提供了。 
 
參考:
2 《 Android中system.img的兩種格式及其相互轉換方法》
在此表示感謝。
 


免責聲明!

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



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