Android Skill:小技巧
APK安装失败[INSTALL_FAILED_VERIFICATION_FAILURE]
1 | adb shell su -c settings put global package_verifier_enable 0 |
不插拔USB恢复offline状态的设备
1 | adb devices |
adb查看apk信息
1 | adb shell pm list packages | grep aweme |
armeabi-v7a系统调用表
Android Studio中指定ABI
编辑app -> build.gradle
1 | defaultConfig { |
相关ABI连接:
https://developer.android.com/ndk/guides/abis.html#sa
调整屏幕亮度
1 | adb shell su |
截图
1 | adb shell screencap -p /sdcard/01.png & adb pull /sdcard/01.png |
获取Application和Context
1 | android.app.ActivityThread.currentApplication().getApplicationContext() |
adb logcat中搜索指定进程的日志正则表达式
1 | 7679\s+\d+\s+\w |
android logcat原理:http://gityuan.com/2018/01/27/android-log/
打开Url Scheme协议链接
1 | adb shell am start -a android.intent.action.VIEW -d "snssdk1128://user/profile/3733569708763603" |
将用户证书修改为系统证书
1 | adb shell |
查找端口占用情况
- 通过端口号查找占用该端口的
uid
例如需要查找8081
端口,对应的16进制为:0x1f91
1 | adb shell |
结果如下:
1 | 53: 00000000000000000000000000000000:1F91 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 10080 0 300399 1 0000000000000000 99 0 0 10 -1 |
- 通过
uid
查找该uid
对应的进程号
其中10080
是uid
; UID(10080) - 10000 = 80 = u0_a80
1 | adb shell su -c ps | grep u0_a80 |
结果如下:
结果有多个进程都属于u0_a80
用户的,那么8081
端口就在其中一个进程中
1 | u0_a80 9732 530 1828844 114996 SyS_epoll_ 00f734acb8 S com.ss.android.ugc.aweme:push |
- 根据进程id确定uid
1 | adb shell su -c cat /proc/9907/cgroup |
结果如下:
1 | 3:cpuset:/foreground |
查找顶级Activity
1 | adb shell dumpsys activity activities > activity_activities.log |
输出格式如下:其中每个Hist
代表一个Activity
1 | ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) |
更改adbd的监听端口
1 | $ adb shell su |
启用/关闭开发者选项 - USB debugging
启用:setprop persist.sys.usb.config mtp,adb
关闭:setprop persist.sys.usb.config mtp
相关代码:
https://developer.android.com/reference/android/provider/Settings.Global.html#ADB_ENABLED
https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1.2/services/java/com/android/server/usb/UsbDeviceManager.java
调试启动APK
1 | :: Example: |
TWRP模式下挂载指定分区
1 | adb shell |
Ubuntu 上使用 Android-SDK
安装
platforms
时需要注意引号1
2root@github:/opt/android_sdk# ./tools/bin/sdkmanager --install "platforms;android-23"
[=======================================] 100% Unzipping... android-6.0/source.p
logcat
android的Log.d系列日志是写在/dev/log_xxx文件中的;而/dev是挂载在tmpfs文件系统上,所以重启之后日志就消失了。参考:system/core/liblog/logd_write.c
和system/core/liblog/logd_write_kern.c
1 | # adb shell su -c mount | grep /dev |
Hide all methods with CMAKE
在 CMAKE 中设置隐藏所有方法(不显示他们的符号);
Hide all methods without add “__attribute__(visibility(“default”))” for everyone of them:
1 | set_target_properties(YOUR_TARGET_NAME PROPERTIES CXX_VISIBILITY_PRESET hidden) |
Fucking knack of use ollvm edition clang to compile so on Android Studio
在 Android Studio 中使用 ollvm 版本的 clang 编译 so;
As you know, if you just overwrite the compiler executable file with ollvm edition, then you will get “‘xxx.h’ file not found” error, actually I am not understand this error explicitly, because the file exactly is there, and it will perform like you want when execute that compile command on shell, so here is my approach to avoid that:
Open “YOUT_PROJECT_PATH\app.externalNativeBuild\cmake\debug\TARGET_ABI\rules.ninja”, find the line of “rule C_COMPILER__TARGET”(TARGET mean the target name you specified by “add_library” on “CMakeLists.txt”), and you will find the path of clang executable file under it, modify it with your ollvm edition clang, then build your project as normal, you will get the ollvm compiled file.
如果简单的使用 ollvm 版本的 clang.exe 等可执行文件替换掉原版 ndk toolchain 中的 exe,那么将会报一些头文件查找不到的错误,网上说的原因似乎是不同版本的 clang 将会使用的头文件有差异,然而如果在控制台中直接使用 ollvm 版本 clang 去手动执行编译命令,是可以正常编译成功得到 .o 文件的,以下是我避免该坑的方法:
打开 “YOUT_PROJECT_PATH\app.externalNativeBuild\cmake\debug\TARGET_ABI\rules.ninja”,找到 “rule C_COMPILER__TARGET” 这一行(TARGET 指你在 CMakeLists.txt 中使用 add_library 指定的库名),然后你会在下面几行找到编译使用的 clang 路径,把它替换为你 ollvm 版本 clang 的路径,然后正常编译即可得到你想要的 so。