13.1 使用CrashHandler来获取应用的Crash信息
应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?
- 利用Thread类的setDefaultUncaughtExceptionHandler方法!defaultUncaughtHandler是Thread类的静态成员变量,所以如果我们将自定义的UncaughtExceptionHandler设置给Thread的话,那么当前进程内的所有线程都能使用这个UncaughtExceptionHandler来处理异常了。
- 作者实现了一个简易版本的UncaughtExceptionHandler类的子类CrashHandler,源码在此 CrashHandler的使用方式就是在Application的onCreate方法中设置一下即可
//在这里为应用设置异常处理程序,然后我们的程序才能捕获未处理的异常
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this);
13.2 使用multidex来解决方法数越界
android的方法数65536问题,使用multidex解决
public class TestApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
13.3 android的动态加载技术
-
动态加载技术又称插件化技术,将应用插件化可以减轻应用的内存和CPU占用,还可以在不发布新版本的情况下更新某些模块。不同的插件化方案各有特色,但是都需要解决三个基础性问题:
- 资源访问,
- Activity生命周期管理
- 插件ClassLoader的管理。
宿主和插件:宿主是指普通的apk,插件是经过处理的dex或者apk。在主流的插件化框架中多采用特殊处理的apk作为插件,处理方式往往和编译以及打包环节有关,另外很多插件化框架都需要用到代理Activity的概念,插件Activity的启动大多数是借助一个代理Activity来实现的。
资源访问
宿主apk调起插件apk,一个大问题就是资源如何访问。由于插件apk没有安装,所以所有R开头的资源都是不能访问的。一个合理的方案:Activity的资源访问是通过ContextImpl来完成的,它有两个方法getAssets()和getResources()方法是用来加载资源的。 具体实现方式是通过反射,调用AssetManager的addAssetPath方法添加插件的路径,然后将插件apk中的资源加载到Resources对象中即可。-
Activity生命周期管理:有两种常见的方式,反射方式和接口方式。
- 反射方式就是通过反射去获取Activity的各个生命周期方法,然后在代理Activity中去调用插件Activity对应的生命周期方法即可。 反射方式代码繁琐,性能开销大。
- 接口方式将Activity的生命周期方法提取出来作为一个接口,然后通过代理Activity去调用插件Activity的生命周期方法,这样就完成了插件Activity的生命周期管理。
插件ClassLoader的管理:
为了更好地对多插件进行支持,需要合理地去管理各个插件的DexClassLoader,这样同一个插件就可以采用同一个ClassLoader去加载类,从而避免了多个ClassLoader加载同一个类时所引起的类型转换错误。