- 通过carshhandler来获取应用的carsh信息
- android提供了Thread类中的一个方法setDefaultUncaughtExceptionHandler。平时可以将carsh信息存储到sd卡然后在合适时机上传到服务器。
-自定义一个carshhandler实现UncaughtExceptionHandler。代码点击此处在Application的onCreate方法中设置一下即可。CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this);
- android提供了Thread类中的一个方法setDefaultUncaughtExceptionHandler。平时可以将carsh信息存储到sd卡然后在合适时机上传到服务器。
2.使用multidex来解决方法数越界
- android单个dex(包含android framework,jar,本身代码)不能超过方法数65536.但是在低版本手机因为dexopt做优化dex没有达到65536也会报错。
首先删除无用的代码。在Android 5.0之前使用multidex需要引入android-support-multidex.jar包;从Android 5.0开始,系统默认支持了multidex,它可以从apk中加载多个dex。Multidex方案主要针对AndroidStudio和Gradle编译环境。在app的module下面添加
android {
...
defaultConfig {
// enable multidex support
multiDexEnabled true
}
...
}
和添加对multidex的依赖
compile 'com.android.support:multidex:1.0.0'
- 最后有三种方案在代码中加入multidex功能。
1.在AndroidManifest文件中指定Application为MultiDexApplication
<application android:name="android.support.multidex.MultiDexApplication"
2.让应用的Application继承自MultiDexApplication 3.重写Application的attachBaseContext方法,这个方法要先于onCreate方法执行 `public class TestApplication extends Application {@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this); //
}
}`
注意采用上面的配置之后,如果应用的方法数没有越界,那么Gradle并不会生成多个dex文件;如果方法数越界后,Gradle就会在apk中打包2个或者多个dex文件,具体会打包多少个dex文件要看当前项目的代码规模
但是同时也带来了问题:1).应用启动速度会降低,因为应用启动的时候会加载额外的dex文件,所以要避免生成较大的dex文件;2).需要做大量的兼容性测试,因为Dalvik LinearAlloc的bug,可能导致使用multidex的应用无法在Android 4.0以前的手机上运行
3.动态加载技术此处转载
(1)动态加载技术又称插件化技术,将应用插件化可以减轻应用的内存和CPU占用,还可以在不发布新版本的情况下更新某些模块。不同的插件化方案各有特色,但是都需要解决三个基础性问题:资源访问,Activity生命周期管理和插件ClassLoader的管理。
(2)宿主和插件:宿主是指普通的apk,插件是经过处理的dex或者apk。在主流的插件化框架中多采用特殊处理的apk作为插件,处理方式往往和编译以及打包环节有关,另外很多插件化框架都需要用到代理Activity的概念,插件Activity的启动大多数是借助一个代理Activity来实现的。
(3)资源访问:宿主程序调起未安装的插件apk,插件中凡是R开头的资源都不能访问了,因为宿主程序中并没有插件的资源,通过R来访问插件的资源是行不通的。 Activity的资源访问是通过ContextImpl来完成的,它有两个方法getAssets()和getResources()方法是用来加载资源的。 具体实现方式是通过反射,调用AssetManager的addAssetPath方法添加插件的路径,然后将插件apk中的资源加载到Resources对象中即可。
(4)Activity生命周期管理:有两种常见的方式,反射方式和接口方式。反射方式就是通过反射去获取Activity的各个生命周期方法,然后在代理Activity中去调用插件Activity对应的生命周期方法即可。 反射方式代码繁琐,性能开销大。接口方式将Activity的生命周期方法提取出来作为一个接口,然后通过代理Activity去调用插件Activity的生命周期方法,这样就完成了插件Activity的生命周期管理。
(5)插件ClassLoader的管理:为了更好地对多插件进行支持,需要合理地去管理各个插件的DexClassLoader,这样同一个插件就可以采用同一个ClassLoader去加载类,从而避免了多个ClassLoader加载同一个类时所引起的类型转换错误。
3.反编译初步
主要介绍使用dex2jar和jd-gui反编译apk和使用apktool对apk进行二次打包