Android 开发之AndFix

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:[email protected]‘
}

接着我们得在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

时间: 2024-10-11 23:56:59

Android 开发之AndFix的相关文章

Android开发之Tween(补间动画)完全解析(下)

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734 在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章:Android开发之Tween(补间动画)完全解析(上),这篇文章将从代码的角度实现上篇文章的效果.如有疑问请留言,如有谬误欢迎批评指正. T

Android开发之JSON使用

Android开发之JSON使用 今天在论坛看到有不少朋友问关于json的问题,所以想写一篇关于android中使用json的博客. 首先 json是什么 JSON的全称是JavaScript Object Notation,从这里可以看到它源于JavaScript,它采用文本形式体现.比如 {"name":"zhangsan","age":20,"wife":"如花"} 这个简单表示了一个对象,在java

Android开发之bindService()侦听service内部状态

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之Fragment详解

Android开发之Fragment学习 1.简介: Fragment是Android 3.0引入的新API. Fragment代表了 Activity的子模块,因此可以把Fragment理解成Activity片段.Fragment用于自己的生命周期,也可以接受它自己的输入事件. Fragment必须被"嵌入" Activity中使用,因此虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制.例如,当Activity暂停时,

Android开发之SpannableString详解

在实际的应用开发过程中经常会遇到,在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等.一般情况下,TextView中的文本都是一个样式,对于类似的情况,可以借助SpannableString或SpannableStringBuilder对象来实现以上设置. SpannableString与SpannableStringBuilder都可以将某段文本设置成一个Span,在Android中,Span表示一段文本的效果,例如,链接形式.图像.带背景的文本等.只

Android开发之Html类详解

在进行Android开发中经常回忽略Html类.这个类其实很简单,就是将HTML标签文本解析成普通的样式文本.下面就让我么看一下这个类的具体介绍. 类结构: java.lang.Object    ? android.text.Html 类概述: 这个类用于处理的HTML字符串并将其转换成可显示的样式文本.但并不是所有的HTML标记的支持. 公有方法: 说其简单是应为它就有四个方法: Public Methods static String escapeHtml(CharSequence tex

Android开发之View重写相关API-onLayout,onMeasure,MeasureSpec

 1.onLayout android.view.ViewGroup protected void onLayout(boolean changed, int l, int t, int r, int b) 执行layout操作时调用onLayout方法.View要给它的每个Child设定size和position.拥有Children的子类需要重写onLayout方法并且调用每个Child的layout方法. 参数changed表示view的size或position发生变化.参数l, t,

android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753 [java] view plaincopy import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.apps.service.Player

Android开发之Handler和Looper的关系

关于Handler的总结. Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等. MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行.当然,存放Message并非实际意义的保存,而