不管你是超级小白兔,还是过弯不减速的资深老司机,开发过程中可能会遇到各种各样的问题。这里主要聚集的是实时通讯或者多媒体相关的问题。
需要注意的是,如果你不能借助外力看到一些必须的信息的话,一定要学会,否则成不了 Senior/Staff/Principal Android Developer。
崩溃了想办法弄到调用栈,当然去找 logcat 或者 bugreport 或者 tombstone 或者 Bugly 或者 Crashlytics
- adb logcat > logcat.txt
这是一个文本文件,直接拿出来就看
- adb bugreport > bugreport.txt
这也是一个文本文件,可以拿出来直接看或者通过 chkbugreport 工具来分析 http://developer.sonymobile.com/knowledge-base/tools/analyse-your-bugreports-with-our-open-source-tool/
-
/data/tombstones/ 对于一些 root 权限的的机器,我们也可以把它的墓志铭弄出来分析
-
其他 Bugly 或者 crashlytics 如果不是太懂可以去互联网搜寻
-
堆栈当中会有一些 关键字,比如 AndroidRuntime 或者 Fatal/fatal 或者 signal/SIG
Android 应用程序运行的时候一般包括位于虚拟机代码部分和本地代码部分,两者崩溃是不一样的。
虚拟机上执行的代码崩溃比较好查,通常我们能够看到行数,直接对着源码去看就好了。
本地代码稍微难看点,但是也可以借助 addr2line 工具
$PATH_TO_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line -f -e armeabi-v7a/libagora-rtc-sdk.so 0x0029b6f4
so 文件是带符号的,后面一串 16 进制的就是 PC 地址,这样也可以反解出代码行数
adb logcat -v threadtime | ndk-stack -sym PATH_TO_YOUR_NATIVE_PROJECT/obj/local/armeabi-v7a
通常来说是因为 SurfaceView 的原理和其他不一样,具体的参见 https://developer.android.com/reference/android/view/SurfaceView 或者各路网络上搜索。
跟这个症状还有关的是它的层级。通常来说可以通过 setZOrderOnTop/setZOrderMediaOverlay 来去解决,这两个是不一样的。
跟 4. 差不多
早期有工具叫做 Hierarchy Viewer 或者 uiautomatorviewer,如今 Android Studio 提供更方便的工具 Tools -> Layout Inspector,打开看看就知道了。
很多工具,但是我一般用 http://ibotpeaches.github.io/Apktool/
反编译 apk
apktool d your_apk_name.apk
重新打包 apk
apktool b your_apk_name
在 your_apk_name/dist 下面即可找到打包好的 apk
可以把要签名的 apk 拷贝到 ~/.android
当中,然后在该目录下执行
jarsigner -verbose -keystore resigned.keystore -signedjar baba_signed.apk baba.apk resigned.keystore
根据提示输入 resigned.keystore 的密码即可开始签名
直到看到类似于
jar signed.
这类的输出,就表示签名成功
A) 通过上面的步骤可以实施,只需要找到位于 lib 文件夹下的 so 文件,替换之后再打包即可
B) 通过 https://github.com/asLody/VirtualApp 来完成 过程很简单,先设备上安装 VirtualApp,再 VirtualApp 里面安装需要替换的应用(不管是克隆还是全新安装都可以)
adb shell
run-as io.virtualapp
cd /data/data/io.virtualapp/virtual/data/app/
想法把 so 拷贝到对应的地方,比如 /data/data/io.virtualapp/virtual/data/app/xyz.xxx/lib
重启 App 运行,不行就重启 VirtualApp 和你想换的 app
看看代码没有逻辑错误的话,看看 Shader 是否正确,把所有 OpenGL 的 error 都弄出来看下 glError()
目前这两个 API 不支持自己 new SurfaceView 或者 xml 配置的 SurfaceView,需要找到 SDK 对应的创建渲染视图的方法。
Gradle 以及 gradle-wrapper 需要更新