1. 程式人生 > >android 單獨編譯某個模組

android 單獨編譯某個模組

文章轉自:http://www.cnblogs.com/thinkinglife/p/4960486.html

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

      一. 首先在Android原始碼目錄下的build目錄下,有個指令碼檔案envsetup.sh,執行這個指令碼檔案後,就可以獲得一些有用的工具:

      [email protected]:~/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應用程式:       
[email protected]
:~/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執行在模擬器上時,就可以看到我們的程式了。       [email protected]:~/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的兩種格式及其相互轉換方法》 在此表示感謝。

相關推薦

android 單獨編譯某個模組

文章轉自:http://www.cnblogs.com/thinkinglife/p/4960486.html  第一次下載好Android原始碼工程後,我們通常是在Android原始碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統映象s

VS2017 單獨編譯QtWebEngine模組

一、必備的依賴1、必須安裝python 2.7以後的最新版本,才能編譯,python3是無法編譯的。2、提前編譯好qt的主體部分之後,才能編譯這個模組。二、編譯步驟執行vs環境:"C:\\Program Files (x86)\\Microsoft Visual Studio

[Android] 單獨編譯生成boot.img時mkbootfs: No such file or directory解決方法

在一臺沒有安裝Android原始碼編譯環境的64位 Ubuntu14.04.5虛擬機器上嘗試單獨編譯Android用的Linux Kernel。並從編譯好Android原始碼的機器上將out資料夾下的mkbootfs、minigzip、mkbootimg二進位制

單獨編譯Android原始碼中的某個模組

       眾所周知,編譯一個韌體要花很久時間。有時只改系統的某個模組的某個功能,如修改系統Setting原始碼的一些地方,這時就沒有必要再整個系統編譯一遍,這時就需要用到模組編譯(前提是系統已經編譯過一遍)。       下面以編譯A20平臺原始碼中的一個apk為例。

Android模組化(三)——模組可插拔單獨編譯執行

轉自: 下面主要來講一下單一模組的獨立編譯執行和插拔式的整合。 單一模組的獨立編譯執行   模組化的好處之一就是單一模組可以獨立的開發編譯執行安裝到使用者的手機上,這樣就方便了對某一模組的單獨開發除錯,單一模組生成的apk體積也小,編譯時間也快,開發效率會高很多

如何單獨編譯Android原始碼中的模組

      第一次下載好Android原始碼工程後,我們通常是在Android原始碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統映象system.img了。以後如果我們修改了Android原始碼中的某個模組或者在Android原始碼工程新增一個

單獨編譯Android原始碼中的模組

第一次下載好Android原始碼工程後,我們通常是在Android原始碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統映象system.img了。以後如果我們修改了Android原始碼中的某個模組或者在Android原始碼工程新增一個自己的模組

android 7.x 單獨編譯framework失效問題

近日在閱讀gotosleep息屏流程時,不能理解息屏動畫的執行流程,在 ObjectAnimate.java 與 ValueAnimate.java 中新增日誌資訊均不能輸出。二者均位於framework\base\core 資料夾中 編譯的步驟是: 1 cd 專案目錄 2 source build

Android 系統原始碼不編譯xxxTests模組的mk檔案註釋

1. 編譯xxxTests模組導致的編譯不過 build/core/Makefile:2789: warning: ignoring old commands for target `out/target/product/sp9832e_op54_go/sp9832e_op54_g

單獨編譯使用WebRTC的音訊處理模組

嚴以律己,寬以待人. 三思而後行. GMail/GTalk: yanglinbo#google.com; MSN/Email: tx7do#yahoo.com.cn; QQ: 3 0 3 3 9 6 9 2 0 .

android NDK 如何指定只編譯某個 目標

昨天想把ruby嵌到android上,發現ndk編譯的時候。會去編譯x86的 版本 = = 結果報錯。OTZ。 其實我之是希望能編一個arm的版本即可。 其實只要修改Application.mk 檔案  將其中的 APP_ABI := all 修改為 APP_ABI :=

Linux核心模組(Module)的單獨編譯

模組檔案 /* * file name: hello.c */ #include<linux/module.h> #include<linux/init.h>

IDEA單獨javac編譯某個java檔案

找到下面的terminal打命令,進入編譯目標所在資料夾,執行javac命令: E:\ideaPro2\Thread>cd src\com\sa\thread E:\ideaPro2\Thread\src\com\sa\thread>cd 練習\練習1 E:\ideaPro2\T

單獨編譯和使用webrtc音訊回聲消除模組(AEC)

1 int WebRtcAecTest() 2 { 3 #define NN 160 4 short far_frame[NN]; 5 short near_frame[NN]; 6 short out_frame[NN]; 7 8 void *aecmIn

Linux下使用核心原始碼單獨編譯某一模組

使用Linux在於折騰。生命不息,折騰不止。 在vmware中安裝了LinuxMint 18,自帶核心是4.4,於是自己手動將核心版本升級到了4.8,但是安裝新的核心後,發現vmware螢幕無法自動適應客戶機,於是 lspci -knn查看了下顯示模組,發現VGA沒有可用

centos7下用核心原始碼單獨編譯安裝KVM模組

準備:linux系統版本:CentOS-7-x86_64-DVD-1708   (其他系統也可以,核心版本對應就行)        核心版本3.10.0-693.el7.x86_64 1、官網獲取相應版本的核心原始碼,連結:http://vault.centos.org/。

android studio 匯入 Launcher2 模組,並編譯執行

AS 版本:2.3.3 aosp 版本: 4.4 (已經編譯過) launcher 目錄: .../packages/apps/ 下的 Launcher2 資料夾 詳細步驟: 1. 在 AS 中 新建一個專案:LauncherTest 2.在 專案中 新增一個

單獨編譯和使用webrtc音訊回聲消除模組(附完整原始碼+測試音訊檔案)

說實話很不想寫這篇文章,因為這和我一貫推崇的最好全部編譯並使用webrtc音訊處理模組相悖。可是不知不覺已經把降噪和增益寫出來,回聲消除如果使用者可以得到完美利用也不失為一個很好的方法。但是還是那句話,最好還是全部編譯和使用webrtc的整個音訊處理模組。另外這篇文章

在高通平臺Android環境下編譯核心模組

高通Android環境中Linux核心會作為Android的一部分進行編譯,直接使用make即可一次性從頭編到尾。而有的平臺比如Marvell,核心的編譯操作相對比較獨立,必須使用標準的核心編譯命令進行單獨編譯。一般來說,用高通的這種方式比較傻瓜化,一步到底的感覺;而用Mar

利用Android原始碼編譯一個自己寫的Hello World模組

這應該是我的Android底層開發第二篇文章,在編譯Android原始碼成功的基礎上又進一步利用Android原始碼編譯成功了一個自己寫的hello world,算入門第二步了。1、在android 原始碼路徑下的development路徑下建立hello路徑;2、建立he