集成阿里熱修復(fù)采坑

  1. 在阿里云管理控制臺創(chuàng)建你的應(yīng)用默伍,得到
    AppKey、AppSecret、RSA
  2. 在你的Androidmanifest.xml文件中添加如下代碼
 <meta-data
            android:name="com.taobao.android.hotfix.IDSECRET"
            android:value="你的AppKey" />
        <meta-data
            android:name="com.taobao.android.hotfix.APPSECRET"
            android:value="你的AppSecret" />
        <meta-data
            android:name="com.taobao.android.hotfix.RSASECRET"
            android:value="你的RSA" />

其中RSA建議在下圖為止復(fù)制


image.png
  1. 根據(jù)阿里給出的文檔接入(建議直接采用穩(wěn)健接入方式)
    https://help.aliyun.com/document_detail/53240.html?spm=a2c4g.11174283.6.546.ydTSCV
    (1)在你的工程級別的gradle下焙矛,添加maven倉庫
repositories {
   maven {
       url "http://maven.aliyun.com/nexus/content/repositories/releases"
   }
}

(2)在你的主工程下的gradle中添加依賴

compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.4'

如果你的gradle依賴有問題,那么就去下載本地SDK残腌,然后在項目中添加進去薄扁,下載地址
https://mhub.console.aliyun.com/?spm=a2c4g.11186623.2.3.OOmSwv#/download

image.png

(3)在AndroidManifest.xml中添加如下權(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" />
<! -- 外部存儲讀權(quán)限,調(diào)試工具加載本地補丁需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//備注READ_EXTERNAL_STORAGE權(quán)限屬于Dangerous Permissions废累,僅調(diào)試工具獲取外部補丁需要,不影響線上發(fā)布的補丁加載脱盲,調(diào)試時請自行做好android6.0以上的運行時權(quán)限獲取邑滨。

(4)添加混淆

#基線包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/build/outputs/mapping/release路徑下钱反,移動到/app路徑下
#修復(fù)后的項目使用掖看,保證混淆結(jié)果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize

(5)復(fù)制這個類

package com.my.pkg;
import android.app.Application;
import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
import com.my.pkg.MyRealApplication;
/**
 * Sophix入口類匣距,專門用于初始化Sophix,不應(yīng)包含任何業(yè)務(wù)邏輯哎壳。
 * 此類必須繼承自SophixApplication毅待,onCreate方法不需要實現(xiàn)。
 * 此類不應(yīng)與項目中的其他類有任何互相調(diào)用的邏輯归榕,必須完全做到隔離尸红。
 * AndroidManifest中設(shè)置application為此類,而SophixEntry中設(shè)為原先Application類刹泄。
 * 注意原先Application里不需要再重復(fù)初始化Sophix外里,并且需要避免混淆原先Application類。
 * 如有其它自定義改造特石,請咨詢官方后妥善處理盅蝗。
 */
public class SophixStubApplication extends SophixApplication {
    private final String TAG = "SophixStubApplication";
    // 此處SophixEntry應(yīng)指定真正的Application,并且保證RealApplicationStub類名不被混淆姆蘸。
    @Keep
    @SophixEntry(MyRealApplication.class)
    static class RealApplicationStub {}
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
//         如果需要使用MultiDex墩莫,需要在此處調(diào)用。
//         MultiDex.install(this);
        initSophix();
    }
    private void initSophix() {
        String appVersion = "0.0.0";
        try {
            appVersion = this.getPackageManager()
                             .getPackageInfo(this.getPackageName(), 0)
                             .versionName;
        } catch (Exception e) {
        }
        final SophixManager instance = SophixManager.getInstance();
        instance.setContext(this)
                .setAppVersion(appVersion)
                .setSecretMetaData(null, null, null)
                .setEnableDebug(true)
                .setEnableFullLog()
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            Log.i(TAG, "sophix load patch success!");
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 如果需要在后臺重啟逞敷,建議此處用SharePreference保存狀態(tài)狂秦。
                            Log.i(TAG, "sophix preload patch success. restart app to make effect.");
                        }
                    }
                }).initialize();
    }
}
//這里的初始化和[快速接入](https://help.aliyun.com/document_detail/53240.html)中的是一樣的,務(wù)必放在attachBaseContext中兰粉,onCreate不需要自行實現(xiàn)故痊。同時自定義的SophixStubApplication需要繼承com.taobao.sophix.SophixApplication。初始化設(shè)置選項如有疑問玖姑,請參考快速接入中的[接口說明](https://help.aliyun.com/document_detail/53240.html#1.3.2%20%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E)愕秫。

最重要的一點!焰络!

    @Keep
    @SophixEntry(MyRealApplication.class)
    static class RealApplicationStub {}

把MyRealApplication.class換成你自定義的Application
SophixEntry應(yīng)指定項目中原先真正的Application(原項目里application的android::name指定的)戴甩,這里用MyRealApplication指代。并且保證RealApplicationStub類名不被混淆闪彼。而SophixStubApplication的類名和包名可以自行取名甜孤。

這里的Keep是android.support包中的類,目的是為了防止這個內(nèi)部靜態(tài)類的類名被混淆畏腕,因為sophix內(nèi)部會反射獲取這個類的SophixEntry缴川。如果項目中沒有依賴android.support的話,就需要在progurad里面手動指定RealApplicationStub不被混淆描馅,詳見下文把夸。

-keepclassmembers class com.my.pkg.MyRealApplication {
    public <init>();
}
# 如果不使用android.support.annotation.Keep則需加上此行
# -keep class com.my.pkg.SophixStubApplication$RealApplicationStub

最后,需要把AndroidManifest里面的application改為這個新增的SophixStubApplication類:

<application
        android:name="com.my.pkg.SophixStubApplication"
        ... ...>
        ... ...
  1. 注意事項:
    如果運行報錯


    image.png

    說明是你的utdid沖突了铭污,趕快檢查你項目中引用到阿里系列的包(友盟統(tǒng)計恋日、友盟推送膀篮、阿里支付、andfix等等)最后確認只留下一個utdid的引用即可岂膳。

  2. 打包測試
    (1)打好2個差異包之后誓竿,用測試工具生成sophix-patch.jar包
    調(diào)試工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/hotfix_debug_tool-release.apk
    (2)查看你的程序中,目前的版本號是多少谈截,就是你AndroidManifest.xml中的android:versionName="1.0"或者build.gradle中的android:versionName="1.0筷屡。
    在阿里云管理后臺,新建版本1.0
    image.png

    注意:版本號必須完全一致才可以I得恕K偃铩!
    (3)然后再上傳補丁娘赴,就是你用工具生成的sophix-patch.jar包
    image.png

    (4)點擊下圖區(qū)域
    image.png

    掃碼測試沒問題后规哲,發(fā)布灰度測試
    image.png

    灰度測試通過后,點擊全量發(fā)布
    image.png

    至此诽表,OK唉锌,歡迎交流
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市竿奏,隨后出現(xiàn)的幾起案子袄简,更是在濱河造成了極大的恐慌,老刑警劉巖泛啸,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绿语,死亡現(xiàn)場離奇詭異,居然都是意外死亡候址,警方通過查閱死者的電腦和手機吕粹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岗仑,“玉大人匹耕,你說我怎么就攤上這事≤瘢” “怎么了稳其?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炸卑。 經(jīng)常有香客問我既鞠,道長,這世上最難降的妖魔是什么盖文? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任损趋,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浑槽。我一直安慰自己,他們只是感情好返帕,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布桐玻。 她就那樣靜靜地躺著,像睡著了一般荆萤。 火紅的嫁衣襯著肌膚如雪镊靴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天链韭,我揣著相機與錄音偏竟,去河邊找鬼。 笑死敞峭,一個胖子當著我的面吹牛踊谋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旋讹,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼殖蚕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沉迹?” 一聲冷哼從身側(cè)響起睦疫,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鞭呕,沒想到半個月后蛤育,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡葫松,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年瓦糕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进宝。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡刻坊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出党晋,到底是詐尸還是另有隱情谭胚,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布未玻,位于F島的核電站灾而,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扳剿。R本人自食惡果不足惜旁趟,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庇绽。 院中可真熱鬧锡搜,春花似錦橙困、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肠缔,卻和暖如春夏跷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背明未。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工槽华, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趟妥。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓猫态,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煮纵。 傳聞我的和親對象是個殘疾皇子懂鸵,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容