fwrite

fwrite

twitter
github
email

AOSP調試指南

編譯 Android#

使用 envsetup.sh 腳本初始化環境:source build/envsetup.sh 或者. build/envsetup.sh

如需查看可用命令的完整列表,請運行以下命令:hmm

Framework 調試#

top#

  1. VIRT:這個內存使用就是一個應用占有的地址空間,只是要應用程序要求的,就全算在這裡,而不管它真的用了沒有。寫程序怕出錯,又不在乎占用的時候,多開點內存也是很正常的;
  2. RES:resident memory usage。常駐內存。這個值就是該應用程序真的使用的內存,但還有兩個小問題,一是有些東西可能放在交換盤上了(SWAP),二是有些內存可能是共享的;
  3. SHR:shared memory。共享內存。就是說這一塊內存空間有可能也被其他應用程序使用著;
  4. DATA:數據佔用的內存。這一塊是真正的該程序要求的數據空間,是真正在運行中要使用的。

vmstat#

vmstat 是一個顯示系統信息的命令。例如,它顯示主存儲器的可用容量和 CPU 的操作狀態。 如果按原樣執行 vmstat 命令,則會顯示有關當前進程,內存,交換,設備,中斷和 CPU 的信息。此外,如果附加 “-d” 或 “-p” 選項,將顯示分區和磁盤上的讀 / 寫狀態等。指定 “-f” 選項時,從系統啟動到命令執行將顯示創建進程的次數。

meminfo#

cat /proc/meminfo

free#

-b 以字節顯示容量(默認)
-k 顯示容量,以千字節為單位
-m 顯示容量,以MB為單位
-h 顯示容量單位,包含G、M
-t 還顯示物理內存和交換內存的總和

strace#

常用來跟踪進程執行時的系統調用和所接收的信號。

time#

測量從調用指定命令到結束所花費的時間,用戶 CPU 時間和系統 CPU 時間。在指定命令的輸出結果之後,將測量結果輸出到標準錯誤輸出。命令代碼實際使用 CPU 的時間是用戶 CPU 時間。因此,如果將不存在的命令作為 time 命令的參數,則用戶 CPU 時間變為 0。睡眠時間不計算在內。

size#

顯示一個目標文件或者鏈接庫文件中的目標文件的各個段的大小

file#

確定並顯示文件類型

addr2line#

解析 so 文件

跳過開機引導#

adb shell settings put global device_provisioned 1

readelf#

查看 ELF 格式的文件信息

logcat#

adb root;adb remount

清除緩存  adb logcat -c

如果不能清除,就指定區域清除  adb logcat -c main/system/event/kernel/all(日誌緩衝區)

查看緩存  adb logcat -g
設置最大logcat緩存   adb logcat -G 100M

dump meminfo#

adb shell dumpsys meminfo
或者具體包
adb shell dumpsys meminfo packageName

printk#

  • 打印調試 log
printk("%d",intA);
  • 打印變量所佔內存大小
printk("sizeof(*intA)=%d",sizeof(*intA);

查看 cpu 架構#

adb shell getprop ro.product.cpu.abi

service 服務#

服務列表:    adb shell service list
檢測某服務是否存在:   adb shell service check SurfaceFlinger

Activity#

adb shell dumpsys activity top|grep ACTIVITY

adb shell am start -n ActivityName

獲取參數#

getprop 查看機器的全部信息參數
getprop ro.serialno 查看機器的序列號
getprop ro.carrier 查看機器的CID號
getprop ro.hardware 查看機器板子代號
getprop ro.bootloader 查看SPL(Hboot)版本號
getprop ro.build.version.release 查看系統版本(8、9...)
getprop ro.build.display.id  获得廠商系統版本

cpu 頻率#

root權限(直接輸入su命令)
cd sys/devices/system/cpu/cpu0/cpufreq
ls文件如下

cpuinfo_cur_freq: 當前cpu正在運行的工作頻率
cpuinfo_max_freq:該文件指定了處理器能夠運行的最高工作頻率 (單位: 千赫茲)
cpuinfo_min_freq :該文件指定了處理器能夠運行的最低工作頻率 (單位: 千赫茲)

屏幕#

查看:
adb shell
wm   size  获得手機當前分辨率
wm  density   获得手機當前屏幕密度(例如560dpi)

修改:
wm size 1096*2560
wm density 420

恢復:
wm size reset
wm density reset

查看虛擬地址#

adb root;adb remount
adb shell  
ps -A|grep camera 查看服務的進程號(例如4712)  
cd proc/4712  進入進程號的文件夾  
more maps 查看虛擬內存地址  

SELinux 模式#

  • adb shell setenforce 0(臨時生效,關閉SELinux模式)
  • adb shell setenforce 1(啟用,開啟SELinux模式)

獲取路徑#

  • adb shell dumpsys SurfaceFlinger 最下方查看正在運行的APK
  • adb shell pm path "com.**" 獲取路徑

屬性系統#

android 通過 SystemProperties 的 set 和 get 方法來控制很多東西,一般上層添加一個控制開關可以使用這個方法,在系統裡面存在很多個 prop 文件。它們分別是 system/build.prop,system/etc/prop.default,vendor/build.prop,vendor/default.prop。下面分別來說下這幾個文件的構成。

  • system/build.prop

這個主要是由 device\(platform) sample\product/system.prop, 還有在 build 目錄下添加的 ADDITIONAL_BUILD_PROPERTIES

  • system/etc/prop.default

主要是系統添加的 PRODUCT_SYSTEM_DEFAULT_PROPERTIES

  • vendor/build.prop(比較重要)

主要是系統添加的 PRODUCT_PROPERTY_OVERRIDES,添加在 device.mk 的這個屬性會被編譯到這裡,但是在 9.0 的系統,加到這裡會無效,獲取不到值。

  • vendor/default.prop(會被同目錄的 build.prop 相同 property 覆蓋)

主要是系統添加的 PRODUCT_DEFAULT_PROPERTY_OVERRIDES

前綴:

  • ro:只讀屬性,不能修改。
  • persist:修改屬性後,重啟依然有效。數據會保存到 /data/property 目錄。其他前綴的屬性被設置後,只是保存在內存中而已,並沒有保存到磁盤,所有重啟後就恢復默認值了。
  • ctrl:用來啟動和停止服務。每一項服務必須在 init.rc 中定義。init 一旦收到設置 ctrl.start 屬性的請求,屬性服務將使用該屬性值作為服務名找到該服務,啟動該服務。這項服務的啟動結果將會放入 init.svc.<服務名> 屬性中。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。