接【上一篇 android面试 2019年知识点总结(1)】
异常数据捕获问题
CrashHandler
android
程序非常容易crash
,crash
之后,我们需要知道程序在哪里挂掉,时间点,手机的机型,屏幕,内存情况等等。所以,我们需要CrashHandler
。
一个标准的CrashHandler这样用:
- 定义CrashHandler
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private Context mContext;
private Thread.UncaughtExceptionHandler mDefaultExceptionHandler;
@Override
public void uncaughtException(Thread t, Throwable e) {
// 把异常信息,保存到SD卡,等待上传到服务,或者本地查看
// 注意:要通知下文件系统,文件发生改变,不然可能adb命令读不到,这里没做
dumpToSDCard(t, e);
e.printStackTrace();
if (mDefaultExceptionHandler != null) { //交给系统的UncaughtExceptionHandler处理
mDefaultExceptionHandler.uncaughtException(t, e);
} else {
Process.killProcess(Process.myPid()); //主动杀死进程
}
}
public void init(Context context) {
this.mContext = context;
mDefaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();//获取当前默认ExceptionHandler,保存在全局对象
Thread.setDefaultUncaughtExceptionHandler(this);//替换默认对象为当前对象
}
}
- 初始化
CrashHandler
然后一般在Application
的onCreate
方法,初始化这个CrashHandler
对象。
class MyApplication extends Application {
@Override void onCreate() {
// 一般采用单例模式,上面代码省略了
CrashHandler handler = CrashHandler.getInstance();
handler.init(this);
}
源码说明:
Thread
类有一个异常处理器,获取方式如下:
上面init
方法,就调用了 Thread.getDefaultUncatchExceptionHandler()
,得到异常处理器。
Thread
类还有一个静态方法 setDefaultUncatchException(UncaughtExceptionHandler handler)
,可以在发生异常时,监听异常的发生。 handler要实现方法:public void uncaughtException(Thread t, Throwable e)
, 我们在这个方法里处理异常信息,可以保存异常信息到文件,上传该文件, 还可以杀死进程。
mutidex
app的总体方法数有65536的个数限制,会导致一些问题:
- 编译出问题,抛异常
DexIndexOverflowException
, 相信很多人遇到过。 - 低版本的系统上安装错误。
Optimization failed. mutidextest-2.apk@classes.dex res = 65589
所以我们需要拆包,把构建生成的dex文件,拆分成多个。
mutidex可以解决这个问题。
android的sdk提供了工具帮助开发者分包:5.0以前提供 android-support-mutidex.jar包。
自己在项目中可以通过gradle配置:
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
applicationId "graphic.com.game"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
multiDexEnabled true
}
}
dependencies {
implement ...
// 引入 multidex 包
implement 'com.android.support:multidex:1.0.0'
}
还差一步,就可以实现分包工作了:
-
Application
继承MutiDexApplication
, -
或者在 Application的 attachBaseContext(Context context) 方法中,调用:
MultiDex.install(this);
通过这样,超过65536个方法,项目中的 dex文件就会被拆分成多个 dex文件。
动态加载,插件技术
这种技术,需要的功底挺深厚的,参考一个项目:dynamic-load-apk
逆向,反编译技术
建议去看尼古拉斯-赵四的博文。
安全技术是学不完的,这辈子都学不完的~~ 摔!!!!
参考:
1.《Android艺术开发探索
》第13章 综合技术
2. CrashHandler–程序异常退出处理