readelf命令查看ELF格式的文件信息
常见的文件比如动态库(*.so
)、静态库(*.a
),常用命令:readelf -a libgui.so | grep test_string
查看手机内存
1 | adb shell |
adb logcat缓存管理
1 | adb root;adb remount |
linux离线翻译工具sdcv
1 | 安装: |
apt-get命令列出版本号
sudo apt-cache madison openssh-client
Linux安装tar.xz软件包
1 | 在linux下(node.js): |
JNI的jlong类型打印
不使用%lld和%ld,而是先将其转换成long,然后%ld打印。
1 | ALOGD("Mylog: JNI destroySurface nativeObject=%ld", (long)nativeObject); |
monkey测试
指令参数
1 | adb shell monkey help查看帮助 |
示例
(1) adb shell monkey -p PackageName -v -v -v -s 12 –throttle 500 1000 > monkey.txt
随机数种子是12,log详细程度最高,单步延时500ms,总执行1000步,日志输出到monkey.txt
(2) adb shell monkey -p PackageName –throttle 200 –ignore-security-exceptions -v 100000000
(3) adb shell monkey -p PackageName –throttle 200 –ignore-crashes –ignore-timeouts –ignore-security-exceptions –ignore-native-crashes –monitor-native-crashes -v -v -v 1000000 > monkeylog.txt
(4) 不指定包:
adb -s DeviceID shell monkey –throttle 200 –ignore-crashes –ignore-timeouts –ignore-security-exceptions –ignore-native-crashes –monitor-native-crashes –ignore-security-exceptions -v -v -v 100 > monkeylog.txt
(5) 正常测试验证问题使用(不忽略crash,压力测试,所以不指定间隔时间):
adb -s DeviceID shell monkey -p PackageName –throttle 200 –ignore-security-exceptions -v 100000000 > monkeyLog.txt
停止monkey测试
1 | (1) ps -A|grep monkey |
重现monkey测出的bug
monkey日志搜索ANR exception
,将之前的事件重新操作。尤其是seed值要一样,如monkey -p PackageName -v seed(-s) 100(seed的值) 500(随机时间次数)
dump meminfo
1 | adb shell dumpsys meminfo |
kernel使用printk调试
- 打印调试log
printk("%d",intA);
- 打印变量所占内存大小
printk("sizeof(*intA)=%d",sizeof(*intA);
查看设别是否支持Project Teable
Project Treble是在最新的Android上应用兼容的芯片驱动,加快最新系统适配的速度。
adb shell getprop ro.treble.enabled
查看cpu架构
adb shell getprop ro.product.cpu.abi
Service服务命令
1 | 服务列表: adb shell service list |
测试CtsMediaTestCases需要CTS媒体文件(连接外网)
Google官网下载,例如CTS媒体文件1.4,解压后阅读README文件,按照提示copy文件到device。
1 | chmod 544 copy_media.sh |
当前活动Activiy
获取当前ACTIVITY
adb shell dumpsys activity top|grep ACTIVITY
命令启动指定Activity
adb shell am start -n ActivityName
Android SDK抓取systrace
1 | 进入Android/Sdk/platform-tools/systrace目录下 |
打开模拟Vsync,从Systrace查看到
- 源码: Android 10的AOSP
- 方法: 修改
surfaceflinger/Scheduler/DispSync.cpp
的static const bool kEnableZeroPhaseTracer = false;
为True
adb devices很少识别
1 | 方法一: |
添加usb设备自动识别信息/etc/udev/rules.d/
1 | (1)lsusb查看usb链接设备 |
adb shell获取设备信息参数(序列号)
1 | getprop 查看机器的全部信息参数 |
Android中CPU频率查看和修改
1 | root权限(直接输入su命令) |
Ubuntu下载更新杀毒软件
1 | 下载: |
安装deb包
sudo dpkg -i gapid-1.3.1-linux.deb
查看手机服务
开发者选项 -> Running services可以查看正在运行的服务,以及运行内存情况
查看修改屏幕分辨率和密度
1 | 查看: |
查看进程map虚拟地址
1 | adb root;adb remount |
SELinux模式开启关闭
SELinux(Security-Enabled Linux)是美国国家安全局(NSA)对于强制访问控制的实现(安全子系统)
临时生效方法:
adb shell setenforce 0(临时生效,关闭SELinux模式)
adb shell setenforce 1(启用,开启SELinux模式)
adb命令 – 录制手机视频
adb shell screenrecord sdcard/record.mp4
1adb pull sdcard/record.mp4 .
adb命令 – 截图
adb shell screencap -p sdcard/1.png
adb命令 – 输入文本
节省手动输入的时间:
adb shell input text ****
adb命令 – 获取APP路径
adb shell dumpsys SurfaceFlinger 最下方查看正在运行的APK
adb shell pm path "com.**" 获取路径
台式机通过WIFI建立adb连接,实现无线连接手机
通常在需要手机连接外设显示设备的同时需要抓取Log、Dump等操作:
- 两台手机连上同一个无线网
- 其中一台A关闭开发者选项的USB调试,并且连接到电脑作为热点(无线网卡)
- 另一台B连接电脑输入
adb tcpip 5555
,然后输入adb shell ifconfig wlan0
查看B的IP地址 - 连接B手机的IP: adb connect IP
- 断开B,保持A连接在电脑
连接DP继续dump SurfaceFlinger的方法
- 连接DP前启动:
adb shell dumpsys SurfaceFlinger --file --no-limit
- 断开DP后再次执行结束Dump:
adb shell dumpsys SurfaceFlinger --file --no-limit
- 接过文件pull出来:
adb pull /data/misc/wmtrace/dumpsys.txt
md5sum命令检测文件
通过md5sum filename
查看文件的md5sum值
是否一样
GSI含义
GSI是替换成google的frameworks等(即system.img, 即google的原生AOSP)
system.img包含整个系统,framework、application等,被挂接到”/“目录下,包含系统的所有二进制文件。大概是编译出来的out/target/product/ProductName/system目录的映射
GSI方法
1 | 常用步骤: |
CTS VTS跑测注意点
- 重跑:
run retry --retry 序列号
- 跑测arm64-v8a还是armeabi-v7a等:
run cts-suite -s ... -a arm64-v8 -m ...
linxu命令查找命令
查找字符串
grep -rn 字符串
grep 字符串 -Rin * //查找该目录下包含该字符串的文件
查找文件
find . -iname Test*
Git命令
- 回退到某个commitID:
git reset --hard commitID
- 新建一个Commit用于Revert某个分支:
git revert commitID
- 修改commit信息
git commit --amend --author="**" --date="**" 修改作者和日期
- 添加topic的方法(提交到Gerrit)
git push origin HEAD:refs/for/BRANCH_Name%topic="name"
- 使用新的change ID覆盖原来已经提交的Patch
git push origin HEAD:refs/changes/99999 (gerrit上的已有Commit的Patch ID)
git stash
暂时储藏
用于修改的代码暂时保存起来,并且不影响下次的修改(这个比生成本地补丁方便git format-patch -1 commitID
):
git stash save "Remarks"
执行存储,并且添加备注git stash list
查看储藏列表git stash show stash@{1}
查看某次储藏的修改git stash apply stash@{$Num}
应用某次储藏git stash pop stash@{$Num}
从缓存堆栈中删除某次储藏并且应用到代码中,默认第一个stashgit stash drop stash@{$Num}
从列表删除这个存储git stash clear
删除所有缓存的stash
Repo下载项目方法
- 下载
.repo
:repo init -u Git远程仓库 -b Branch_Name(分支选择)
- Sync项目:
repo sync -c -j4
(当前分支) - 如果值Sync指定目录,则在指定目录下执行:
repo sync -c . -j4
Android常用编译方式
source build/envsetup.sh
lunch //选择指定Product
make fullbuild -j4
- 如果只编译部分模块:
- framework模块:
make framework -j4
,结果生成framework.jar包到/system/framework - 编译
kernal/msm
使用:make bootimage -j4
- 指定目录下执行:
mm/mmm/mma(依赖编译)