阿里百川HotFix熱更新集成加使用

集成步驟:

  1. 首先創(chuàng)建開發(fā)者賬號(hào),并創(chuàng)建一個(gè)應(yīng)用
  2. Androidstutio集成:
  • 首先還是按照阿里文檔集成,有可能不成功的(文檔上面說了注意: 1.4.0版本的倉庫地址已經(jīng)發(fā)生了變更, 請(qǐng)更新到上述百川最新的倉庫地址),反正我是沒有成功
  • 我的(這是根據(jù)阿里給的dome里面配置的):
    先在project的gradle里面添加:
allprojects {
    repositories {
        jcenter()
        maven {
            //百川倉庫, ut/utdid
            url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
        }
    }
}

然后在module的gradle中添加:
dependencies { compile 'com.taobao.android:alisdk-hotfix:1.4.0' }
在文章的末尾我會(huì)貼出我的gradle代碼

  1. 創(chuàng)建一個(gè)Application
/**
 * Created by Laer on 2016/12/20.
 */
public class Myapplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        HotFixManager.getInstance().setContext(this)
                .setAppVersion("你的版本號(hào)")
                .setAppId("你在開發(fā)者平臺(tái)創(chuàng)建應(yīng)用的appId")
                .setAesKey(null)//如果對(duì)補(bǔ)丁進(jìn)行了Aes加密,這里就要填上,具體見開發(fā)文檔
                .setSupportHotpatch(true)
                .setEnableDebug(true)
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onload(final int mode, final int code, final String info, final int handlePatchVersion) {
                        // 補(bǔ)丁加載回調(diào)通知
                        if (code == PatchStatusCode.CODE_SUCCESS_LOAD) {
                            // TODO: 10/24/16 表明補(bǔ)丁加載成功
                        } else if (code == PatchStatusCode.CODE_ERROR_NEEDRESTART) {
                            // TODO: 10/24/16 表明新補(bǔ)丁生效需要重啟. 業(yè)務(wù)方可自行實(shí)現(xiàn)邏輯, 提示用戶或者強(qiáng)制重啟, 建議: 用戶可以監(jiān)聽進(jìn)入后臺(tái)事件, 然后應(yīng)用自殺
                        } else if (code == PatchStatusCode.CODE_ERROR_INNERENGINEFAIL) {
                            // 內(nèi)部引擎加載異常, 推薦此時(shí)清空本地補(bǔ)丁, 但是不清空本地版本號(hào), 防止失敗補(bǔ)丁重復(fù)加載
                            //HotFixManager.getInstance().cleanPatches(false);
                        } else {
                            // TODO: 10/25/16 其它錯(cuò)誤信息, 查看PatchStatusCode類說明
                        }

                    }
                }).initialize();
    }
}
  1. 添加網(wǎng)絡(luò)權(quán)限
 <!-- 網(wǎng)絡(luò)權(quán)限 -->
    <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" />
    <!-- 外部存儲(chǔ)讀權(quán)限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  1. 在清單文件中添加key
    <meta-data
            android:name="com.taobao.android.hotfix.APPSECRET"
            android:value="你在開發(fā)者平臺(tái)獲取的APPSECRET" />
        <meta-data
            android:name="com.taobao.android.hotfix.RSASECRET"
            android:value="你在開發(fā)者平臺(tái)獲取的RSASECRET" />

獲取這兩個(gè)參數(shù)的鏈接:
http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.9IOxxU&treeId=234&articleId=105459&docType=1#s1

project中的gradle

buildscript {
        repositories {
            jcenter()
        }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
    }
}
allprojects {
    repositories {
        jcenter()
        maven {
            //百川倉庫, ut/utdid
            url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
        }
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

module的gradle

apply plugin: 'com.android.application'
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        applicationId "com.xxx.alihix"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile 'com.android.support:palette-v7:25.0.0'
    compile 'com.taobao.android:alisdk-hotfix:1.4.0'
    compile 'com.android.support:design:25.0.0'
}

至此我們的集成過程就已經(jīng)完成了,下面進(jìn)入調(diào)試使用階段

  1. 首先我們要?jiǎng)?chuàng)建一個(gè)old.apk(也就是有問題的apk)
  • 首先將Myapplication中的.setAppVersion("1.0")//設(shè)置一個(gè)版本號(hào),隨便設(shè)置,后面再上傳補(bǔ)丁的時(shí)候會(huì)將補(bǔ)丁的版本號(hào)改成這個(gè),這兩個(gè)地方的版本哈要一致
  • 接下來我們發(fā)布一個(gè)有問題的apk或是說old.apk,并將這個(gè)old.apk放到一個(gè)單獨(dú)的地方(我的:C:\Users\Laer\Desktop\oldApk\old.apk),以免發(fā)布新版本的時(shí)候覆蓋這個(gè)舊版本(這個(gè)old.apk會(huì)在生成補(bǔ)丁時(shí)用到)
  1. 然后更改想要修改的代碼,直接發(fā)布生成一個(gè)new.apk,同理將這個(gè)新的apk放到一個(gè)特定的位置(我的: C:\Users\Laer\Desktop\newApk\new.apk)
java -jar BCFixPatchTools-1.3.0.jar -c patch -s C:\Users\Laer\Desktop\oldApk\old.apk -f C:\Users\Laer\Desktop\newApk\new.apk -w patch-out

上面是我的最基本的生成補(bǔ)丁的命令,更完善命令或是要看具體含義可以參考文檔2.2 生成 patch:
https://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.mFpm4X&treeId=234&articleId=105841&docType=1

  1. 將舊版的apk安裝到手機(jī)(這只是針對(duì)測(cè)試,實(shí)際不用這樣,用戶手機(jī)里肯定是舊版的)

  2. 將生成的補(bǔ)丁上傳到阿里(步驟:創(chuàng)建補(bǔ)丁新版本號(hào)---->點(diǎn)擊查看詳情----->上傳補(bǔ)丁---->確定發(fā)布),如圖:
    注意這里所填的版本號(hào),就是在生成old.apk時(shí)在Application中填的版本號(hào)

    創(chuàng)建補(bǔ)丁新版本

    查看詳情

    上傳補(bǔ)丁

    查看詳情

    確認(rèn)發(fā)布

  3. 退出當(dāng)前運(yùn)行的old.apk,從新進(jìn)入,這時(shí)程序?qū)?huì)自動(dòng)檢測(cè)是否有補(bǔ)丁,如果有將自動(dòng)加載補(bǔ)丁,正常來說你就可以實(shí)現(xiàn)熱更新后的效果了(有時(shí)候會(huì)程序會(huì)閃退,至于原因可以去看文檔)

  4. 順便提一下文檔中官方提到了一個(gè)調(diào)試工具,具體使用見文檔,使用起來也很簡單,我就不做介紹了
    http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.x4PkBS&treeId=234&articleId=105842&docType=1

到這里整個(gè)生成補(bǔ)丁,調(diào)試都走完了,熱更新肯定也是有問題的,下面介紹一個(gè)我在調(diào)試時(shí)遇到的一個(gè)問題

  • old.apk代碼:
 public void onclick(View view) {
          tv_show.setText("這是熱更新之前的");
//        tv_show.setText("這是熱更新過后的");
    }

我為textview添加了一個(gè)點(diǎn)擊事件,從而根據(jù)顯示的不同文字來區(qū)分是否熱更新成功

  • new.apk代碼:
 public void onclick(View view) {
//        tv_show.setText("這是熱更新之前的");
          tv_show.setText("這是熱更新過后的");
    }
  • 調(diào)試的結(jié)果就是報(bào)異常,狀態(tài)異常,如圖:
異常
  • 然后我改成了這樣:
public void onclick(View view) {
        showMsg();
    }
    private void showMsg() {
//        tv_show.setText("這是熱更新之前的");
          tv_show.setText("這是熱更新過后的");
    }

然后就成功了,我也沒搞懂到底是為啥
再給一個(gè)使用阿里熱更新可能存在的問題的鏈接

https://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.HbfN1I&treeId=234&articleId=105843&docType=1

尊重勞動(dòng)成果,轉(zhuǎn)發(fā)請(qǐng)標(biāo)明原出處,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容