Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Gradle項目Andfix熱修復技術的接入指南

Android Gradle項目Andfix熱修復技術的接入指南

編輯:關於Android編程

前言

很多團隊都有接入Android Andfix的剛性需求,但是早些版本的Andfix接入成本略高。如只支持maven工程、定制的打包插件有很多額外限制、摩天輪打包不支持普通(非bundle)App等。不過現在天空飄來五個字「這都不事兒」,這些問題都已得到很好的解決,摩天輪團隊已經提供了Andfix Gradle插件,並支持了普通(非bundle)App Andfixx打包流程。目前淘寶彩票和update4mtl項目已經接入Andfix Gradle並驗證成功,下面我會介紹一下Andfix Gradle接入的流程。

Andfix接入基本概念

基線包:需要要被修復的app版本,同MTL的基准的容器版本。(本示例中基線包版本是1.0.7.6)

Patch包:補丁包,即基線包與增加修復代碼後版本的差量文件,MTL生成的形式如下
 

Andfix Gradle接入主要步驟

Andfix Gradle接入主要有兩部分:

  • 基線包構建發布:集成andfix sdk,並在MTL上打包發布。如果不在MTL打包發布,是無法創建andfix集成單的(MTL只針對已發布成功的App版本提供Andfix打包功能)。
  • Patch包構建發布:主要是使用gradle插件基於基線包在MTL構建出patch文件並發布。

一圖勝千言,我們看一下Andfix接入的主要步驟有哪些:

_2016_07_06_9_35_02

 

Andfix接入實例演示

基線包構建發布

第一部分 SDK接入

1.1 修改build.gradle

增加以下依賴:

  dependencies {
        compile 'com.taobao.android:securityguardsdk:6.1.33@aar'
        compile 'com.taobao.android:securitybody:6.1.15@aar'
        compile 'com.taobao.android:nocaptcha:6.1.13@aar'
        compile 'com.taobao.android:misc:6.1.17@aar'
        compile 'com.taobao.android:uatrace:6.1.13@aar'
        compile 'com.taobao.android:compatible:6.1.13@aar'
        compile('com.taobao.android:downloader:1.1.1') {
            exclude group: 'com.android.support', module: 'support-v4'
            exclude group: 'com.google.android', module: 'android'
        }
        compile('com.alibaba.mtl:app-monitor-sdk:2.3.8') {
            exclude group: 'com.alibaba', module: 'fastjson'
        }
        compile('com.taobao.android:mtopsdk_allinone:1.5.6.11') {
            exclude module: 'tnet-jni', group: 'com.taobao.android'
            exclude module: 'utdid4all', group: 'com.taobao.android'
            exclude module: 'umid', group: 'com.taobao.android'
            exclude module: 'securityguard', group: 'com.taobao.android'
            exclude module: 'app-monitor-sdk', group: 'com.alibaba.mtl'
        }
        compile('com.taobao.android:hotpatch:3.2.0@aar') {
            transitive = true
            exclude group: 'com.taobao.android', module: 'downloader'
            exclude group: 'com.taobao.android', module: 'usertrack'
            exclude group: 'com.taobao.android', module: 'mtopsdk_allinone'
        }
    }

注意踩坑地方:

  • 無線保镖以及相關的依賴庫必須高於實例中的版本,接入中發現它舊版版本相關依賴庫(jar類型文件)在構建patch文件時會因為unzip(無法解壓)異常導致構建失敗。
  • 「com.taobao.android:hotpatch」版本需要選擇3.2.0,因為目前最新3.2.3在構建patch文件時會報PatchException異常導致構建失敗,後續版本應該會修復此問題。


1.2 接入代碼

注:目前只接入了pull的方式


1.2.1 初始化

初始化調用的接口與之前稍有不同,傳入的參數要多一個ttid,這是由於mtop升級要求,具體在HotPatchManager類中提供了初始化接口如下所示:

    private void initHotpatch() {
            String ttid = getResources().getString(R.string.ttid);//app渠道號
            // @param app the application context.
            // @param mainVersion 客戶端的主版本號
            // @param ttid 渠道號
            // @param contentMap 傳遞給patch的內容,通常為null
            // @return the current HotPatchManger instance.
            HotPatchManager.getInstance().appendInit(this, Utils.getClientVersion(this), ttid, null);
    }



1.2.2 加載patch

該方法建議在盡可能早(安全保镖初始化之後)的時候調用,會自動去加載對應的patch

    private void startHotPatch() {
        HotPatchManager.getInstance().startHotPatch();
    }  



1.2.3 請求Hotpatch

根據業務需求選擇拉取andfix patch文件的時機。

    //這裡的參數update4mtl是當前app在MTL定義的group字段
    HotPatchManager.getInstance().queryNewHotPatch("update4mtl");

 

第二部分 打包發布

Patch包構建發布

第一部分 工程構建

1 提交基線包到倉庫


1.1通過三方庫發布申請

_2016_07_06_7_49_37

三方庫發布申請地址

https://aone.alibaba-inc.com/aone2/library/upload?spm=0.0.0.0.SoII74



1.2 到倉庫查看基線包是否上傳成功

_2016_07_06_7_50_10

nexus倉庫地址

http://repo.alibaba-inc.com/nexus/index.html


2 代碼修復

fix bug(略)


AndFix目前不支持的case:

  • 暫時不支持新增方法、新增類
  • 不支持新增Field,包括**string.xml中新增的字符串**
  • 不支持針對同一個方法的多次patch,如果客戶端已經有一個patch包在運行,則下一個patch不會立即生效。
  • 三星note3、S4、S5的5.0設備、雲OS設備以及X86設備不支持
  • 父類、子類的classloader不同時,不能修改父類中被子類調用的方法。例如BaseActivity與MainActivity之間的關系,其中BaseActivity定義了test1方法,並且這個方法被MainActivity使用,由於BaseActivity正主dex裡邊,MainActivity在bundle裡邊,他們的classloader不一致,那麼BaseActivity中的test1方法就不可以被patch
  • 被patch的方法不能被不同classloader加載的類直接調用,例如主dex的一個方法被patch,該方法被其他bundle中的類直接調用,會出現VerrifyError(切記,同上一條)
  • 參數包括:long、double、float的方法不能被patch
  • 被反射調用的方法不能被patch
  • 使用Annotation的類不能patch
  • 參數超過8的方法不能被patch
  • 構造方法不能被patch
  • 泛型參數的方法如果patch存在兼容性問題
  • 在打包的時候偶爾會存在兩次打包內部類的名字不一致問題,這種情況會導致打AndFix打包失敗,暫時無解

注:不支持的case新版有可能已經支持,請參閱海納最新文檔Hotpatch SDK接入
 

3 修改混淆文件

keep class com.taobao.hotpatch.patch.IPatch{*;} 
-keep class com.taobao.hotpatch.patch.PatchParam{*;} 
-keep class com.taobao.hotpatch.patch.PatchMain{*;} 
-keep class com.taobao.hotpatch.patch.PatchResult{*;} 
-keep class com.taobao.hotpatch.util.HotPatchUtils{*;} 
-keep class com.com.taobao.updatecenter.query.MudpUpdateRequest{*;}

-keep class * extends java.lang.annotation.Annotation 
-keepclasseswithmembernames class * {

native ;
}



4 Gradle增加andfix插件


4.1 build.gradle引入andfix插件

apply plugin: 'com.taobao.android.andfix'



4.2 build.gradle增加andfix-plugin依賴

    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.taobao.android.gradle:andfix-plugin:1.0.3'
    }

4.2 build.gradle增加andfix描述

andfix {

    patch { //表示這個配置對應buildType:debug,只對debug的類型生效
        createAPatch true
        baseDependency 'com.alibaba.android:android-update4mtl-demo:1.0.7.6@apk' //通過maven坐標得到基准包,可以為ap,apk
        filterPath file("filterClass.txt")  //設置不做對比的白名單
        preProcessManifest true    //是否對manifest做預處理,解決merge tools配置不生效的問題
        signOnline false  //如果要使用mtl的在線簽名工程,設置在線簽名
        signAppName 'android-update4mtl-demo'
    }
}



注意踩坑點:

  • 其中baseDependency需要對應之前上傳到倉庫的基准包maven坐標,構建patch包要及時更新該字段
  • filterClass.txt用來配置不做對比的class,對於非bundle的app來說一般只需配置**com.xxx.BuildConfig**,本樣例為「com.alibaba.android.demo.updatemtl.BuildConfig」即報名+BuildConfig

注:本樣例沒有使用在線簽名功能,需要的可以自己試試
 

5 接口權限申請
 

如果沒有申請接口權限會報{"api":"mtop.client.mudp.update","v":"1.0","ret":["FAIL_SYS_API_UNAUTHORIZED::請求API未授權"]異常,所以需要聯系mtop同學申請該接口權限。

注:申請權限需要提供線上環境app key,可以旺旺聯系「mtop問題解答」

 

第二部分 MTL構建發布

1 產品配置

1.1 產品配置中需要勾選

  • 是否支持andfix獨立發布(必選)
  • 是否為普通app(必選)
  • ANDFIX自主發布審核(可選)

_2016_07_06_8_36_47
 

1.2 增加andfix發布模板(andfix基准模板同)

1.2.1 創建
_2016_07_06_9_38_39

1.2.2 編輯
_2016_07_06_9_40_12



2 創建andfix發布區


2.1 當基線包發布成功後,在「更新推送」頁面點擊「創建Andfix發布區」,創建andfix發布單

_2016_07_06_9_43_39



2.2 新建發布需求


在創建好的Andfix發布區點擊「新建發布需求」創建項目

_2016_07_06_8_42_24



3 打包發布


3.1 打包(編譯構建)


打包時會默認使用產品配置中配置好的andfix發布模板,用戶可以根據自己需要再「編譯構建」tab裡「編輯配置」開始打包。

_2016_07_06_9_52_25



3.2 測試通過

掃描二維碼驗證的aptatch.jar,如果通過可以點擊「測試通過」



3.3 審核(可選)

如果產品配置中勾選了「ANDFIX自主發布審核」,需要審核人員審批,發起審核後,審核人員會收到郵件和旺旺通知。

如果審核通過,則進入下一步「發布」



3.4 發布

點擊「發布」,開始配置發布信息

_2016_07_06_9_45_31

「確認發布」後patch發布完成
_2016_07_06_8_51_01

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved