资讯详情

阿里热更新hotfix使用

一、SDK引入

项目build中添加

 buildscript {     repositories {         google()         jcenter()          //添加这句话话         maven {             url "http://maven.aliyun.com/nexus/content/repositories/releases"         }      }     dependencies {         ...     }  }  allprojects {     repositories {         google()         jcenter()         maven { url "https://jitpack.io" }          //添加这句话话         maven {             url "http://maven.aliyun.com/nexus/content/repositories/releases"         }      }

app目录下的build中添加:

//热更新-阿里 implementation 'com.aliyun.ams:alicloud-android-hotfix:3.2.14'

二、增加必要的权限

<!-- 网络权限--> <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" /> <!--     外部存储读取权限需要加载当地补丁的调试工具     只需调试工具即可获得外部补丁,不影响在线发布的补丁加载。调试时请自己做android6.0以上的运行时权限获取。 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

三、添加meta-data

AndroidManifest.xml文件的Application在节点下,添加以下内容:

<meta-data     android:name="com.taobao.android.hotfix.IDSECRET"     android:value="App ID" />      <meta-data     android:name="com.taobao.android.hotfix.APPSECRET"     android:value="App Secret" />      <meta-data     android:name="com.taobao.android.hotfix.RSASECRET"     android:value="RSA密钥" />

这三个值需要在前面下载aliyun-emas-services.json在文件中搜索,对应关系如下:

value名 对应字段
App ID hotfix.idSecret
App Secret emas.appSecret
RSA密钥 hotfix.rsaSecret

四、混淆配置(可选)

#使用和生成基线包mapping.txt -printmapping mapping.txt #生成的mapping.txt在app/build/outputs/mapping/release在路径下移动到/app路径下 #修复后的项目使用,确保混淆结果一致 #-applymapping mapping.txt #hotfix -keep class com.taobao.sophix.**{*;} -keep class com.ta.utdid2.device.**{*;} #防止inline -dontoptimize

五、代码配置

public class SophixStubApplication extends SophixApplication {     private final String TAG = "SophixStubApplication";       @Keep     @SophixEntry(MyApplication.class)     static class RealApplicationStub {     }      @Override     protected void attachBaseContext(Context base) {         super.attachBaseContext(base);         MultiDex.install(this);         initSophix();     }        /**      * 初始化Sophix      * 需要在attachBaseContext调用方法      * 并且要在super.attachBaseContext(base);和Multidex.install调用方法后      * 在其他方法之前      */     private void initSophix() {         String appVersion = "1.0.5.4";         try {             appVersion = this.getPackageManager()                     .getPackageInfo(this.getPackageName(), 0)                     .versionName;         } catch (Exception e) {         }         final SophixManager instance = SophixManager.getInstance();         instance.setContext(this)                 .setAppVersion(appVersion)                 .setSecretMetaData(null, null, null)                 .setEnableDebug(true)                 .setEnableFullLog()                 .setPatchLoadStatusStub(new PatchLoadStatusListener() {                     @Override                     public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {                         // 补丁加载回调通知                         if (code == PatchStatus.CODE_LOAD_SUCCESS) {                             // 表明补丁加载成功                             Log.i(TAG,"表明补丁加载成功");                         } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {                             // 说明新补丁的生效需要重启. 开发者可以提示用户或强制重启;                             // 建议: 用户可以监控后台事件, 然后应用自杀                             Log.i(TAG,"说明新补丁的生效需要重启. 开发者可以提示用户或强制重启");                         } else if (code == PatchStatus.CODE_LOAD_FAIL) {                             // 内部发动机异常, 此时建议清空本地补丁, 防止失败补丁重复加载                              SophixManager.getInstance().cleanPatches();                             Log.i(TAG,"内部发动机异常, 此时建议清空本地补丁, 防止失败补丁重复加载");                         } else {                             // 其他错误信息, 查看PatchStatus类说明                             Log.i(TAG,"其他错误信息, 查看PatchStatus类说明");                         }                          String msg = new StringBuilder("").append("Mode:").append(mode)                                 .ppend(" Code:").append(code)
                                .append(" Info:").append(info)
                                .append(" HandlePatchVersion:").append(handlePatchVersion).toString();
                        Log.e("----",msg.toString());

                    }
                }).initialize();
    }


    @Override
    public void onCreate() {
        super.onCreate();
        //queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
        SophixManager.getInstance().queryAndLoadNewPatch();

    }
}

六、把AndroidManifest里面的application改为这个新增的SophixStubApplication类

 <application
        android:name="com.my.pkg.SophixStubApplication"
        ... ...>
        ... ...

 

setAppVersion(appVersion)       设置版本号,版本号与控制台的版本号统一,才可以更新
                    这里我踩的坑,控制台上添加版本,是添加需要更新的版本,与版本升级没有关系

setAesKey(null)       //<可选>用户自定义aes秘钥, 会对补丁包采用对称加密

setEnableDebug(true)        <可选> isEnabled默认为false, 是否调试模式, 调试模式下会输出日志以及不进行补丁签名校验.
                    线下调试此参数可以设置为true, 查看日志过滤TAG
                    正式发布必须改为false,否则存在安全风险

setSecretMetaData(null, null, null)       <可选,推荐使用> 三个Secret分别对应AndroidManifest里面的三个,
                     可以不在AndroidManifest设置而是用此函数来设置Secret

setPatchLoadStatusStub        <可选> 设置patch加载状态监听器,
                    该方法参数需要实现PatchLoadStatusListener接口

//兼容老版本的code说明
    int CODE_LOAD_SUCCESS = 1;//加载阶段, 成功
    int CODE_ERR_INBLACKLIST = 4;//加载阶段, 失败设备不支持
    int CODE_REQ_NOUPDATE = 6;//查询阶段, 没有发布新补丁
    int CODE_REQ_NOTNEWEST = 7;//查询阶段, 补丁不是最新的 
    int CODE_DOWNLOAD_SUCCESS = 9;//查询阶段, 补丁下载成功
    int CODE_DOWNLOAD_BROKEN = 10;//查询阶段, 补丁文件损坏下载失败
    int CODE_UNZIP_FAIL = 11;//查询阶段, 补丁解密失败
    int CODE_LOAD_RELAUNCH = 12;//预加载阶段, 需要重启
    int CODE_REQ_APPIDERR = 15;//查询阶段, appid异常
    int CODE_REQ_SIGNERR = 16;//查询阶段, 签名异常
    int CODE_REQ_UNAVAIABLE = 17;//查询阶段, 系统无效
    int CODE_REQ_SYSTEMERR = 22;//查询阶段, 系统异常
    int CODE_REQ_CLEARPATCH = 18;//查询阶段, 一键清除补丁
    int CODE_PATCH_INVAILD = 20;//加载阶段, 补丁格式非法
    //查询阶段的code说明
    int CODE_QUERY_UNDEFINED = 31;//未定义异常
    int CODE_QUERY_CONNECT = 32;//连接异常
    int CODE_QUERY_STREAM = 33;//流异常
    int CODE_QUERY_EMPTY = 34;//请求空异常
    int CODE_QUERY_BROKEN = 35;//请求完整性校验失败异常
    int CODE_QUERY_PARSE = 36;//请求解析异常
    int CODE_QUERY_LACK = 37;//请求缺少必要参数异常
    //预加载阶段的code说明
    int CODE_PRELOAD_SUCCESS = 100;//预加载成功
    int CODE_PRELOAD_UNDEFINED = 101;//未定义异常
    int CODE_PRELOAD_HANDLE_DEX = 102;//dex加载异常
    int CODE_PRELOAD_NOT_ZIP_FORMAT = 103;//基线dex非zip格式异常
    int CODE_PRELOAD_REMOVE_BASEDEX = 105;//基线dex处理异常
    //加载阶段的code说明 分三部分dex加载, resource加载, lib加载
    //dex加载
    int CODE_LOAD_UNDEFINED = 71;//未定义异常
    int CODE_LOAD_AES_DECRYPT = 72;//aes对称解密异常
    int CODE_LOAD_MFITEM = 73;//补丁SOPHIX.MF文件解析异常
    int CODE_LOAD_COPY_FILE = 74;//补丁拷贝异常
    int CODE_LOAD_SIGNATURE = 75;//补丁签名校验异常
    int CODE_LOAD_SOPHIX_VERSION = 76;//补丁和补丁工具版本不一致异常
    int CODE_LOAD_NOT_ZIP_FORMAT = 77;//补丁zip解析异常
    int CODE_LOAD_DELETE_OPT = 80;//删除无效odex文件异常
    int CODE_LOAD_HANDLE_DEX = 81;//加载dex异常
    // 反射调用异常
    int CODE_LOAD_FIND_CLASS = 82;
    int CODE_LOAD_FIND_CONSTRUCTOR = 83;
    int CODE_LOAD_FIND_METHOD = 84;
    int CODE_LOAD_FIND_FIELD = 85;
    int CODE_LOAD_ILLEGAL_ACCESS = 86;
    //resource加载
    public static final int CODE_LOAD_RES_ADDASSERTPATH = 123;//新增资源补丁包异常
    //lib加载
    int CODE_LOAD_LIB_UNDEFINED = 131;//未定义异常
    int CODE_LOAD_LIB_CPUABIS = 132;//获取primaryCpuAbis异常
    int CODE_LOAD_LIB_JSON = 133;//json格式异常
    int CODE_LOAD_LIB_LOST = 134;//lib库不完整异常
    int CODE_LOAD_LIB_UNZIP = 135;//解压异常
    int CODE_LOAD_LIB_INJECT = 136;//注入异常

七、生成补丁

下载补丁生成工具:https://help.aliyun.com/document_detail/93826.html?spm=a2c4g.11186623.4.4.a49654828syxUy

 

 

https://help.aliyun.com/document_detail/61082.html?spm=a2c4g.11186623.6.561.2b6b5c560xzkid

https://www.jianshu.com/p/19ca976804ce

 

标签: 61082连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台