Android开发艺术探索:综合技术

使用CrashHandler来获取应用的crash信息

通过给Thread设置线程默认的异常处理器,由于线程默认处理器是Thread类的静态成员,所以它的作用对象是当前进程的所有线程,可以在Application初始化的时候设置,然后将UncaughtExceptionHandler回调的异常信息做处理。

/**
 + Sets the default uncaught exception handler. This handler is invoked in
 + case any Thread dies due to an unhandled exception.
 *
 + @param handler
 +            The handler to set or null.
 */
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {
    Thread.defaultUncaughtHandler = handler;
}

使用multidex来解决方法数越界

Android中的单个dex文件所能够包含的最大方法数是65536,这包含Android Framework、依赖的jar包以及应用本身的代码中的方法。当应用的方法达到65536后编译器就无法完成编译工作并抛出类似下面的异常:

 UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
        at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
        at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
        at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)

之前很多应用采用插件化机制来动态加载部分的dex,通过将dex拆分成多个dex,一定程度上解决了方法越界的问题,但是插件化是一套重量级的技术方案,兼容问题较多,不是很好解决方法数越界的方案。
Google在2014年提出了multidex的解决方案,能够很好解决方法数越界的问题。

Android动态加载技术

反编译初步

使用apkool,dex2jar,jd-gui反编译apk