在我们容器虚拟化产品开发过程中,时常会遇到某些应用无法启动或运行时异常崩溃的问题;让应用行为信息丰富,则能还原应用异常发生过程,对我们快速分析问题至关重要。
在这里需要用到以下几个开源工具:
- ByteHook: https://github.com/bytedance/bhook
- ShadowHook: https://github.com/bytedance/android-inline-hook
- Binderceptor: https://www.github.com/iofomo/binderceptor
01. 举个栗子
我们在做应用容器时,尝尝会遇到应用进程崩溃,通过adb
抓取的日志,却只有很少的几行日志,没有其他任何信息,因此通过一些简单的方式让应用行为的痕迹还原,是我们第一步要做的事情。
9402 9402 D AndroidRuntime: Shutting down VM
9402 9402 I Process : Sending signal. PID: 9402 SIG: 9
02. 打印退出痕迹
通过拦截native
函数,打印Java
层的异常退出:
import android.os;
public class Process {
/**
* Returns the identifier of this process, which can be used with
* {@link #killProcess} and {@link #sendSignal}.
*/
public static final native void sendSignal(int pid, int signal);
/**
* @hide
* Private impl for avoiding a log message... DO NOT USE without doing
* your own log, or the Android Illuminati will find you some night and
* beat you up.
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public static final native void sendSignalQuiet(int pid, int signal);
}
public class Runtime {
private static native void nativeExit(int code);
}