1. 程式人生 > >Android深度探索(卷2)系統應用原始碼分析與ROM定製 讀書筆記1

Android深度探索(卷2)系統應用原始碼分析與ROM定製 讀書筆記1

1.在config檔案中如果加上CONFIG_IKCONFIG_PROC=y,編譯下載開機後就會在/proc下面生成config.gz的檔案,這個檔案可以直接解壓使用。

2.Android原始碼下面就有編譯器,alps/prebuild目錄下即是,可以在目錄下搜尋arm-eabi-gcc找到交叉編譯器的位置,然後可以加入PATH

3.刷機之前需要保證BootLoader是解鎖的,如果未解鎖需要在Android裝置開機下執行adb reboot bootloader進入bootloader模式,執行fastboot oem unlock(fastboot oem lock是加鎖),成功後會在模式介面顯示紅色的UNCLOCKED

4.system.img的修改

在out/host/linux-x86/bin下有很多linux-x86的工具,包括打包工具,通過

使用simg2img system.img system.img.raw把system.img轉換為可掛載的映象

使用mount system.img.raw /mnt/system 把映象掛載到/mnt/system下面

使用make_ext4fs -s -l 512M -a system system.img /mnt/system 重新打包成映象

其中-s是生成Sparse格式的映象檔案,不可掛載,佔用空間小,不加則可直接掛在但是大,

-l是指定邏輯分割槽的尺寸,生成的映象不能比這個大,-a指定在Android執行系統中的掛載點

5.修改開機動畫

方法一:直接替換解壓的system/media下的bootanimation.zip,然後打包

方法二:直接替換執行的Android裝置中的/system/media下或者/data/local下的bootanimation.zip,需要root許可權

adb push bootanimation.zip /adcard/bootanimation.zip
adb shell
su
mount -o rw, remount /system
cp /sdcard/bootanimation.zip /system/media/bootanimation.zip
/data/local下不用remount
adb push bootanimation.zip /adcard/bootanimation.zip
adb shell
su
cp /sdcard/bootanimation.zip /data/local/bootanimation.zip


6.bootanimation.zip
由一個或多個partN資料夾和desc.txt組成
資料夾中是播放動畫的圖片,圖片名稱結尾(不包括格式)需要用數字排序結尾,例如pic001
desc.txt
<width> <height> <frame-rate>
p <loop> <pause> <folder>
...
例如:
786 1366 15
p 1 0 pic001
p 0 0 pic002
暫停時間計算:pause/frame-rate

7.修改userdata.image
使用simg2img userdata.img userdata.img.raw把userdata.img轉換為可掛載的映象
使用mount userdata.img.raw /mnt/rom/userdata 把映象掛載到/mnt/rom/userdata下面
可以在裡面新增apk
使用make_ext4fs -s -l 128M -a datauserdata.img /mnt/rom/userdata 重新打包成映象
注意這個128M會指定記憶體的最大容量,即使實際大小比128M大也只能顯示和用128M,
並且這個制定的容量不能比實際的內部儲存大。

8.ramdisk.img是root目錄的壓縮,包括初始化檔案,不能使用上面的方法掛載,使用gunzip解壓,並
用cpio恢復目錄結構
mkdir ramdisk
cd ramdisk
gunzip -c ../ramdisk.img | cpio -i
使用下面的命令生成ramdisk.img
mkbootfs . | minigzip > ../ramdisk.img

9.boot.img主要包括核心zImage和ramdisk.img
解壓
unpackbootimg -i ../boot.img
壓縮
mkbootimg(out/host/linux-x86/bin/) --kernel boot.img-zImage --ramdisk.gz.new -o boot.img.new

10.獲取ROOT許可權
把修改過的su命令檔案直接放入前面解壓的system.img的/system/xbin下面,然後打包。
修改ramdisk.img,使得進入shell是就獲得ROOT許可權,修改ramdisk.img中的defualt.prop檔案,
然後重新生成boot.img,經過修改的boot.img如下
ro.secure=0
ro.allow.mock.location=1
ro.debuggable=1
presist.sys.usb.config=mtp
ro.adb.secure=1
persist.service.adb.enable=1

11.獲取Hardware版本的方法
通過adb中使用cat /proc/cpuinfo可以檢視
12.APK程式複製安裝
有的apk會被拆分成兩個同名的檔案(userdebug編譯的結果沒有odex檔案,user有,不過可以修改build/core/mian.mk中WITH_DEXPREOPT改成true),一個是apk一個是odex檔案,不能簡單地把這兩個檔案
拷貝到不同rom上安裝。因為如果是分開的,在安裝之前Dalivk會強迫進行一系列的校驗(使用Android系統中的
一些Library),校驗不通過odex檔案是不能使用的,但是如果兩個合併之後就不需要校驗可以直接安裝。
校驗使用的庫可以在init.rc中檢視BOOTCLASSPATH檢視 cat /init.rc | grep BOOTCLASSPATH
合併的步驟:
1. 使用baksmail工具反編譯odex檔案,原始碼中的好像有點問題
java -jar baksmali.jar -a l7 -x test.odex -d framework -o test
-a:API LEVEL 這裡是17-x指定odex檔案,-d指定需要的庫在的目錄,-o編譯後文件儲存目錄
2. 



13.Android系統簽名
檔案在build/target/product/security,在Android.mk中使用LOCAL_CERTIFICATE變數指定
testKey:預設簽名,普通key
platform:可以使用系統應用的核心功能
shared:可以和home/contacts程序共享資料
media:將成為media/download的系統的一部分

14.intent問題

Android 應用之所以會在程式列表顯示圖示,是因為在定義程式中的視窗(Activity)制定了名為android.intent.action.MAIN和android.intent.category.LAUNCHER的Category。如果同一個視窗的同一個intent-filter有多個action時,使用時只需制定一個即可呼叫。如果沒有action說明這個視窗不能被別的呼叫。如果AndroidMainfest.xml檔案中有多個視窗都制定了android.intent.action.MAIN 和android.intent.category.LAUNCHER,那在程式列表中會有多個圖示。

如果一個activity有多個intent-filter,則說明有多重呼叫該視窗的方式,主要不同是否包含action欄位,檔案是否有路徑,程式格式等。