- 启动进程到在屏幕上完成Activity绘制所用的时间
API>=19 logcat过滤Displayed
adb统计 adb shell am start -S -W package/.class
- 获取该应用的包名和activity
D:\Android\SDK\build-tools\28.0.3\aapt.exe dump badging C:\Users\86150\Desktop\boost-multidex\multidex.apk>C:\Users\86150\Desktop\boost-multidex\log.txt
-
查看某个包的版本号
-
adb shell “dumpsys package com.x.x | grep version”
-
定时关机
@echo off
rem
shutdown.exe -s -t 10800
exit
- 设置代理并启动
adb root
TIMEOUT /T 1
adb remount
TIMEOUT /T 1
adb push E:\box-hosts\1\hosts /system/etc/hosts
TIMEOUT /T 1
adb shell pm clear com.x.x.x
TIMEOUT /T 3
adb shell am start -n com.x.x.x/com.x.x.x.activity.x
TIMEOUT /T 1
- bugreport命令
adb bugreport ~\
app crash 的时候,系统会保存一个tombstone文件到/data/tombstones目录,
该命令会导出最近的crash相关信息,我们可以通过bugreport导出,
导出后它是一个zip包的形式.
- 开启布局视图
adb shell setprop debug.layout true
- kill某个进程
adb shell am force-stop com.x.x.x
TIMEOUT /T 1
- 截屏到SD卡
adb shell screencap -p /sdcard/01.png
TIMEOUT /T 5
adb pull /sdcard/01.png
TIMEOUT /T 5
- 抓取log
adb shell logcat -c
TIMEOUT /T 1
adb shell logcat -v time > C:\Users\86150\Desktop\log.txt
- 清除缓存
adb shell pm clear com.x.x.x
- 过滤指定的log
adb shell logcat -c
TIMEOUT /T 1
adb shell logcat -v time > C:\Users\86150\Desktop\log\log.txt -s WUEEWQAAC
- 签名APK
D:
TIMEOUT /T 1
cd D:\Android\SDK\build-tools\29.0.3\lib
TIMEOUT /T 1
java -jar apksigner.jar sign --ks C:\key\x.keystore --ks-key-alias x.keystore --ks-pass pass:bxxxxxxx --key-pass pass:pass:bxxxxxxx --out E:\output\test-signed-jiagu.apk E:\output\test.apk
TIMEOUT /T 1
java -jar apksigner.jar verify -v E:\output\test-signed-jiagu.apk
TIMEOUT /T 60
- 当前视图Activity
adb shell dumpsys activity | findstr "mFocus"
- 打开某个Activity
adb shell am start -n com.x.x.x/com.x.x.x.ZActivity
TIMEOUT /T 3
- 查看某个包信息
adb shell dumpsys package com.examle.xx
- 查看Android设备系统信息
adb shell cat /system/build.prop
- 查看设备内存信息
adb shell cat /proc/meminfo
- 查看设备中各个应用内存情况
adb shell dumpsys meminfo
- 查看设备中单个应用的内存情况
adb shell dumpsys meminfo packagename
=================抓取网络包=====================
开始tcpdump
adb push tcpdump /data/local/tcpdump
adb shell chmod 6755 /data/local/tcpdump
adb shell rm -r /sdcard/0919.pcap
adb shell /data/local/tcpdump -i any -p -s 0 -w /sdcard/0919.pcap
pause
下载tcpdump文件到电脑
adb pull /sdcard/0919.pcap C:\Users\86150\Desktop\0919.pcap
- 获取签名信息
keytool -printcert -jarfile D:\test.apk
java -jar signapk.jar platform.x509.pem platform.pk8 a.apk b.apk
Private (Clean and Dirty) RAM
私有内存,这种方式只统计了当前进程独享的内存,Private Clean和Private Dirty的总和就是当前进程的独占内存,当进程销毁时系统会回收这部分内存。
Private Dirty:是必须保存在内存中数据,如程序运行过程中的变量数据,这部分内存中的东西未成为垃圾数据之前必须一直保存在内存中
Private Clean:是从持久化文件中加载的数据,如程序执行时加载的代码,这部分内存中的数据可以丢掉,再次使用时可以再从持久化文件中再次加载。
Proportional Set Size (PSS)
比例集大小,该方式统计的内存除了进程独享内存外,还包括通过共享页面与其他进程共享的内存。共享内存的一个常见用途是在进程之间共享“代码”内存页
(加载只读可执行代码的内存区域)。比如外部库和JVM的可执行代码是存放在可以跨进程安全共享的内存区域。共享内存会根据共享进程数量分摊到各个进程中。
- 获取所有进程的内存使用的排行榜,排行是以 Pss 的大小而排序
adb shell procrank
- 查看设备cpu情况
adb shell dumpsys cpuinfo
- 查看进程
adb shell ps
adb shell “ps |grep com.x.x”
-查看某个进程线程数
adb shell cat /proc/进程id/status
或者 adb shell top -m 5 前5个占用线程数大的应用
- 截图
adb shell screencap -p /sdcard/01.png
TIMEOUT /T 5
adb pull /sdcard/01.png
TIMEOUT /T 5
- Application,Service,Activity三者的Context的应用场景
NO1表示Application和Service可以启动一个Activity,不过需要创建一个新的task任务队列。而对于Dialog而言,只有在Activity中才能创建。
对于需要在静态内部类中使用非静态外部成员变量(如:Context、View ),可以在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏。
Applicaiton 当需要显示Dialog时,需要dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)类型,否则会出现 Caused by: android.view.WindowManager$BadTokenException: Unable to add window – token null is not for an application
- adb查看过度绘制-GPU过度绘制
开启adb shell setprop debug.hwui.overdraw show
关闭adb shell setprop debug.hwui.overdraw false
原色:没有过度绘制
蓝色:1 次过度绘制
绿色:2 次过度绘制
粉色:3 次过度绘制
红色:4 次及以上过度绘制
- adb显示布局边界
显示:setprop debug.layout true
隐藏:setprop debug.layout false
注意,执行命令后需要重新打开应用才能生效。
系统可用内存不足和应用可用内存不足
如何使用android工具systrace进行调试
抖音 Android 性能优化系列:启动优化实践
字节码插桩
ASM 修改字节码
- 如何查看Android apk的签名信息
1、直接查看apk的签名信息:
keytool -list -printcert -jarfile D:\test.apk
2、查看keystore的签名信息:
keytool -list -v -keystore debug.keystore
3、先将apk后缀改为.zip,然后解压,然后进入META-INF目录,找到XXX.RSA文件
keytool -printcert -file XXX.RSA
用VsCode画类图、流程图、时序图、状态图
adb shell 查看CPU架构
关于32位和64位SO库混合引入Crash解决方案
说说Android项目中的armeabi,armeabi-v7a和x86
- apk引用那些so位于什么位置
tasks.whenTaskAdded { task ->
if (task.name=='transformNativeLibsWithMergeJniLibsForxxxRelease') { //如果是有多个flavor,则用 mergeFlavorDebugNativeLibs的形式
task.doFirst {
println("------------------- find so files start -------------------")
println("------------------- find so files start -------------------")
println("------------------- find so files start -------------------")
it.inputs.files.each { file ->
printDir(new File(file.absolutePath))
}
println("------------------- find so files end -------------------")
println("------------------- find so files end -------------------")
println("------------------- find so files end -------------------")
}
}
}
def printDir(File file) {
if (file != null) {
if (file.isDirectory()) {
file.listFiles().each {
printDir(it)
}
} else if (file.absolutePath.endsWith(".so")) {
println "find so file: $file.absolutePath"
}
}
}
题库
Retrofit +rxjava 如何触发enqueue
Observable.subscribe()-> subscribeActual(observer) ->CallEnqueueObservable.subscribeActual()->call.enqueue(callback);
自定义View/ViewGroup详解
Android的RV列表刷新?Payload 与 Diff 的方式有什么异同?
插件化
ASM 应用与实践
android自定义Gradle插件和asm的用法的一些知识
自定义Gradle插件
CoordinatorLayout协调者布局原理分析并实现吸顶效果
MinSdkVersion、CompileSdkVersion、TargetSdkVersion
Wireshark的抓包和分析,看这篇就够了!(内含视频教程)
学得懂的 Android Framework 教程之Binder
Android Framework一学就会,你学“废”了吗?
详解静态、动态代理以及应用场景
Android 无所不能的 hook,让应用不再崩溃
Android那两个你碰不到但是很重要的类之ViewRootImpl
Android ImageView scaleType属性值及显示效果
终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
空间换时间-五秒出解:从900ms到5ms的幕后优化大揭秘!
2023 Android 折叠屏适配详解,是时候点亮新技能了
RxJava2开发小记:或许能帮你解决RxAndroid+Retrofit出现的OOM
掌握这10个Android LaunchMode问题,面试轻松搞定
JetPack Compose 实战:打造一个 Compose 版本的「玩 Android」
XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager
- adb 发送广播
只有action
adb shell am broadcast -a com.a.b.c.d
有action、mimeType需指定具体的广播类
adb shell am broadcast -a com.a.b.c.d -t live/com.a.a.a -n com.conch.a.a/.receiver.TestReceiver
UnsatisfiedLinkError: dlopen failed: “/data/app/~~xxxxx==/lib/arm64/.so“ has bad ELF magic: 00000000
java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 解决方案
盒子修改host
1.adb shell
2.echo 1 > /sys/class/remount/need_remount; mount -o rw,remount /system
3.busybox vi system/etc/hosts
4. i 进行编辑
5. ESC 输入:wq保存退出
6. ECS 输入:q!退出
1.adb root
2.TIMEOUT /T 1
3.adb remount
4.TIMEOUT /T 1
5.adb push E:\box-hosts\1\hosts /system/etc/hosts
6.TIMEOUT /T 60
make
cygwin是windows的linux模拟环境,使用cygwin进行模拟,安装时选择make。