Android 增量更新

Android增量更新

概述

不讲原理只讲实现方式,利用的工具就是diff,如何编译打包也不讲,我已经将代码整理编译完成。

我会将这部分代码上传供大家参考,我也把so库导出来了,如果不想编译jni可以直接使用so库,使用方式也非常简单,即支持分差也支持合成,一般移动端只会用到合成,分差的功能则有服务端处理。

使用

方法1:
下载c++源码使用lib库,然后编译使用

方法2(推荐):
直接使用so库


/**
 * @author Tangren
 */
public class MainActivity extends AppCompatActivity {

    @InjectView(R.id.oldApkPath)
    TextView oldApkPath;
    @InjectView(R.id.newApkPath)
    TextView newApkPath;
    @InjectView(R.id.patchPath)
    TextView patchPath;
    @InjectView(R.id.button1)
    Button button1;
    @InjectView(R.id.button)
    Button button;

    private static final String PATH = Environment.getExternalStorageDirectory().getPath();
    private static final String newPath = PATH + File.separator + "patchdemo-release.apk";
    private static final String oldPath = PATH + File.separator + "patchdemo-release_old.apk";
    private static final String OUT_APK = PATH + File.separator + "out.apk";
    private static final String paPath = PATH + File.separator + "patch.patch";

    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);

        oldApkPath.setText("旧:" + oldPath);
        newApkPath.setText("新:" + newPath);
        patchPath.setText("拆分:" + paPath);

    }

    @OnClick({R.id.button1, R.id.button})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.button1://生成差分包
                Toast.makeText(this, "正在生成分差包稍等……", Toast.LENGTH_LONG).show();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if (PatchUtil.diff(oldPath, newPath, paPath)) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "patch包已经生成到" + patchPath, Toast.LENGTH_SHORT).show();
                                }
                            });

                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "patch包生成失败!", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }).start();

                break;
            case R.id.button://合并差分包
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if (PatchUtil.make(oldPath, OUT_APK, paPath)) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "apk生成到" + OUT_APK, Toast.LENGTH_SHORT).show();
                                    startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(new File(OUT_APK)),
                                            "application/vnd.android.package-archive"));
                                }
                            });

                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this, "合并差分包失败!", Toast.LENGTH_SHORT).show();
                                }
                            });

                        }
                    }
                }).start();

                break;
        }
    }
}

演示

[未更新时界面]

[未更新是大小]

有图有真相

我总共添加了大概20个小音源以及10张图片生成了帧动画,patch包总共4.13M,这就是热修复做不到的。

服务端

虽然有c++源码但是我不知道怎么生成windows使用的.dll文件,无奈我们服务器又是windows系统只能另想办法了,于是百度,找到了大神提供的供windows使用的bsdiff.exe文件,这里就不做演示了,资源里面有demo。

结束

其中很多细节这里没有怎么提及,注意合并的时候一定要效验签名的完整性,是时候把热修复改成增量更新了(ps:我们公司两种都用)!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴唐人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值