編輯:Android資訊
工欲善其事,必先利其器,對於想要深入學習Android源碼,必須先掌握Android編譯命令.
關於Android Build系統,這個話題很早就打算整理下,遲遲沒有下筆,決定跟大家分享下。先看下面幾條指令,相信編譯過Android源碼的人都再熟悉不過的。
source /opt/android1204_17.conf source setenv.sh lunch make -j12
記得最初剛接觸Android時,同事告訴我用上面的指令就可以編譯Android源碼,指令雖短但過幾天就記不全或者忘記順序,每次編譯時還需要看看自己的雲筆記,冰冷的指令總是難以讓我記憶。後來我決定認真研究下這個指令的含義。知其然還需知其所以然,這樣能更深層次的理解並記憶,才能與自身的知識體系建立強連接,或許還有意外收獲,果然如此,接下來跟大家分享一下在研究上述幾條指令含義的過程中,深入了解到的Android Build(編譯)系統。
准備好編譯環境後,編譯Android源碼的第一步是 source build/envsetup.sh
,其中source命令就是用於運行shell腳本命令,功能等價於”.”,因此該命令也等價於. build/envsetup.sh
。在文件envsetup.sh
聲明了當前會話終端可用的命令,這裡需要注意的是當前會話終端,也就意味著每次新打開一個終端都必須再一次執行這些指令。起初並不理解為什麼新開的終端不能直接執行make指令,到這裡總算明白了。
接下來,解釋一下本文開頭的引用的命令:
source /opt/android1204_17.conf //初始化jdk環境變量(這個不是必需的,因廠商而異) source setenv.sh //初始化編譯環境,包括後面的lunch和make指令 lunch //指定此次編譯的目標設備以及編譯類型 make -j12 //開始編譯,默認為編譯整個系統,其中-j12代表的是編譯的job數量為12。
所有的編譯命令都在envsetup.sh
文件能找到相對應的function,比如上述的命令lunch
,make
,在文件一定能找到
function lunch(){ ... } function make(){ ... }
source envsetup.sh
,需要cd到setenv.sh文件所在路徑執行,路徑可能在build/envsetup.sh,或者integrate/envsetup.sh,再或者不排除有些廠商會封裝自己的.sh腳本,但核心思路是一致的。
具體實現這裡就不展開說明,下面精煉地總結了一下各個指令用法和功效。
下面列舉部分模塊的編譯指令:
上述mmm命令同樣適用於mm/mma/mmma,編譯系統采用的是增量編譯,只會編譯發生變化的目標文件。當需要重新編譯所有的相關模塊,則需要編譯命令後增加參數-B
,比如make -B [module_name],或者 mm -B [module_path]。
Tips:
m、mm、mmm、mma、mmma
這些命令的實現都是通過make
方式來完成的。上述指令用法最終實現方式都是基於grep
指令,各個指令用法格式:
xgrep [keyword] //x代表的是上表的搜索指令
例如,搜索所有AndroidManifest.xml文件中的launcher
關鍵字所在文件的具體位置,指令
mangrep launcher
再如,搜索所有Java代碼中包含zygote所在文件
jgrep zygote
又如,搜索所有system_app的selinux權限信息
sepgrep system_app
Tips: Android源碼非常龐大,直接采用grep來搜索代碼,不僅方法笨拙、浪費時間,而且搜索出很多無意義的混淆結果。根據具體需求,來選擇合適的代碼搜索指令,能節省代碼搜索時間,提高搜索結果的精准度,方便定位目標代碼。
Tips: 當每次修改完某個文件後需要編譯時,執行cproj
後會跳轉到當前模塊的根目錄,也就是Android.mk文件所在目錄,然後再執行mm指令,即可編譯目標模塊;當進入源碼層級很深後,需要返回到根目錄,使用croot
一條指令完成;另外cd -
指令可用於快速切換至上次目錄。
上述只是列舉比較常用的指令,還有其他指令,而且不同的build編譯系統,支持的指令可能會存在一些差異,當忘記這些編譯指令,可以通過執行hmm
,查詢指令的幫助信息。
最後再列舉兩個比較常用的指令:
rm -rf out/
frameworks/base/api
;Android 編譯系統是Android源碼的一部分,用於編譯Android系統,Android SDK以及相關文檔。該編譯系統是由Make文件、Shell以及Python腳本共同組成,其中最為重要的便是Make文件。關於編譯系統可參考 理解 Android Build 系統。
整個Build系統的Make文件分為三大類:
/build/core
,其他Make文件都是基於該框架編寫的;/device
,該目錄下往往又以公司名和產品名劃分兩個子級目錄,比如/device/qcom/msm8916
;經過make
編譯後的產物,都位於/out目錄
,該目錄下主要關注下面幾個目錄:
在/out/target/product/[product_name]目錄下,有幾個重量級的鏡像文件:
當然還有boot.img,reocovery.img等鏡像文件,這裡就不介紹了。
在源碼樹中每一個模塊的所有文件通常都相應有一個自己的文件夾,在該模塊的根目錄下有一個名稱為“Android.mk” 的文件。編譯系統正是以模塊為單位進行編譯,每個模塊都有唯一的模塊名,一個模塊可以有依賴多個其他模塊,模塊間的依賴關系就是通過模塊名來引用的。也就是說當模塊需要依賴一個jar包或者apk時,必須先將jar包或apk定義為一個模塊,然後再依賴相應的模塊。
對於Android.mk文件,通常都是以下面兩行
LOCAL_PATH := $(call my-dir) //設置當編譯路徑為當前文件夾所在路徑 include $(CLEAR_VARS) //清空編譯環境的變量(由其他模塊設置過的變量)
為方便模塊編譯,編譯系統設置了很多的編譯環境變量,如下:
針對這些環境變量,編譯系統還定義了一些便捷函數,如下:
示例:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 獲取所有子目錄中的Java文件 LOCAL_SRC_FILES := $(call all-subdir-java-files) # 當前模塊依賴的動態Java庫名稱 LOCAL_JAVA_LIBRARIES := com.gityuan.lib # 當前模塊的名稱 LOCAL_MODULE := demo # 將當前模塊編譯成一個靜態的Java庫 include $(BUILD_STATIC_JAVA_LIBRARY)
圖片加載在Android開發中是非常重要,好的圖片加載庫也比比皆是。ImageLoader、Picasso、Glide、Fresco均是優秀的圖片加載庫。 以上
Android網路功能很強大,WebView組件支持直接加載網頁,可以將其視為一個浏覽器,要實現該功能,具體步驟如下 1、在布局文件中聲明WebView 2、在A
基於Android 6.0的源碼,剖析存儲架構的設計 Android 存儲系統之源碼篇 Android 存儲系統之架構篇 一、概述 本文講述Android存儲系統
在Android Support Library19.1版本中,Android工具小組引入了幾個很酷的注解類型,供開發者在工程中使用。Support Librar