码迷,mamicode.com
首页 > 移动开发 > 详细

Android 开发之AndFix

时间:2016-04-22 19:06:59      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

AndFix

阿里巴巴开源项目,地址:https://github.com/alibaba/AndFix

技术分享

tools里面有我们需要的工具,docs是一些文档介绍。AndFix解决在线修复bug,而不是重新发布新版本apk,AndFix支持Android版本从2.3到6.0。我们从下图来了解一下实现原理

技术分享

修复过程示意图

技术分享

我们该如何使用这个库呢?首先要添加依赖

//.........Maven 方式...........
<dependency>
    <groupId>com.alipay.euler</groupId>
    <artifactId>andfix</artifactId>
    <version>0.4.0</version>
    <type>aar</type>
</dependency>

//..............Gradle方式..................
dependencies {
    compile ‘com.alipay.euler:andfix:0.4.0@aar‘
}

接着我们得在Application里面初始化PatchManager,并提供两个方法:打补丁、移除所有补丁(发布版本更新需要移除无用的补丁),具体代码如下:


/**
 * Created by idea on 2016/4/21.
 */
public class MyApplication extends Application {

    protected PatchManager patchManager;

    @Override
    public void onCreate() {
        super.onCreate();
        patchManager = new PatchManager(this);
        patchManager.init(getAppVersion());
        patchManager.loadPatch();
    }

    /**
     * 获取系统当前版本号,默认1.0
     *
     * @return
     */
    private String getAppVersion() {
        try {
            PackageManager manager = getPackageManager();
            PackageInfo info = manager.getPackageInfo(getPackageName(), 0);
            String version = info.versionName;
            return version;
        } catch (Exception e) {
            e.printStackTrace();
            return "1.0";
        }
    }

    /**
     * 热修复打补丁,根据版本信息与服务器匹配下载补丁文件到手机,并记录路径和版本号,配合加载补丁
     * @param path
     */
    public void addPatch(String path) {
        try {
            patchManager.addPatch(path);//path of the patch file that was downloaded
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 安装新版本APK需要调用该方法
     */
    public void removeAllPatch() {
        //删除所有已加载的patch文件
        patchManager.removeAllPatch();
    }
}

具体怎么运用到实际开发中呢,进过一番思考写下了这么一个概要,稍后准备工作完成后我们来写一个demo实践

/**
 * Created by idea on 2016/4/21.
 */
public class HotFix {

    private boolean isRemovePatch = true;

    private String patchVersion;

    private String apkVersion;

    private String updateAPKUrl;

    private String updatePatchUrl;

    private boolean isUpdateAPK;

    private boolean isUpdatePatch;


    public void onUpdateAPKWithHotFix(String apkVersion, String patchVersion, OnUpdateAPKListener onUpdateAPKListener){

    }

    interface OnUpdateAPKListener{

        void onResponse(HotFix hotFix);
    }

}

以上代码稍后实践,tools文件下 apkpatch-1.0.3 工具的使用可以在命令行切换到解压目录下,输入apkpatch查看,如下图

技术分享

简单对这些命令说明一下

apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>

-f <new> :新版本apk
-t <old> : 旧版本apk
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore
-p <***>: keystore的密码
-a <alias>: keystore 用户别名
-e <***>: keystore 用户别名密码

简单的测试一下工具的使用:TextView赋值的bug修复(不为null),第一个版本 (签名打包一个old.apk)


public class MainActivity extends BaseActivity {

    private String content = "null";

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Bind(R.id.hotFix_TextView)
    TextView hotFixTextView;

    @Override
    public int getLayoutResId() {
        return R.layout.activity_main;
    }

    @Override
    protected void initialView() {
        super.initialView();
        hotFixTextView.setText(getContent());
    }
}

这里留的bug content==null 赋值现实问题,修复bug代码修改如下:(重新打包生成new.apk)

  private String content = "null";

    public String getContent() {
        if(content == null || content.equals("null")){
            return "未知";
        }else{
            return content;
        }
    }

使用工具生成.apatch文件

技术分享

在进行demo编写之前,我们先对其业务逻辑进行分析,得出下图

技术分享

接口设计请求参数:

技术分享

接口响应值Data:

技术分享

正式的开发中应该是按照上面这个流程来的,但是为了方便我们demo就直接把.apatch文件放入sdcard,直接模拟请求实现热修复,下面是相关源码下载地址:http://download.csdn.net/detail/analyzesystem/9499245;把.apatch文件放入指定位置即可。(开发集成一定不要忘记添加读写权限),下图是实现效果图:

技术分享

朋友告诉我这个库热修复会有很多问题,在很多手机上有bug,不过这不是我现在关心的问题,实践成功了待以后开发应用中遇到再说。如果你们谁有遇到bug坑,还请留言,以便于累计少踩坑。

Dexposed

貌似又是阿里巴巴的,项目地址:https://github.com/alibaba/dexposed

项目集成依赖可选直接添加到您的项目dexposed AAR编译的库,它包含一个jar文件”dexposedbridge .jar,两libdexposed.so libdexposed_l.so文件,gradle依赖如下:

 dependencies {
        compile ‘com.taobao.android:dexposed:0.1.1@aar
    }

将下面一行插入到你的应用程序的初始化

 public class MyApplication extends Application {

        @Override public void onCreate() {        
            // 检查当前设备是否支持该库
            if (DexposedBridge.canDexposed(this)) {
                // 使用Dexposed启动AOP

            }
        }
        ...
    }

dexposed Dalvik运行ARM架构支持所有设备从Android 2.3到4.4(不包括3),然而在我查询了一些资料后,特别是看了http://pcedu.pconline.com.cn/484/4841077.html这篇文章后,放弃了对该库的深入了解,需要root权限在某些定制机上还需要定制版,开发还需要走各种分支,简直就是不能忍受!!这个时代不属于它了。HotFix、Nuwa、DroidFix、DynamicAPK、AndHotFix、AndFixx也粗略过了一遍,集成来说还是AndFix方便点

参考资料

http://blog.csdn.net/qxs965266509/article/details/49802429

Android 开发之AndFix

标签:

原文地址:http://blog.csdn.net/analyzesystem/article/details/51207813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!