1.先注册阿里云账号:

https://www.aliyun.com/?spm=5176.12825654.amxosvpfn.2.78342c4arjFnlZ

2.新建应用:

打开控制台 --> 移动研发平台EMAS --> 新建产品 --> 添加应用

3.下载应用的Android配置备用(不用将json文件复制到AS工程)

(标红框的一会配置会用到)

4. AS 开始集成(推荐稳健集成,点击跳转阿里官方文档,标题4的部分 代码文档都有)

(https://help.aliyun.com/document_detail/61082.html?spm=5176.13347446.0.0.4a8657c7BcEwMQ)

(1)gradle远程仓库依赖, 打开项目找到app的build.gradle文件,添加如下配置:

添加maven仓库地址:

repositories {maven {url "http://maven.aliyun.com/nexus/content/repositories/releases"}
}

(2)添加gradle坐标版本依赖:

compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.14'

(3)权限说明:

<! -- 网络权限 -->
<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.READ_EXTERNAL_STORAGE"/>

(4)配置AndroidManifest文件

在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密钥" />

引用的下载的Android配置文件( aliyun-emas-services.json ),3标题图片标红参数

  • App ID: hotfix.idSecret
  • App Secret:emas.appSecret
  • RSA密钥: hotfix.rsaSecre

(5)混淆配置

#基线包使用,生成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.**{*;}
-dontwarn com.alibaba.sdk.android.utils.**
#防止inline
-dontoptimize

(6)创建 SophixStubApplication :

package com.my.pkg;
import android.app.Application;
import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
import com.my.pkg.MyRealApplication;
/*** Sophix入口类,专门用于初始化Sophix,不应包含任何业务逻辑。* 此类必须继承自SophixApplication,onCreate方法不需要实现。* 此类不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。* AndroidManifest中设置application为此类,而SophixEntry中设为原先Application类。* 注意原先Application里不需要再重复初始化Sophix,并且需要避免混淆原先Application类。* 如有其它自定义改造,请咨询官方后妥善处理。*/
public class SophixStubApplication extends SophixApplication {private final String TAG = "SophixStubApplication";// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。@Keep@SophixEntry(MyRealApplication.class)static class RealApplicationStub {}@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);
//         如果需要使用MultiDex,需要在此处调用。
//         MultiDex.install(this);initSophix();}private void initSophix() {String appVersion = "0.0.0";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() {@Overridepublic void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {if (code == PatchStatus.CODE_LOAD_SUCCESS) {Log.i(TAG, "sophix load patch success!");} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {// 如果需要在后台重启,建议此处用SharePreference保存状态。Log.i(TAG, "sophix preload patch success. restart app to make effect.");}}}).initialize();}
}

这其中,关键一点是:

    @Keep@SophixEntry(MyRealApplication.class)static class RealApplicationStub {}

SophixEntry应指定项目中原先真正的Application(原项目里application的android::name指定的),这里用MyRealApplication指代。并且保证RealApplicationStub类名不被混淆。而SophixStubApplication的类名和包名可以自行取名。

这里的Keep是android.support包中的类,目的是为了防止这个内部静态类的类名被混淆,因为sophix内部会反射获取这个类的SophixEntry。如果项目中没有依赖android.support的话,就需要在progurad里面手动指定RealApplicationStub不被混淆,详见下文。

然后,在proguard文件里面需要加上下面内容:

-keepclassmembers class com.my.pkg.MyRealApplication {public <init>();
}
# 如果不使用android.support.annotation.Keep则需加上此行
# -keep class com.my.pkg.SophixStubApplication$RealApplicationStub

目的是防止真正Application的构造方法被proguard混淆。

然后需要把AndroidManifest里面的application改为这个新增的SophixStubApplication类:

    <applicationandroid:name="com.my.pkg.SophixStubApplication"... ...>... ...

最后,别忘了在MyRealApplication 中的 onCreate() 方法中加入:

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

总结:

1.把此SophixStubApplication入口类添加进项目中,所有Sophix相关初始化放在此类中。并且不应包含开发者的任何业务逻辑代码。
2. 若使用了MultiDex,也应在SophixStubApplication的initSophix之前添加,并且需要记得在原来的Application里面去除MultiDex,避免重复调用导致问题。
3.把RealApplicationStub的SophixEntry注解的内容改为自己原先真正的MyRealApplication类。 混淆文件中确保某些内容不被混淆。
4.AndroidManifest里面的application改为新增的SophixStubApplication入口类。

5.生成补丁

(1)选择新包旧包,可在设置内控制输出路径和签名

(2)去阿里云后台上传补丁

Android集成阿里热修复(Hotfix)相关推荐

  1. 阿里热修复之Sophix——公有云发布版集成步骤

    Sophix 公有云接入 去年的时候写的一篇阿里云热修复的文章,那时它还是在公测阶段,一直没能投产,而今,公司项目需要集成已经投产的阿里Sophix功能,所以再次集成了一遍,记录下了步骤和遇到的一些问 ...

  2. 【直播预告】云栖直播:阿里热修复产品HotFix2.0升级详解

    全面--你知道吗?1891年,卡尔森纳做出的第一把瑞士×××,只有螺丝刀和开罐器.经过一代又一代能工巧匠的打磨,这把刀陆续增加了锯子.剪刀.镊子.放大镜.改锥,甚至内藏激光.LED手电筒.USB记忆碟 ...

  3. Android热补丁动态修复实践

    前言 好几个月之前关于Android App热补丁修复火了一把,源于QQ空间团队的一篇文章安卓App热补丁动态修复技术介绍,然后各大厂的开源项目都出来了,本文的实践基于HotFix,也就是QQ空间技术 ...

  4. Android热补丁动态修复技术

    Android热补丁动态修复技术(一):从Dex分包原理到热补丁 一.参考 博文:安卓App热补丁动态修复技术介绍--by QQ空间终端开发团队  博文:Android dex分包方案--by 猫的午 ...

  5. 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  6. 使用Android Studio搭建Android集成开发环境

    一.Android Studio简单介绍 2013年GoogleI/O大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA开发环境,旨 ...

  7. 使用Android Studio搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. Android集成三方浏览器之Crosswalk

    上一篇讲解了腾讯 X5 内核的集成,这一篇是讲解 Crosswalk 的集成 Crosswalk 也是采用了Chromenium 内核,是一款开源的 web 引擎,开发者可以直接把 Crosswalk ...

  9. 介绍自己的一个Android插桩热修复框架项目QuickPatch

    QuickPatch项目地址: https://gitee.com/egg90/QuickPatch 和 https://github.com/eggfly/QuickPatch 同步更新 类似于美团 ...

  10. Android 热补丁动态修复框架小结

    Android 热补丁动态修复框架小结 转载于:https://www.cnblogs.com/zhujiabin/p/7923233.html

最新文章

  1. 聚合复合_【专家视觉】聚合物接枝多壁碳纳米管及其聚氨酯复合材料
  2. 虚方法(virtual)和抽象方法(abstract)的区别
  3. 干货 | 仅需10分钟,开启你的机器学习之路!
  4. VS中添加第三方库及相对路径设置
  5. ca证书 csr_linux下使用openssl生成 csr crt CA证书
  6. Hibernate中的fetch
  7. 从0开始学习自动化测试框架cypress(五)总结
  8. 微型计算机测试题答案,微机原理试题及答案(考试必备)
  9. android模拟器串口,android模拟器上模拟串口通信
  10. 计算机cad运行缓慢怎样处理,旧电脑如何提高CAD运行速度
  11. C#开源组件之Word文件的操作:一
  12. 解决github下载慢的问题!
  13. unity实现绳子效果(绳索插件Obi Rope)
  14. “阳”后第1 2 3 4 5 6 7天的症状详解
  15. 爬虫入门教程-Spider
  16. 2019年最新WHQL认证申请流程
  17. NJ 时钟自动调整功能(SNTP)
  18. 前端框架综述(8)前端
  19. 1024程序员节,我被喷上了热搜!
  20. 打字速度对编程的影响大吗?

热门文章

  1. 1123 铲雪车(欧拉回路)
  2. 图示-实现hive的文件与hdfs的导入导出
  3. 学画画软件app推荐_绘画APP推荐|很全的学画画的APP推荐
  4. python爬取百度街景图像
  5. 张锋因何错过诺贝尔化学奖?
  6. 药物不良反应数据库信息的下载
  7. Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)-单调栈+dp
  8. 中国需要怎样的智慧城市联盟?中外41家联盟组织大起底
  9. 旋转木马图片效果图,轮播图
  10. CTFshou wed文件上传