通过给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;
}
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的解决方案,能够很好解决方法数越界的问题。
使用apkool,dex2jar,jd-gui反编译apk