Android studio集成HotFix

直接进入主题,记录一下过程遇到的坑。以后谨记。
首先,接入流程&准备工作看看官方文档。

·注册阿里百川开发者
·创建百川应用
·申请产品权限
·集成SDK
·生成补丁
·发布补丁

集成SDK

就从集成sdk说起,我按照顺序,查看 Android接入说明,我把SDK,Demo,打包工具,调试工具,一个个的都下载到本地。然后,在项目里添加依赖的时候问题来了。

添加依赖

方式一:打开项目找到app的build.gradle文件
添加maven仓库地址,

repositories {
        maven {
            url "http://repo.baichuan-android.taobao.com/content/groups/public/"
        }
}

添加gradle依赖

dependencies {
    compile 'com.alibaba.sdk.android.plugins:alisdk-hotfix:1.2.0'
    compile 'com.alibaba.sdk.android.plugins.jar:alisdk-utdid:0.0.1'
}

这里切记,在这个文件里可能有很多个repositories和dependencies,不要放错了位置,不然会失败。是在根级别,和android是一个级别的。
效果大概是


android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'
    defaultConfig {
        applicationId "com.eqingdan"
        minSdkVersion 14
        targetSdkVersion 22
    }
}
repositories {
        maven {
            url "http://repo.baichuan-android.taobao.com/content/groups/public/"
        }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.alibaba.sdk.android.plugins:alisdk-hotfix:1.2.0'
    compile 'com.alibaba.sdk.android.plugins.jar:alisdk-utdid:0.0.1'
}    

OK,这样可以编译了,但是我的AS编译了半个小时还是没有结果,我试了一些方法,未果。还好有第二种方式,本地依赖。
复制下载SDK文件夹下的.aar和.jar到libs目录下,
在build.gradle文件中添加如下配置:
添加本地libs地址,以便可以找到放置在libs中的aar文件:

repositories {
    flatDir {
        dirs 'libs'
    }
}

添加本地依赖:

dependencies {
    compile(name:'alisdk-hotfix-1.2.0', ext:'aar')
    //如果项目中已经依赖过alisdk-utdid,则不需要再次依赖
    compile files('libs/alisdk-utdid-0.0.1.jar')
}

OK,一切顺利,编译没问题。

特别留意:不管是本地依赖还是远程仓库依赖方式都务必做如下检查! 否则将可能导致补丁加载失败

请检查当前项目结构jniLibs中是否有armeabi-v7a, arm64-v8a目录, 如果有: 请复制下载SDK(SDK下载&版本更新记录里“SDK”项下载下来, 然后解压)文件夹中armeabi-v7a, arm64-v8a目录下对应的so文件到对应的文件夹下面. 如果没有armeabi-v7a, arm64-v8a目录, 则不需要做这个处理。

PS: hotfix这样处理的目的:减少jar包大小进而减少apk大小. 所以alisdk-hotfix-**.aar中只有armeabi下的so文件, 所以如果当前项目目录下有armeabi-v7a, arm64-v8a目录, 但是没有复制对应的so文件进去, 那么在相应cpu架构的机型下加载补丁就会报找不到so文件的异常。

接下来,就比较容易了,

配置AndroidManifest文件

在application节点下添加如下配置:

<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="your-app-secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="your-rsa-secret" />
<! -- 网络权限 -->
<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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

HotFix初始化

在Application的onCreate()中进行HotFix的初始化。

HotFixManager.getInstance().initialize(application,appVersion,appId, newPatchListener);

参数说明:

application: Application上下文context
appVersion: 应用的版本号
appId: 百川上应用的唯一标识。
newPatchListener: 新patch的回调接口,若不执行任何动作,可为null
NewPatchListener:如果客户端已经有一个patch包在运行,则下一个patch不会立即生效,需要重启应用生效。所以此时需要进行处理,比如提醒用户重启应用或者开发者进行后台手动杀进程重启等操作。

使用方法:

NewPatchListener mNewPatchListener = new NewPatchListener() {
        @Override
        public void handlePatch(int patchVersion) {
            // TODO do something
            Toast.makeText(MainApplication.this, "请重启应用更新补丁", Toast.LENGTH_SHORT).show();
        }
    };

请求patch

请求最新的patch,需要在初始化以后调用。

HotFixManager.getInstance().queryNewHotPatch();

Application中代码如下:
这里写图片描述

混淆配置

应用进行混淆打包时,应加入如下HotFix的混淆配置:

#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 class com.ta.utdid2.device.**{*;}
-keep class com.taobao.hotfix.HotFixManager{
    public *;
}

生成patch补丁

这里就不copy官方的文档了,只是记录一下我跳进去的坑。
查看java的版本不用切换路径可以查看,但是你要查看最新的使用说明,必须要切换到文件所在的目录下。你的打包工具下载的位置(文件:alisdk-hotfix-android-pack-tools-1.0.3.jar)。
查看帮助说明

java -jar alisdk-hotfix-android-pack-tools-1.0.3.jar help

生成PATCH

java -jar alisdk-hotfix-android-pack-tools-1.0.3.jar patch srcAPK fixedAPK workingPatch signInfoFilePath

参数说明:

srcAPK:填写本地的原始APK(有问题的APK)的本地路径,如果文件找不到会报错
fixedAPK:已经修复过该问题的APK
workingPatch:输出patch的绝对路径,该目录是工作路径不要和apk和任何文件设置为同一个目录
signInfoFilePath:本地的签名配置属性文件,不输入或者不正确则不做签名,使用绝对路径
signInfo签名配置文件说明:
本工具的签名使用需要先写一个签名配置文件,格式如下:

请在任意路径下放置: xxxxxx.keyinfo,该文件格式是属性文件:
(我是在项目的根目录下新建一个File,sign.keyinfo)

store.file=/绝对路径/* * *.jks
store.password=* * *
key.alias=* * *
key.password=* * *

注意:store.file=绝对路径,如果更换路径需要手动更改。还有就是,如果使用Windows平台,store.file路径需要写双反斜杠(例:E:\work\patch\key.store)

···
[Baichuan Log]:Start to sign patch.
[Baichuan Log]:Sign Error: KeyStore was not found. Skip java-sign step.
···

如果一切顺利,现在运行命令就可以得到patch了。

java -jar alisdk-hotfix-android-pack-tools-1.0.3.jar patch /srcAPK绝对路径/src.apk /fixedAPK绝对路径/fixed.apk /输出patch的绝对路径/ /绝对路径/sign.keyinfo

最后打印出日志如下,表示成功了。

·······
[Baichuan Log]:Unsigned patch file is: /{输出patch的绝对路径}/baichuan-hotfix-patch.jar
[Baichuan Log]:Start to sign patch.
[Baichuan Log]:KEYSTORE PATH:/{..}/{***}.jks
[Baichuan Log]:Patch file is: /{输出patch的绝对路径}/baichuan-hotfix-patch.jar
[Baichuan Log]:Finish build Alibaba Baichuan HotFix Patch.

接下来就是调试的部分了。

大功告成,欢迎指正批评!O(∩_∩)O谢谢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章