Android 热更新(阿里andfix)

主要有三种途径

一、QQ空间超级补丁技术(优先加载补丁内的class文件)

超级补丁技术基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。

目前,没有试用过,以后再说。

二、阿里andFix

优点:bug修复即时性。

补丁包采用差量技术,生成的PATCH体积小。

对应用无侵入,几乎无性能损耗。

缺点:不支持新增字段,以及修改<init>方法,也不支持对资源的替换。

由于厂商的自定义ROM,对少数机型暂不支持。(我的三星j3300就不支持)

首先 添加依赖

compile 'com.alipay.euler:andfix:0.3.1@aar'

(1)minifest.xml权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

(2)application里加载补丁

private static final String TAG = "euler";

    private static final String APATCH_PATH = "/out.apatch";

    static String DIR="apatch";
    /**
      * patch manager
      */
    private PatchManager mPatchManager;

    @Override
    public void onCreate() {
        super.onCreate();
        // initialize
        mPatchManager = new PatchManager(this);
        String appversion=getPackageManager().getPackageInfo(getPackageName(),0).versionName;
        mPatchManager.init(appversion);
        mPatchManager.loadPatch();
       

        try {
            String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
            File result = new File(patchFileString);
            if(result.exists()){
                mPatchManager.addPatch(patchFileString);
                File f = new File(this.getFilesDir(),DIR + APATCH_PATH); 
                if (f.exists()) {
                  new File(patchFileString).delete(); 
                }
            }
        } catch (IOException e) {
            Log.e(TAG,"addPatch-->"+e.getMessage());
        }
    }

(3)生成补丁文件,下载apkpatch-1.0.3,将密钥和修改bug前后的两个包(new-app,old-app)放进去,cmd-进入文件夹路径,输入以下命令,生成output文件夹,打开找到.apatch文件,重命名成out.apatch,发送到手机上,先杀死进程,重新打开就好了。

apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
 -a,--alias <alias>     keystore entry alias.
 -e,--epassword <***>   keystore entry password.
 -f,--from <loc>        new Apk file path.
 -k,--keystore <loc>    keystore path.
 -n,--name <name>       patch name.
 -o,--out <dir>         output dir.
 -p,--kpassword <***>   keystore password.
 -t,--to <loc>          old Apk file path.

猜你喜欢

转载自blog.csdn.net/qq_35022307/article/details/81205240