13.综合技术
Thread.setDefaultUncaughtExceptionHandler
默认异常处理器是Thread类的静态成员,因此它的作用对象是当前进程的所有线程。
在Android中单个dex文件所能够包含的最大方法数为65536,这包含Android Framework、依赖的jar包以及应用本身的代码中的所有方法。
dexopt是一个程序,应用在安装时,系统会通过dexopt来优化dex文件,在优化过程中dexopt采用一个固定大小的缓冲区来存储应用中所有方法的信息,这个缓冲区就是LinearAlloc。LinearAlloc缓冲区在新版本的Android系统中其大小是8MB或者16MB,但是在Android 2.2和2.3中只有5MB,当待安装的apk中的方法数比价多时,尽管它还没有达到65536这个上限,但是它的存储空间仍然有可能超出5MB,这种情况下dexopt程序就会报错,从而导致安装失败。
插件化方案必须要解决三个基础性问题:
- 资源访问,加载资源的方法是通过反射,通过调用AssetManager中的addAssetPath方法,可以将一个apk中的资源加载到Resources对象中。
- Activity生命周期管理,可以通过反射方式和接口方式来管理Activity生命周期。反射的方式很好理解,首先通过Java的反射去获取Activity的各种生命周期方法,比如onCreate,onStart,onResume等,然后在代理Activity中去调用插件Activity对应的生命周期方法即可。使用反射来管理插件Activity的生命周期是有缺点的,一方面是反射代码写起来比较复杂,另一方面是过多使用反射会有一定的性能开销。接口方式很好地解决了反射方式的不足之处,这种方式将Activity的生命周期方法提取出来作为一个接口,然后通过代理Activity去调用插件Activity的生命周期方法,这样就完成了插件Activity的生命周期管理,并且没有采用反射,这就解决了性能问题。
- ClassLoader的管理,为了更好地对多插件进行支持,需要合理地去管理各个插件的DexClassLoader,这样同一个插件就可以采用同一个ClassLoader去加载类,从而避免了多个ClassLoader加载同一个类时所引发的类型转换错误。