【笔记】阿里非侵入式热修复方案Sophix

上周看到一篇关于阿里公测的热修复Sophix的文章——阿里推出业界首个非侵入式热修复方案Sophix,颠覆移动端传统发版更新流程!


文章中有一张关于Sophix、Tinker、Amigo的对比图片,之前使用Tinker感觉也还可以,但既然Sophix说更好,那就当然要尝试下了,而且Tinker不能修复加固的APK还是有点不足的,但惊喜的是Sophix貌似可以修复加固的APK。


简单使用

Sophix的使用就像图上说的那样,真正的傻瓜式接入。

1、创建项目

控制台创建应用(https://help.aliyun.com/document_detail/53238.html
本地创建Android项目

2、添加配置

android studio集成方式

maven仓库

allprojects {
    repositories {
        jcenter()
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
}
gradle依赖
    compile('com.aliyun.ams:alicloud-android-hotfix:3.0.2') {
        exclude(module: 'alicloud-android-utdid')
    }

3、设置AndroidManifest

权限

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

application节点(value中的值分别改为通过平台HotFix服务申请得到的App Secret和RSA密钥)

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

混淆文件

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

4、使用

SDK初始化

    private void initSophix() {
        SophixManager.getInstance().setContext(this)
                .setAppVersion(BuildConfig.VERSION_NAME)
                //如果这里设置了AES,在生成热修复包的时候也需要配置
                .setAesKey("1234567890123456")
                .setEnableDebug(true)
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        // 补丁加载回调通知
                        Log.i(TAG, String.format("mode=%d,code=%d,info=%s,handlePatchVersion=%d", mode, code, info, 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, "其它错误信息");
                        }
                    }
                }).initialize();
    }
最简单的使用已经完成,详情可查看 快速接入


补丁生成

1、日志(小坑)


如果你装的Java JDK是1.8可能出现这个错误信息,只需要删除C:\Windows\System32和C:\Windows\SysWOW64下的java*.exe

2、设置


3、高级设置(根据个人需求)


4、傻瓜式使用(点击Go!生成)


补丁工具使用说明


调试工具

开发中总是需要调试,Sophix也提供了补丁的调试,不需要发布直接可以测试补丁的使用。


调试工具使用


注:在调试过程中发现Sophix可以在360加固的APK中使用,不过需要注意的是这时候去生成补丁需要使用未加固的APK,否则虽然也能生成APK,但使用的时候只能修复class类,其他so库、资源文件等都无法修复,这应该是Sophix只进行了类加载方案。


资料

文档

https://help.aliyun.com/document_detail/51415.html

github

https://github.com/aliyun/alicloud-android-demo/tree/master/hotfix_android_demo


源码Demo

实例

猜你喜欢

转载自blog.csdn.net/q1113225201/article/details/73477676