Android開發概要記錄
1..o檔案、 .ko和.so檔案的路徑
\kernel\out\mediatek---------------.o檔案
.c/.cpp檔案編譯生成的目標檔案
\out\target\product\hsimobile77_ics2\system\lib\modules----.ko檔案
.ko是整個模組生成的驅動檔案(核心模組),其中可以包括了.so,如果編譯進 kernel 只可以看到.o 不會生成ko
\out\target\product\hsimobile77_ics2\system\lib------------.so檔案
.so 是部分檔案編譯成庫檔案,晶片原廠不希望你看到原始碼,可以已這樣的方式提供,相當於WINCE下的.dll檔案(動態連結庫檔案)
2.用Ctrl+C停止正在進行的編譯操作
3.如何快速編譯單個驅動和除錯?
4.adb logcat > logo.txt可以抓取除錯資訊
adb shell
cat /proc/kmsg也可以抓除錯資訊。
5./dev下通過ls -l可以檢視裝置檔案更多詳細的資訊,比如主裝置號和次裝置號。
6.adb shell setprop service.adb.root 1 設定許可權。
7.linux下fastboot使用
adb reboot bootloader
fastboot flash boot \out\target\product\msm8909\boot.img
fastboot reboot
8.svn一些常用的命令
svn status檢視有更新的檔案
svn log檢視更新記錄
svn co svn://192.168.XX.XXX/原始碼目錄
獲取指定版本
svn checkout http://siphon.googlecode.com/svn/trunk/siphon -r r791
svn up獲取新版本程式碼
svn commit -m "解決DC無法充電及顯示問題"
svn status可知道修改的檔案、和增加的檔案。
svn add file提交增加的檔案
提交某些指定的檔案
svn commit kernel/drivers/input/keyboard/A.c kernel/drivers/input/keyboard/A.h -m "1.優化按鍵驅動 2提交按鍵程式碼"
刪除檔案
svn delete path -m “delete test fle“
修改檔名svn move xxx yyy
將xxx檔案重新命名為yyy,類似於Linux的mv命令。
svn info獲取當前版本資訊
svn update -r10030-------更新到指定版本,也可以用於回退到哪個版本做測試驗證
r後面緊跟版本號
svn add --no-ignore *------我們提交的時候,svn可能識別不到有些型別檔案,比如so,增加這個可以提交
遞迴刪除目錄下.svn檔案
find和xargs結合
find . -name "*.svn" | xargs rm -rf
svn建立補丁
(1)建立當前目錄下補丁svn diff -r 39:390 > 39_390.patch
(2) 建立指定目錄補丁svn diff minui -r 39:390 > 39_3902.patch
(3)建立指定檔案補丁:svn diff graphics_fbdev.cpp -r 39:390 > 39_3902.patch
svn add之後撤銷命令svn revert --recursive example_folder。
9.Android 效能分析工具dumpsys的使用
Android提供的dumpsys工具可以用於檢視感興趣的系統服務資訊與狀態,手機連線電腦後可以直接命令列執行adb shell dumpsys 檢視所有支援的Service但是這樣輸出的太多,可以通過dumpsys | grep "DUMP OF SERVICE" 僅顯示主要的Service的資訊
也可以單獨列出某個系統服務的,比如battery,命令:dumpsys battery,如果想知道具體可以做哪些操作可:dumpsys battery -h來檢視,比如我們想設定電量百分比,可以
dumpsys battery set level 5。
10. /sys/kernel/debug/msm_otg
除錯路徑
11.編譯和替換framework部分
比如修改\frameworks\base\services\core\java\com\android\server\BatterySevice.java
編譯命令,編譯命令mmm frameworks/base/services/
user版本。Jar中的部分被編譯程式優化成了odex檔案和jar檔案,請看log最後一行。
但是user你們應該沒有許可權push進去的。
如果你們要除錯,請編譯eng版本的jar,這樣jar應該就是完整的2m大小了。
adb remount
adb push services.jar /system/framework/
adb reboot
11.手動設定電池容量
echo 50 > sys/modules/qpnp_bms/parameters/bms_fake_battery
13.linux主要目錄的一樣
/proc/devices檔案可以獲知系統中註冊的裝置,第1列為主裝置號,第2列為從裝置名
14.快遞定位問題
(1) 通過logo定位具體的地方
看日誌,在差不多的地方加個dump_stack() 就很容易看出來呼叫關係
15.系統屬性
(1) msm8909系統屬性檔案
device/qcom/msm8909/system.prop
16.測試模式
從2016.0115日開始系統,預設關閉測試模式,相對之前預設開啟測試預設,有以下變化:
(1) 接入USB線,需要選擇才能開啟USB debug模式
(2) USB模式預設為MTP,之前為charging模式
(3) 開機後,我們刷機軟體QFIL識別不到埠(但關機狀態下同時按下兩個側按鍵+power按鍵,還是可以正常刷機)
17.vmlinux
位於\out\target\product\msm8909\obj\KERNEL_OBJ資料夾下,
vmlinux是未壓縮的核心,vmlinux 是ELF檔案,即編譯出來的最原始的檔案。用於kernel-debug,產生system.map符號表,不能用於直接載入,不可以作為啟動核心。只是啟動過程中的中間媒體
vmlinuz是可引導的、壓縮的核心。“vm”代表“Virtual Memory”。Linux 支援虛擬記憶體,不像老的作業系統比如DOS有640KB記憶體的限制
以是我在CSDN中看到的,可以使用反彙編檢視這個檔案:
arm-eabi-objdump -d kernel/vmlinux > 1.S
18. 關機充電部分編譯
比如修改system\core\healthd資料夾的程式碼,用make bootimage編譯即可,此資料夾生成的healthd在out\target\product\msm8909\symbols\sbin資料夾下
19.adb shell top看看資源佔用情況
adb shell top看看資源佔用情況
adb shell top看看資源佔用情況
20.ROM助手可編輯img檔案
21. 裝置樹dt.img中的entry數量由dts和dtsi檔案的"compatible"條目數量決定
22.編譯命令
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory, but not their dependencies.
- mmm: Builds all of the modules in the supplied directories, but not their dependencies.
To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma: Builds all of the modules in the current directory, and their dependencies.
- mmma: Builds all of the modules in the supplied directories, and their dependencies.
23.croot命令可直接回到程式碼根目錄
24.system\core\init列印除錯資訊
比如init.c下main():
KLOG_ERROR(LOG_TAG,"main() test --->error\n");//串列埠打印出來
KLOG_DEBUG(LOG_TAG,"main() test --->DEBUG\n");//串列埠打印不出來
編譯boot.img即可
26./proc/cpuinfo、cmdline對應硬體資訊和核心啟動引數
27.獲取屬性值,比如getprop ro.build.product
28.系統屬性檔案,在\bionic\libc\include\sys\_system_properties.h定義
#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"
#define PROP_PATH_SYSTEM_BUILD "/system/build.prop"
#define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop"
#define PROP_PATH_VENDOR_BUILD "/vendor/build.prop"
#define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"
#define PROP_PATH_FACTORY "/factory/factory.prop"
29.查詢程式碼
技巧:
在除錯或理解系統的工作原理的時候,我們經常要去找服務程式對應的原始碼。
尋找c或c++程式的原始碼檔案:
例如:以尋找init程式對應的原始碼為例。
find ./ -name Android.mk -exec grep -l init {} \;
注:通過find命令查詢所有的Android.mk, 通過grep從中查詢程式字串,得到其路徑,然後去路徑下找原始碼即可,這麼做的原因是,c或c++程式碼都是通過Android.mk來指導編譯的。
尋找java原始碼檔案:
java原始碼的特點是和類名一致,所以如果我們知道一個類名,找其java原始碼就直接加上java字尾即可。
例如:尋找com.android.internal.os.ZygoteInit類的程式碼。
find ./ -name ZygoteInit.java
30.system\core\rootdir\init.rc
需要注意的是,各個trigger的載入順序,先加入的先執行,後加入的後執行,要特別注意,尤其是要修改init.rc檔案的時候,不瞭解這個容易因為前後依賴關係造成問題。
31.Android屬性服務
Android為了儲存全域性系統設定資訊,提供了一個系統屬性共享記憶體區,這個共享記憶體區的內容是一些鍵值對的列表,對外提供get和set方法讀寫屬性。系統啟動時由init初始化並開啟屬性服務。
32.system/build.prop
build.prop和上節說得根檔案系統中的default.prop檔案格式一樣,都稱為屬性配置檔案。它們都定義了一些屬性值,程式碼可以讀取或者修改這些屬性值。屬性值有一些命名規範:
ro開頭的表示只讀屬性,即這些屬性的值程式碼是無法修改的。
persist開頭的表示這些屬性值會儲存在檔案中,這樣重新啟動之後這些值還保留。
其它的屬性一般以所屬的類別開頭,這些屬性是可讀可寫的,但是對它們的修改重啟之後不會保留。
33.MPSS和APSS
APSS指應用子系統,Application subsystem
MPSS是指modem應用子系統,Modem Application susbsystem
34.策略檔案,比如init.te,te是指TypeEnforcement Access Control(簡稱TEAC,一般用TE表示)
35 frameworks\base\packages\SettingsProvider\res\values\defaults.xml
有很多開機預設的設定,比如開機不鎖屏<bool name="def_lockscreen_disabled">false</bool>
36.framework層的JNI原始碼:frameworks\base\core\jni
frameworks\base\services\core\jni
37.編譯so並快速打包到system.img中
用mmm命令編譯,用make snod打包到system.img中。
38.Android studio官網:點選開啟連結
39. init.rc
mkdir /data/misc 01771 system misc
命令 檔案路徑 許可權 所有者 所有組
40. adb shell service list檢視系統中註冊了哪些service
41. adb shell
getprop可以檢視一系列系統屬性值
getprop |grep xxx.xxx.xx 過濾檢視特定系統屬性值
42. 預設預置apk到system/app/目錄(普通系統apk,不可解除安裝),預置apk到system/priv-app/目錄(系統核心apk,不可解除安裝),app對應的Android.mk下增加LOCAL_PRIVILEGED_MODULE := true,表示生成的apk放在system/priv-app/目錄下。
43. 編譯伺服器編譯不同版本android的方法,比如android5.1用openjdk-7-jdk,android7.1用openjdk-8-jdk,可以用不同的使用者安裝不同版本來編譯,或是同一個使用者手動切換Java版本: sudo update-alternatives --config java sudo update-alternatives --config javac
44.監測記憶體及CPU情況,可用安兔兔測評軟體
45.dumpsys telephony.registry可獲取telephony狀態,可以看網路註冊狀態,資料鏈接狀態,是否漫遊,訊號強度,等等,引數我就不一一解毒了,跟android系統版本也有關係
46 jdk版本選擇
比如ubuntu系統中安裝了openjdk-7-jdk和openjdk-8-jdk,通過下面的命令可以切換
sudo update-alternatives --config java
sudo update-alternatives --config javac
47updatezip升級設定目錄和檔案許可權
android7.1set_metadata_recursive和set_metadata命令,主要是修改檔案或目錄許可權和屬組等資訊
比如:set_metadata("/system/bin/login","uid", 0, "gid", 0, "mode", 0755,"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");---
第1個0表示ROOT,上帝使用者: ROOT, 他的UID= 0; 上帝使用者永遠屬於任何UID
Uid和gid的值system\core\include\private\android_filesystem_config.h定義,比如:
48. adb的adb shell pm list packages命令用來檢視當前裝置app應用包