編譯 Android#
使用 envsetup.sh 腳本初始化環境:source build/envsetup.sh 或者. build/envsetup.sh
如需查看可用命令的完整列表,請運行以下命令:hmm
Framework 調試#
top#
VIRT
:這個內存使用就是一個應用占有的地址空間,只是要應用程序要求的,就全算在這裡,而不管它真的用了沒有。寫程序怕出錯,又不在乎占用的時候,多開點內存也是很正常的;RES
:resident memory usage。常駐內存。這個值就是該應用程序真的使用的內存,但還有兩個小問題,一是有些東西可能放在交換盤上了(SWAP),二是有些內存可能是共享的;SHR
:shared memory。共享內存。就是說這一塊內存空間有可能也被其他應用程序使用著;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.<服務名> 屬性中。