第13章.综合技术

来源:互联网 发布:网络卡盟 编辑:程序博客网 时间:2024/05/15 20:28
  1. 通过carshhandler来获取应用的carsh信息
    • android提供了Thread类中的一个方法setDefaultUncaughtExceptionHandler。平时可以将carsh信息存储到sd卡然后在合适时机上传到服务器。
      -自定义一个carshhandler实现UncaughtExceptionHandler。代码点击此处在Application的onCreate方法中设置一下即可。CrashHandler crashHandler = CrashHandler.getInstance();
      crashHandler.init(this);

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进行二次打包

0 0
原创粉丝点击