Android熱修復—阿里的新一代熱修復技術Sophix

轉載請注明出處:http://www.lxweimin.com/p/d9201733f3b4
本文出自Shawpoo的簡書
我的博客:CSDN博客

前言

熱修復作為當下熱門的技術,在業界內比較著名的有阿里的AndFix、Dexposed,騰訊QQ空間的超級補丁技術和微信的Tinker。但是我對熱修復基本沒怎么研究過,由于最近一段時間了解到阿里發布了新一代熱修復技術—Sophix。于是我決定折騰一波...

一、開通移動熱修復服務

  • 1、注冊阿里云賬號,選擇移動熱修復服務


    選擇移動熱修復

選擇之后需要開通此功能,點擊立即開通即可:

開通熱修復功能
  • 2、打開管理控制臺,點擊右上角創建APP

這時候返回Hotfix列表,會出現android和ios兩個版本的APP。

ps:這里需要的是注意,一個是移動服務APP列表,一個是Hotfix列表,兩個列表需要區分一下。

  • 3、RSA密鑰(后面需要在AndroidManifest文件中配置)

點擊Hoxfix列表android版本的app后面的管理即可查看基本信息:

二、接入熱修復服務

1、添加依賴包

在項目的app.gradle中:

  • 1、添加maven倉庫地址:
repositories {
   maven {
       url "http://maven.aliyun.com/nexus/content/repositories/releases"
   }
}

  • 2、添加gradle坐標版本依賴:

dependencies {
    compile 'com.aliyun.ams:alicloud-android-hotfix:3.1.0'
}

ps:如果項目中也依賴其它阿里系SDK,可能會同時依賴了utdid這個SDK,為了避免沖突可以這樣:

dependencies {
      compile ('com.aliyun.ams:alicloud-android-hotfix:3.1.0') {
           exclude(module:'alicloud-android-utdid')
      }
}

2、AndroidManifest中相關配置
  • 1、配置相關權限:
<!-- 網絡權限 -->
<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.READ_EXTERNAL_STORAGE"/>

  • 2、添加元數據:
<application 
    ...
    >
    <meta-data
      android:name="com.taobao.android.hotfix.IDSECRET"
      android:value="自己APP的App ID" />
    <meta-data
      android:name="com.taobao.android.hotfix.APPSECRET"
      android:value="自己APP的App Secret" />
    <meta-data
      android:name="com.taobao.android.hotfix.RSASECRET"
      android:value="自己APP的RSA密鑰" />
</application>

3、初始化Sophix

initialize的調用應該盡可能的早,必須在Application.attachBaseContext()或者Application.onCreate()的最開始進行SDK初始化操作,否則極有可能導致崩潰。而查詢服務器是否有可用補丁的操作可以在后面的任意地方。

這里我是繼承Application,在onCreate()方法中進行初始化:

public class SophixApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        initSophix();
    }

    private void initSophix() {
        String appVersion;

        try {
            appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            appVersion = "1.0.0";
            e.printStackTrace();
        }

        // initialize最好放在attachBaseContext最前面
        SophixManager.getInstance().setContext(this)
                .setAppVersion(appVersion)
                .setAesKey(null)
                .setEnableDebug(true)
                .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) {
                            // 表明補丁加載成功
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新補丁生效需要重啟. 開發者可提示用戶或者強制重啟;
                            // 建議: 用戶可以監聽進入后臺事件, 然后調用killProcessSafely自殺,以此加快應用補丁,詳見1.3.2.3
                        } else {
                            // 其它錯誤信息, 查看PatchStatus類說明
                        }
                    }
                }).initialize();
        // queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網絡權限,建議放在后面任意時刻,如onCreate中
        SophixManager.getInstance().queryAndLoadNewPatch();
    }

}

三、生成補丁并上傳到控制臺

1、進行第一次運行并打包生成apk

為了簡單測試,以一個TextView為例,且打包命名為first.apk


public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.textView);
        mTextView.setText("這是第一次運行的,");

    }
}

第一次運行效果.png
2、進行第二次運行并打包生成apk

這時候我們修改TextView的文字設置,且打包命名為second.apk

第二次運行效果.png
3、生成補丁
  • a 、生成補丁的話需要下載阿里的打補丁工具SophixPatchTool,然后分別選擇兩次打包生成的apk。
選擇兩次生成的apk

ps:
舊包:<必填> 選擇基線包路徑(有問題的APK)。
新包:<必填> 選擇新包路徑(修復過該問題APK)。
日志:打開日志輸出窗口。
高級:展開高級選項。
設置:配置其他信息。
GO!:開始生成補丁。

  • b、打開高級設置是否需要冷啟動,本項為默認即可,無需設置
高級選項

ps:
強制冷啟動:勾選的話強制生成補丁包為需要冷啟動才能修復的格式。默認不選的話,工具會根據代碼變更情況自動選擇即時熱替換或者冷啟動修復。
不比較資源:打補丁時不比較資源的變化。
不比較SO庫:打補丁時不比較SO庫的變化。

  • c、打開設置選項進行簽名信息設置:
設置簽名信息
  • d、點擊Go生成補丁:
  • e、上傳補丁

將生成的補丁文件sophix-patch.jar上傳到控制臺:

添加版本
上傳補丁

4、調試并發布補丁

上傳補丁后,查看補丁詳情會發現,補丁狀態是等待發布,阿里建議在正式發布前先使用hotfixdebug工具進行本地測試再發布,當然我們可以直接全量發布。

1、本地測試

下載hotfixdebug工具安裝后,填寫包名,點擊連接應用,然后掃描補丁詳情中的二維碼下載補丁。或者將補丁包放到手機sdcard,填寫絕對路徑也是可以的。

使用調試工具

Mode:1 表示掃碼模式, Code:12 表示應用當前已經有一個補丁, 所以新補丁不會立刻加載需要等下一次重啟加載。(因為我已經下載過一次了)

這時候打開我們裝上的first.apk發現并沒有變,殺掉進程,重新進入,發現已經是我們想要的內容了。

運行成功
2、全量發布補丁

選擇全量發布,所有安裝first.apk的用戶就可以得到修復了,點擊確認發布即可。

發布之后,重新啟動APP,會發現可以內容已經變為我們想要的。(這個過程可能略有延遲)

關于更多具體的發布流程,點擊參考

完美實現熱修復!

總結

Sophix的優點:

  • 1、補丁可以即時生效,不需要應用重啟(我測試的過程中是因為本地已經存在了,所以需要重啟APP);
  • 2、補丁包同樣采用差量技術,生成的PATCH體積小,阿里采用自己的SophixPatchTool進行補丁生成,簡單易用;
  • 3、對應用無侵入,幾乎無性能損耗;
  • 4、傻瓜式接入。

缺點:

開始收費,不過有免費閾值,關于價格可以點擊查看

點擊下載Demo

參考資料

阿里云官網
Sophix官方文檔
補丁調試
打補丁工具下載
調試工具apk下載
Android熱修復技術選型

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容