天天看点

HotFix 集成文档

之前有跟踪考察过这种热修复技术,这段时间阿里公测了HotFix 特此写这篇集成文档。

第一步 登陆阿里百川 创建应用

HotFix 集成文档

第二步 创建项目 引用代码库

当然也可以引用官方jar包,我这里直接引用远程库了。

dependencies {
    compile 'com.alibaba.sdk.android.plugins:alisdk-hotfix:1.0.0.3'
    compile 'com.alibaba.sdk.android.plugins.jar:alisdk-utdid:0.0.1'
}
           
HotFix 集成文档

第三步 AndroidManifest.xml 中添加配置信息

在“application”节点下添加如下配置:

<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="your-app-secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="your-rsa-secret" />
           

添加权限

<! -- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<! -- 存储读写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
           
HotFix 集成文档

画红线的地方替换你的信息。由于现在hotfix是属于公测期间所以需要你申请公测资格

申请完之后就可以在hotfix后台看到你的信息了 比如:appId res密钥 secret信息等

HotFix 集成文档

第四步 在你的Application中添加hotfix代码

这个地方不过多介绍了 mAppId需要替换

public class MainApp extends Application {

    private String mAppVersion;

    private String mAppId = "你的APPID";

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            mAppVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), ).versionName;
        } catch (Exception e) {
            this.mAppVersion = "1.0.0";
        }
        HotFixManager hotFixManager = HotFixManager.getInstance().initialize(this, mAppVersion, mAppId, new NewPatchListener() {
            @Override
            public void handlePatch(int i) {
                Toast.makeText(MainApp.this, "请重启应用进行更新", Toast.LENGTH_LONG).show();
            }
        });
        hotFixManager.queryNewHotPatch();
    }
}
           

第五步 修改代码

打补丁之前的错误代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private int s = ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_hot_fix_test).setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.btn_hot_fix_test:
                int i =  / s;
                Log.w("wzh", "" + i);
                Toast.makeText(this, "修复成功", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
           

修复bug之后的代码

package com.cehome.hotfixtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private int s = ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_hot_fix_test).setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.btn_hot_fix_test:
                if (s == ) {
                    s = ;
                }
                int i =  / s;
                Log.w("wzh", "" + i);
                Toast.makeText(this, "修复成功", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
           

HotFix要求在原来的代码上编码,注意不要新增Field也不要新增方法,只需要在原来的方法里边修改逻辑解决掉问题即可,例如:

修改前的方法:
 public void A(Object a) {
  ...
  a.getXXX();//a对象可能为空,而造成线上crash
 } 

 修改后的方法:
 public void A(Object a) {
  ...
  if (a != null) {
   a.getXXX();
  }
 }
           

将修改后的工程打包apk与修复前apk使用patch工具即可生成patch。

首先,需要声明的是,patch是针对客户端某个版本的,patch需要和版本绑定。

举个例子:

新上线的版本1.0发现了一个bug,表示为bug1

修复一个bug以后基于1.0版本产生patch1,修复1.0版本bug1

过不久又发现一个bug,表示为bug2

此时要在修复bug1的基础上再修复bug2,修复后的APK中应包含bug1和bug2,然后在基于1.0版本产生patch2,去替换之前的patch1。

也就是说,同一个版本中的最新patch总是包含该版本所有的bug修复。客户端一个版本只能对应一个patch。

当你选择升级应用时,当然也必须包含该之前所有的bug修复代码。

第六步 打补丁

java -jar alisdk-hotfix-android-pack-tools.jar PATCH srcAPK fixedAPK outPatch signInfo outLog

参数说明:

srcAPK:填写本地的原始APK(有问题的APK)的本地路径,如果文件找不到会报错

fixedAPK:已经修复过该问题的APK

outPatch:输出patch的路径

signInfo:本地的签名配置属性文件,可选,不输入或者不正确则不做签名

outLog:输出日志的目录,可以不填写,默认为控制台输出

这是我截图:

HotFix 集成文档
我的目录结构:
HotFix 集成文档

第七步 上传补丁

先打开hotfix后台创建一个版本信息

HotFix 集成文档

创建完版本信息之后,点击查看详情上传补丁信息。

上传完补丁之后会看到二维码用测试工具先测试补丁是否可用。

HotFix 集成文档

第八部 测试补丁

先下载补丁测试工具 补丁测试工具

HotFix 集成文档

先连接应用 然后扫补丁二维码。

HotFix 集成文档

如果有任何问题可以加入叮叮群 咨询官方人员

HotFix 集成文档

代码混淆

#HotFix
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}
-keep class com.alipay.euler.andfix.**{
    *;
}
-keep class com.taobao.hotfix.aidl.**{*;}
-keep class com.ta.utdid2.device.**{*;}
-keep class com.taobao.hotfix.HotFixManager{
    public *;
}
           

文档支持更新中。。。

hotfix现在处于公测中,可能还有一些问题。也在持续关注中

官网地址:http://baichuan.taobao.com//product/hotfix.htm?spm=a3c0d.7662652.1998907851.8.JNLdp3