编译 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.<服务名> 属性中。