Android热修复

7
回复
694
查看
[复制链接]

10

主题

51

帖子

659

安币

代码手工艺人

Rank: 4

发表于 2019-4-15 15:37:36 | 显示全部楼层 |阅读模式
相信android开发者多多少少都听说过热修复,这篇文章将详细的讲解阿里的热修复!
app出现bug,需要紧急修复:
正常流程都是,收集报告-开发者紧急修复-打出新的apk包-将新包上传服务器-用户更新apk修复。
热修复的流程,收集报告-开发者紧急生成补丁包-将补丁包上传服务器分发-用户自动更新apk补丁包修复
收费情况:是收费的但是阿里做的很好,貌似达到5W补丁增量才会收费,单手机日活20次收费
特别说明:补丁会在app重启,或者打开的时候生效,不能新加四大组件(测试过增加后不能生成补丁包),没有很详细的测试lib里面或者res里面等等,测试代码中修改代码增加方法等有效
阿里热修复. 网站 https://www.aliyun.com/?utm_content=se_1000094874
步骤和准备:
1 注册账号—这里假设我们注册的账号和密码为 账号:张三;密码qq123456(账号就是中文别有疑问)
注:热修复貌似只能企业级用,必须升级企业级用户
1.1 登录之后先去 产品-移动控制台,ok如果你是第一次进来控制台的话,首先创建一个产品,并且命名,产品是有分类的这里我选择的是测试相关
1.2 点击我们创建的产品,在我们的产品下面创建我们的应用,需要:
1.2.1 应用名称,应用包名
1.2.2 创建完成之后我们可以在应用上下载配置文件,放在项目里面与.gitbnore同级目录
1.2.3 项目里添加依赖 compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.8'
1.2.4 在项目级的build.gralde里面添加
buildscript {
    repositories {
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
        dependencies {
            // 添加emas-services插件
            classpath 'com.aliyun.ams:emas-services:1.0.1'
        }
    }
}
上面部分的代码不添加其中,热修复依然有效,也就是只添加下面的代码即可,
也就是一行
allprojects {
    repositories {
      ****
      ***
//此行
       maven {
            url "http://maven.aliyun.com/nexus/content/repositories/releases"
        }

    }
}

2 回到网页上,点击我们创建好的应用,选择左侧的移动热修复,右侧点击应用信息,可获得信息,下面只是举例
2.1 应用名称应用:我的测试
2.2 AppKey:********
2.3 应用类型:Android
2.4 AppSecret:********************************
2.5 RSA: 查看 //可点击查看
3 依然在这个界面-点击补丁管理-点击添加版本-输入一个版本号
3.1 这个版本号长度不超过36个字符,一般以应用里面的VersionNames为准例如1.0
3.2 可以看到我们创建完版本之后,可以在对应版本上传补丁这里先暂时放着...
说明:这部分是创建补丁的版本号,来针对对应版本发送补丁,控制补丁的分发,此处还未涉及到实际分发补丁
4 Sdk的接入相关
4.1 权限部分 <! -- 网络权限 -->
<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.2 清单文件中的application标签里面 添加下面的部分,三个对应请自行查看应用信息
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
对应上面得到的 AppKey
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
对应上面得到的 AppSecret
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密钥" />
对应上面得到的 RSA密钥
4.3 混淆配置 proguard-rules下添加
#基线包使用,生成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
5 创建一个类SophixStubApplication(名称可以自定义),继承SophixApplication
5.1 里面的代码部分
private final String TAG = "SophixStubApplication";
    // 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
    @Keep
    @SophixEntry(SophixEntry.class)
    static class RealApplicationStub {}
    @Override
    protected 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() {
                    @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, "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();
    }
5.2 上面的代码我们先复制进到我们创建的类里面,SophixEntry 类是我们的实际用的 application,也就是清单文件中的 application 的 name 标签对应的那个继承 application的类,  所以我们修改这个地方,名字为我们实际的application。之后我们在清单文件
5.3 特别注意 SophixStubApplication 类需要放在一个包里面,不能放在根目录,例如(这块也可能是我自己犯得错误,总之大家自行处理)
application name标签下android:name="qwer.SophixStubApplication"——正确
application name标签下android:name="SophixStubApplication"——错误找不到
5.4 返回创建的类里面,可以看到 instance 调用了很多接口,至于作用,请查看下面的网址
https://help.aliyun.com/document_detail/53240.html?spm=a2c4g.11186623.2.19.1f41614dcaveqc#h2-1-3-sdk-3
6 到这里基本都完成了集成的操作,我们可以去创建应用的控制台测试发补丁了
6.1 我们返回之前的控制台,找到移动热修复-补丁管理,刚刚我们添加了一个版本是1.0版本
6.1.1 添加的版本之后才可以发补丁,这样做事因为我们的应用版本只会下载对应版本的补丁。例如我们应用版本是1.0,我控制台添加应用版本是1.0,那么就会下载1.0版本的发布的补丁。假如我们1.0应用有两个bug A和B,我们发了一个1.0的应用补丁修复了bugA,但是后来发现了bugB,那么我们再发的时候,需要发布一个修复bugA和B的补丁

6.2 生成补丁部分,工具和操作网址如下
https://help.aliyun.com/document_detail/93826.html?spm=a2c4g.11186623.6.581.1d5b6399CX6lO4

下载之后,我们打开
6.2.1 旧包是有bug的apk文件
6.2.2 新包是修复bug的apk文件
6.2.3 设置——生成补丁的路径,一些apk的打包秘钥相关


7 按照操作,打好补丁之后我们返回,控制台中心
7.1 上传补丁,点击发布按钮,跳转发布就绪页面
7.2 补丁就绪页面,我们可以先测试补丁是否有效,点击右侧上边的工具下载下载一个
apk工具,安装好
7.3 工具里面
7.3.1 输入包名,(保证有bug的应用安装在手机上)
7.3.2 扫描二维码,网页上鼠标获得焦点,可以用工具扫码
7.3.3 将我们刚才生成的本地补丁.jar包放在手机里面,并且路径我们要知道,根目录的话
就是/storage/emulated/0/****.jar
7.3.4 应用本地补丁(点击这里之前保证我们apk是关闭的,如果是打开的话,那么下次
打开才会应用补丁)
亲测有效,舒服!!!
8 因为测试没有keyStore文件,所以我建了一个新的,大家开发需要自己创建一个测试吧
如果还有疑问请留言,本人测试了两个吐司,一个是"我是有bug的应用",另外一个是“我是修复过的应用”;当我发了补丁之后,重启app就有效果了。
看了看阿里的热修复,应该算是最简单的了,但是阿里保留了不侵入性,所以不能创建新的四大组件,还有就是收费情况,大家使用还请详细查看。




475

主题

1182

帖子

5782

安币

手工艺人

发表于 2019-4-16 09:47:54 | 显示全部楼层
感觉楼主很用心,辛苦啦~

0

主题

9525

帖子

2466

安币

Android大神

Rank: 6Rank: 6

发表于 2019-4-16 09:53:36 | 显示全部楼层
不错不错,楼主辛苦了。。。

8

主题

9359

帖子

3543

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2019-4-16 09:54:46 | 显示全部楼层
不错不错,楼主辛苦了。。。

20

主题

9304

帖子

2333

安币

Android大神

Rank: 6Rank: 6

发表于 2019-4-16 09:59:57 | 显示全部楼层
帮帮顶顶!!

9

主题

9604

帖子

1765

安币

Android大神

Rank: 6Rank: 6

发表于 2019-4-16 10:03:27 | 显示全部楼层
支持楼主,支持安卓巴士!

11

主题

9474

帖子

972

安币

代码手工艺人

Rank: 4

发表于 2019-4-16 10:09:37 | 显示全部楼层
感觉楼主很用心,辛苦啦~

0

主题

16

帖子

38

安币

初级码农

Rank: 1

发表于 2019-6-16 10:52:45 | 显示全部楼层
感觉楼主很用心,辛苦啦~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )