編譯

BoardConfig.mk(device文件夾裏):該文件用來配置硬件主板,它其中定義的都是設備底層的硬件特性。例如:該設備的主板相關信息,Wifi 相關信息,還有 bootloader,內核,radioimage 等信息。對於該文件的示例,請參看 Android 源碼樹已經有的文件。html

vendorsetup.sh:該文件中做用是經過 add_lunch_combo 函數在 lunch 函數中添加一個菜單選項。該函數的參數是產品名稱加上編譯類型,中間以「-」鏈接,例如:add_lunch_combo full_lt26-userdebug。/build/envsetup.sh 會掃描全部 device 和 vender 二 級目 錄下的名稱 爲"vendorsetup.sh"文件,並根據其中的內容來肯定 lunch 函數的 菜單選項。java

 

使用「include FILENAMES...」,make程序處理時,若是「FILENAMES」列表中的任何一個文件不能正常讀取並且不存在一個建立此文件的規則時make程序將會提示錯誤並退出。linux

使用「-include FILENAMES...」的狀況是,當所包含的文件不存在或者不存在一個規則去建立它,make程序會繼續執行,只有真正因爲不能正確完成終極目標的重建時(某些必需的目標沒法在當前已讀取的makefile文件內容中找到正確的重建規則),纔會提示致命錯誤並退出。android

 

Make[flag][macro_definition][targets]c++

Makefile文件中:sql

.PHONY: cts  //target:cts 一個target會定義一些規則shell

 

$ . build/envsetup.sh          //配置選項,並編譯android源碼
$ make cts                                 //android源碼編譯好後,在編譯cts數據庫

查看源碼版本

build\core\version_defaults.mk //搜索該文件中的 PLATFORM_VERSION值

 

m:編譯全部的模塊 
mm:編譯當前目錄下的模塊,當前目錄下要有Android.mk文件 
mmm [dir]:編譯指定路徑下的模塊,指定路徑下要有Android.mk文件 api

Makesnod:修改了out/target中的內容,在源碼根目錄使用後,能夠生成新的img安全

 

單獨編譯模塊

   1> source build/envsetup.sh:加載命令

   2> lunch:選擇平臺編譯選項(選擇本身產品自定義的編譯選項)

   3> make:執行編譯

Make clean/make distclean

0)Kernel編譯使用JLB帶的編譯器, Android自成Boot.img, recovery.img須要zImage. 因此上面Clone下來的代碼須要放在同一目錄下

1)uboot

#> cd UBOOT_DIR

#> vi Makefile    //修改CROSS COMPILE路徑, 默認爲/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-, 相符可跳過

#> make tg4_dvt_config

#> make -j4

2)Kernel

#> cd KERNEL_DIR

#> ./build_kernel.sh tg4_dvt wqxga

3)Android

#> cd ANDROIR_DIR

#> ./build.sh tg4_dvt

 

編譯sc1 kernel:

1.make sc1_dvt1_defconfig

2.make

 

make snod   //把system文件夾打包爲system.img

注:經過mmm packages/providers/ContactsProvider/ 編譯後的apk在 out/target/product/generic/system/app

make 2&>txt

將make的信息輸出到txt中,若是make > txt則沒法輸入

Linux Shell 環境中支持輸入輸出重定向,用符號"<"和">"來表示。0、1和2分別表示標準輸入、標準輸出和標準錯誤信息輸出,能夠用來指定須要重定向的標準輸入或輸出

make &>test

表示標準和錯誤所有輸出

Eclipse :add to build path

Java Build Path是咱們編譯時所須要的包,在咱們import某個包的時候,若是沒有Java Build Path導入包的話,類裏面就會有紅叉,不可以識別這個類,複製到libs下是運行時所須要的包。若是用Add Buid Path導入包,可是沒有放在libs下程序也會報ClassNotFindException

Makefile

include $(BUILD_EXECUTABLE)表示要編譯成一個可執行文件(其實就是加載了$(BUILD_SYSTEM)/executable.mk),若是想編譯成動態庫則可用BUILD_SHARED_LIBRARY,這些能夠在$(YOUR_ANDROID)/build/core/config.mk查到。

LOCAL_PRIVILEGED_MODULE := true,以聲明app須要放在/system/priv-app下

LOCAL_MODULE:打出的庫名 or 指定爲用於註冊庫的 .xml 文件

LOCAL_AAPT_FLAGS: 引用其餘模塊的資源,將幾個模塊打成一個app

LOCAL_PACKAGE_NAMEpackage的名字,這個名字在腳本中將標識這個apppackage

LOCAL_JAVA_LIBRARIES:當前模塊依賴的 Java 共享庫。
 LOCAL_STATIC_JAVA_LIBRARIES:當前模塊依賴的 Java 靜態庫。

LOCAL_STATIC_LIBRARIES: 表示該模塊須要使用哪些靜態庫,以便在編譯時進行連接。
     LOCAL_SHARED_LIBRARIES:  表示模塊在運行時要依賴的共享庫(動態庫),在連接時就須要,以便在生成文件時嵌入其相應的信息。

A. 靜態庫的名字通常是libxxx.a;利用靜態函數庫編譯成的文件比較大,由於整個函數庫的全部數據都被整合進目標代碼中Android。建立命令:ar –cr。Makefile使用「include $(BUILD_STATIC_JAVA_LIBRARY)」指定建立爲靜態庫

B.動態庫又稱共享庫,這類庫的名字通常是libxxx.so;相對於靜態函數庫,動態函數庫在編譯的時候並無被編譯進目標代碼中,你的程序執行到相關函數時才調用函數庫裏的相應函數。建立命令:gcc –share。Makefile使用「include $(BUILD_JAVA_LIBRARY)」指定編譯爲動態庫。

C. 註冊第三方jar包。include $(BUILD_JAVA_LIBRARY) + include $(BUILD_PREBUILT)指定配置庫的xml(LOCAL_MODULE := com.qrd.plugin.feature_query.xml)

.jar 文件:/system/framework/ (framework中模塊的jar包打到這,第三方jar要xml中配置到這)
.xml 文件:/system/etc/permissions/

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES/LOCAL_PREBUILT_JAVA_LIBRARIES:利用外部jar包須要prebuilt

 

Avl7580 aricentimsclientsdk:

LOCAL_MODULE_SUFFIX := .jar

LOCAL_MODULE_CLASS := JAVA_LIBRARIES

 

LOCAL_MODULE := aricentimsclientsdk

 

LOCAL_SRC_FILES := aricentimsclientsdk.jar

 

#TARGET_OUT_JAVA_STATIC_LIBRARIES := out/target/common/obj/JAVA_LIBRARIES/aricentimsclientsdk_intermediates

#LOCAL_PROGUARD_FLAG_FILES := proguard.flags

 

include $(BUILD_PREBUILT)

 

 

$(call inherit-product-if-exists, device/.../xxx.mk)#指把xxx.mk(xxx.mk要存在)中的變量添加進來

 

修改google開放出來的類再進行編譯,可能出現下面報錯:

You have tried to change the API from what has been previously approved.

由於對javadoc的生成會產生影響。處理方法:

1,  添加 /**{@hide}*/ 修飾.  能夠直接對整個類進行修飾。

2,  就是想要生成的javadoc裏出現這個方法或變量,輸入: make update-api,即編譯時,輸入make update-api PRODUCT-***-eng,可是輸入 make PRODUCT-***-eng update-api 這樣是有問題的,由於後面的update-api會被忽略掉,這樣系統就會自動的把咱們新增的API 寫入 frameworks/base/api/current.xml 文件中。或者手動更新更新 frameworks/base/api/current.txt 文件。(或者須要先手動修改current.txt再make update-api)

3,  Android.mk LOCAL_SDK_VERSION := current 加了這個就不能調用了,沒加能夠調用

類或API是否開放,是經過doc的註釋{@hide}來控制的。非開放類,便是在android應用程序中沒法直接訪問的類。

 

LOCAL_AIDL_INCLUDES: 在aidl接口的函數中使用本身定義的類作參數,只需將該類實現Parcelable接口,而且將該類存放的路徑加入到LOCAL_AIDL_INCLUDES中,同時在該類的同一目錄下建立aidl文件,就能夠編譯了。

手動選屏

amoled屏: make avl8890_eng_defconfig make menuconfig platform selection -》 samsung Exynos -》hardware platform selection -》component selection 選 Support Video LCD S6E8FA0, unselect(*去掉) Support Video LCD Truely NT35596 tp選 Support Touch Screen ATMELMXTS, unselect(*去掉)Support Touch Screen SYNAPTICSRMI4 保存退出 make

SystemProperties

前綴必須用system\core\init\property_service.c中定義的前綴 ,進行系統屬性設置的程序也必須有system或root權限

若是咱們要添加一個property:例如:silvan_liu

路徑:system/core/rootdir/int.rc

在on post-fs-data 目錄下

 setprop persist.sys.silvan_liu 1//persist.sys 前綴名; 1爲初始值

前綴必須用system\core\init\property_service.c中定義的前綴這和int.rc的語法有關。

若是屬性名稱以「ro.」開頭,那麼這個屬性被視爲只讀屬性。一旦設置,屬性值不能改變。
若是屬性名稱以「persist.」開頭,當設置這個屬性時,其值也將寫入/data/property。

c++中對應JAVA的兩個函數就是property_set, property_get, JAVA是經過JNI調用這兩個函數實現屬性的設置和讀取。

在adb shell能夠經過如下的命名讀取和修改:

#getprop  persist.sys.language

#setprop   persist.sys.language  zh

在sc1項目中,自定義的屬性文件:

android4.2.2_JLB_SC1\device\sc1_dvt1\ system.prop

android4.3_JLB_SC1\device\sscr\sc1_dvt1\ system.prop

 

咱們能夠在下面文件中定義屬性:

\device\sscr\sc1_dvt1\system.prop

例如:

ro.wifi.support.cmcc=true

這樣,就能夠在代碼中經過「SystemProperties.get(「ro.wifi.support.cmcc」)」方法獲取定義好的屬性了。import android.os.SystemProperties;

最終,這些配置項會編譯到image的/system/build.prop中。

系統的設置存於/data/data/PACKAGE_NAME/shared_prefs中(SharedPreferences)。

Android.mk屬性定義

1,  device\sc1_dvt1\BoardConfig.mk

HAVE_WLAN_CMCC_FEATURE := true

2,wpa_supplicant_8\wpa_supplicant\Android.mk

ifeq ($(HAVE_WLAN_CMCC_FEATURE),true)    //能夠識別別的mk定義的屬性

L_CFLAGS += -DWLAN_CMCC_FEATURE

Endif

 

編譯時引入其餘包:

  • LOCAL_STATIC_JAVA_LIBRARIES :   //系統內部編出來的包
  • //直接引入的外部包,須要prebuilt

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := simplexml:libs/simple-xml-2.3.4.jar

LOCAL_STATIC_JAVA_LIBRARIES := \

simplexml \

Sqlite使用

繼承SQLiteOpenHelper,在OnCreate中建表,在onUpgrade中升級表。經過該類的getWritableDatabase和getReadableDatabase()能夠得到 SQLiteDatabase的對象,從而增刪改查表。

系統update原理

基於 android 系統的設備通常將存儲區間邏輯上分爲:引導區、內核區、 ramdisk 區間、 recovery 區、系統區、 cache 區間和數據區。

其中 reocvery 區間爲系統修復時候使用,其餘區間功能以下:引導區爲處理器上電固定的加載點,其存儲位置依據處理器不一樣而變化,對於支持從 nand 加載引導固件的處理器,能夠將引導區域直接放置到nandflash 中,通常佔據從 nand 的 block0 開始的一些區域。不然必放置處處理器支持的加載點如 norflash 等。

Boot 代碼負責操做系統的加載和升級,因爲 boot 才能從一些基本的數據源如串口、 usb 獲取升級數據,做爲處理器上電即加載和運行的這一區域一旦損壞則系統升級只能憑藉處理器內建原生的引導能力,這個過程大都須要專用工具或軟件才能完成。

內核區即 linux 內核保存位置,其和引導區在最終系統中對通常用戶都設計爲不能進行升級以維護基本系統的安全性。

Ramdisk 和 recovery 區間同標準 linux 中的 initrd ,引導程序根據啓動參數決定加載正常的 ramdisk 仍是 recovery 做爲 initrd 傳遞給內核,其中 recovery 區間爲修復系統使用,因爲其爲修復 / 升級系統的核心組件,通常也都設計爲對用戶不可改變。

系統區爲正常的 android 應用保存位置,通常設計爲對普通用戶屬只讀系統以保護主要系統的安全性,數據區爲用戶設置信息、優化後的 DEX 和系統數據庫保存位置,清空該區域會清除用戶的全部數據以及優化過的 DEX 文件,致使下一次啓動過程很長(須要從新建立 data 目錄中的缺省信息)。

Cache 區間爲升級過程使用的臨時存儲區。

升級過程主要流程描述以下:

1 boot 發現用戶按住升級按鍵,將 recovery.img 做爲 ramdisk 讀取到內存。

2 內核根據 ramdisk 中的 init.rc 執行 recovery 腳本。 Recovery 腳本在 sdcard 中找到升級文件後調用 recovery 程序依次作如下操做:

A 檢查升級文件的數字簽名是否可靠。檢查簽名使用的本地密鑰爲 /res/keys

B 若是簽名合法則執行提取壓縮包中 META-INF/com/google/android/update-binary 文件重命名到 /tmp/update_binary 並執行該文件。

C update_binary 解析壓縮文件中的 META-INF/com/google/android/updater-script 文件並執行。其升級進度經過管道回傳給 recovery 程序。升級 / 更新能夠直接覆蓋目標文件,也可採用二進制補丁形式以減小升級文件的容量,採用的工具爲 bsdiff 和 imgdiff 。對於補丁包升級形式,升級數據源可靠性鑑別的依據爲 sha1 校驗和數據長度比對。具體要求爲: 1 升 級包提供的目標文件的 sha1 值和目標文件計算值符合,即目標正確。 2 進行補丁後的文件 sha1 值和長度符合升級包提供的補丁後的目標文件的長度和 sha1 數值,保證結果正確。兩項有一項不符合則升級過程中止。爲保證第二項操做不損毀最終目標,打補丁的文件會先臨時存儲到 cache 中,等到結果比對正確才進行實際寫入 / 替換目標文件操做。因此此過程要求 cache 目錄必須有足夠空間可以保存臨時文件。

資源替換:DEVICE_PACKAGE_OVERLAYS

DEVICE_PACKAGE_OVERLAYS能夠設定路徑,起到的做用就是替換掉原來的目錄中的資源,好比圖片等等,唯一的要求就是必須創建和原來圖片位置相同的路徑

有兩種不一樣的overaly目錄定義,來影響最終的效果:

PRODUCT_PACKAGE_OVERLAYS: used by a particular product 

DEVICE_PACKAGE_OVERLAYS: used several products that share a common device model 

若是包含同一資源,那麼 PRODUCT_PACKAGE_OVERLAYS 將覆蓋 DEVICE_PACKAGE_OVERLAYS 

中的

例:device\samsung\avl7580\device.mk

DEVICE_PACKAGE_OVERLAYS := \

         device/samsung/avl7580/overlay

init.rc

init.c 、init.rc init.xx.rc 等最終會編譯到ramdisk.img(根文件系統)中,和kernel一塊兒打包成boot.img。android啓動後每次都會從boot.img中解壓出init.c等文件到內存

在init.rc中啓動的服務,都是以一個進程的形式運行,屬於android的本地服務。經過在終端輸入PS命令能夠查看在運行的相應進程,他們的ppid都爲1,表明init進程。 init進程也是android系統啓動的第一個應用進程

SELinux

首先在boardconfig.mk裏定義SELinux的poliocy文件:

BOARD_SEPOLICY_DIRS += \

vendor/samsung_slsi/telephony/common/config/sepolicy

而後在pliocy文件中寫權限:

allow system_server radio_service:service_manager add;

相關文章
相關標籤/搜索