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謝謝!

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