Android热修复之HotFix初探
来源:互联网 发布:美国本周经济数据 编辑:程序博客网 时间:2024/05/20 05:59
开发Android时会遇到突发情况,或者人为失误出现bug,这是只能增加一个版本修复bug.但是,频繁增加版本易引起用户反感,所以热修复技术是有必要的。hotfix是阿里百川推出的解决线上修复bug的技术
官方地址:https://hotfix.taobao.com/hotfix
那么,怎么使用呢?
首先,登录官方账号注册开发者。开始创建应用,建一个Android版,并开通hotfix后台(官方网上都有介绍),此时能获取appid 、RSA密钥 、App Secret,并下载Android sdk、 demo以及调试工具。
下载地址:http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.0hAQHX&treeId=234&articleId=105517&docType=1
怎么使用呢?
Androidstudio上新建Android项目
AndroidManifest.xml中
01.权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
02 添加hotfix配置
<meta-data android:name="com.taobao.android.hotfix.APPKEY" android:value="你的APPKEY" /> <meta-data android:name="com.taobao.android.hotfix.APPSECRET" android:value="你的APPSECRET" /> <meta-data android:name="com.taobao.android.hotfix.RSASECRET" android:value="你的RSASECRET"
appkey 获取在应用管理中
APPSECRET 和RSASECRET 在具体的Android 应用中
03 在根目录 app ->main->新建jniLabs文件夹并把sdk中的arm64-v8a和armeabi-v7a这两个库文件夹放到里面。
04 Module:app中
android {//添加代码 signingConfigs { release { storeFile file("demo.jks") storePassword "test123" keyAlias "test123" keyPassword "test123" } debug { storeFile file("demo.jks") storePassword "test123" keyAlias "test123" keyPassword "test123" } } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { signingConfig signingConfigs.debug } } }dependencies {//添加代码 compile 'com.taobao.android:alisdk-hotfix:1.4.0'}
05 Project:你的项目名中
//添加代码
allprojects { repositories { mavenLocal() maven { //百川仓库, ut/utdid url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories" } mavenCentral() jcenter() flatDir { dirs 'libs' } }}
06 app文件夹下放打包store 本例demo.jks
07 刷新工程项目 点击sync 导入
08 创建application 并声明一下
public class MApplication extends Application { public static String appVersion; public static String appId; @Override public void onCreate() { super.onCreate(); initApp(); initHotfix(); //有时候app报错执行太快 不行修复来不及需要延长一下 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } private void initApp() { this.appId = "89588-1"; //TODO 替换掉自己应用的appId 还需要替换manifests中的APPKEY、APPSECRET和RSASECRET try { this.appVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName; } catch (Exception e) { this.appVersion = "1.0"; } } private void initHotfix() { //此处不再需要调用queryNewHotPatch方法, initialize方法内部会调用queryNewHotPatch方法. HotFixManager.getInstance().setContext(this) .setAppVersion(MApplication.appVersion) .setAppId(MApplication.appId) .setAesKey(null) .setSupportHotpatch(true) .setEnableDebug(true) .setPatchLoadStatusStub(new PatchLoadStatusListener() { @Override public void onload(final int mode, final int code, final String info, final int handlePatchVersion) { // 补丁加载回调通知 if (code == PatchStatusCode.CODE_SUCCESS_LOAD) { Log.e("LLLL","表明补丁加载成功"); // TODO: 10/24/16 表明补丁加载成功 } else if (code == PatchStatusCode.CODE_ERROR_NEEDRESTART) { Log.e("LLLL","表明新补丁生效需要重启. 业务方可自行实现逻辑, 提示用户或者强制重启, 建议: 用户可以监听进入后台事件, 然后应用自杀"); // TODO: 10/24/16 表明新补丁生效需要重启. 业务方可自行实现逻辑, 提示用户或者强制重启, 建议: 用户可以监听进入后台事件, 然后应用自杀 } else if (code == PatchStatusCode.CODE_ERROR_INNERENGINEFAIL) { Log.e("LLLL","内部引擎加载异常, 推荐此时清空本地补丁, 但是不清空本地版本号, 防止失败补丁重复加载"); // 内部引擎加载异常, 推荐此时清空本地补丁, 但是不清空本地版本号, 防止失败补丁重复加载 HotFixManager.getInstance().cleanPatches(false); } else { Log.e("LLLL","其它错误信息, 查看PatchStatusCode类说明"); // TODO: 10/25/16 其它错误信息, 查看PatchStatusCode类说明 } } }).initialize(); }}
09 在MainActivity中制造错误,例如显示颜色
tv.setTextColor(Color.parseColor(“##ff00ff”));
此时运行一下是会崩溃的
10 混淆添加
-applymapping mapping.txt#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 public class com.alibaba.mtl.log.model.LogField {public *;}-keep class com.ta.utdid2.device.**{*;}-keep class com.taobao.hotfix.HotFixManager{ public *;}
11 打包一下 修改文件名old.apk
12 修改错误代码为
try { tv.setTextColor(Color.parseColor("##ff00ff")); } catch (Exception e) { tv.setTextColor(Color.parseColor("#ff00ff")); }
再次打包 修改文件名为new.apk
13 在项目下或者别的地方建一个文件夹 例如百川热修复打包工具包
在下面放 没有的从demo中获取即可
其中 patch_out是一个存放生成修复jar的空文件夹
dopatch.sh 代码为
#!/usr/bin/env bashjava -jar BCFixPatchTools-1.3.0.jar -cmd patch -src_apk old.apk -fixed_apk new.apk -wp patch_out -sign_file_url demo.jks -sign_file_pass test123 -sign_alias test123 -sign_alias_pass test123 -filter_class_file classFilter.txtadb push patch_out/hotfix-working/baichuan-hotfix-patch.jar /sdcard/Download
14 打热修复包
终端中找到百川热修复打包工具包目录(cd命令)
运行 ./dopatch.sh
14 运行 adb install 你的old.apk路径,安装旧的,此时会报错
15 在hotfix后台上传你的jar(在patch_out中)并使用发布使用,此时你原来打开报错的app现在正常了,管理后台也显示推送补丁包成功。
最后附上demo:http://download.csdn.net/detail/lchannel/9748975
如有问题,随时联系我,谢谢。
- Android热修复之HotFix初探
- Android热修复之Hotfix接入流程
- Android热修复学习(HotFix)
- android热修复技术 HotFix
- Android打补丁 热修复(HotFix)小结
- Android热修复框架HotFix分析拓展
- Android热修复原理(HotFix)初涉
- Android:热修复(阿里hotfix使用)
- android热修复-阿里Hotfix最新版(Sophix)
- Android热修复之Tinker使用初探
- Android热修复之Sophix初探
- Hotfix热修复混淆
- iOS HotFix热修复
- HotFix热修复示例
- Android热修复学习之旅——HotFix完全解析
- Android热修复学习之旅——HotFix完全解析
- 5大Android hotfix 线上热修复框架比较
- Android 热修复 HotFix 混淆apk生成patch包方案
- Java命名规则
- 失物招领-2数据库
- Java synchronized 可重入锁 基本概念
- OCI 调用Oracle 存储过程实现
- webrtcvad python——语音端点检测
- Android热修复之HotFix初探
- Java的那些坑(一)
- Python中链接MySql数据库的配置
- Yii2 验证错误信息改为全局中文
- ssm通用mapper配置详解
- RPC 基本原理与 Apach Thrift 初体验
- Http 的post请求的工具类
- 187. Repeated DNA Sequences
- Dolby