Android 移動熱修復(fù) Sophix進階篇

前言

??在IT行業(yè)蓬勃發(fā)展的今天迹缀,作為程序猿的我們要時刻緊跟IT技術(shù)的步伐。移動互聯(lián)網(wǎng)發(fā)展可謂日新月異慰安,各種黑科技橫空出世盆耽,目不暇接蹋砚!今天我們就來學(xué)習(xí)下如何正確集成阿里云的移動熱修復(fù)黑科技——Sophix。按照阿里云官方集成文檔摄杂,我們含辛茹苦地把Demo搭建好了坝咐,Demo運行起來也能正常加載修復(fù)包Pathch但是析恢,當(dāng)你按照文檔真正把Sophix集成到你的項目中的時候墨坚,各種 can not find class...,一萬匹曹泥馬在你心中狂奔而過S彻摇泽篮!

步驟簡介

  • 創(chuàng)建項目
    1、新建項目:SophixDemo
    2袖肥、在項目的build.gradle文件中添加maven路徑:
allprojects {
    repositories {
        google()
        jcenter()
        //aliyun hot fix
        maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
    }
}

?3咪辱、在appbuild.gradle文件中添加SDK引用:

dependencies {
   //其他SDK引用

   //Sophix hot fix SDK
    implementation 'com.aliyun.ams:alicloud-android-hotfix:3.2.0'
}

?4振劳、創(chuàng)建SophixStubApplication.javaMyApplication.java
MyApplication.java

import android.app.Application;

import com.taobao.sophix.SophixManager;

/**
 * Created on 2018/2/2.
 *
 * @author jsc
 */

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //hot fix. Load patch from aliyun service.
        SophixManager.getInstance().queryAndLoadNewPatch();
    }
}

SophixStubApplication.java

import android.content.Context;
import android.content.DialogInterface;
import android.support.annotation.Keep;
import android.support.multidex.MultiDex;
import android.support.v7.app.AlertDialog;

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;

/**
 * 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";
    //aesKey必須是16位數(shù)字或字母的組合槽驶,是和補丁工具設(shè)置里面AES Key保持完全一致, 補丁才能正確被解密進而加載
    final String aesKey = "";
    final String appId = "";
    final String appSecret = "";
    final String rsa = "";

    // 此處SophixEntry應(yīng)指定真正的Application,并且保證RealApplicationStub類名不被混淆鸳兽。
    @Keep
    @SophixEntry(MyApplication.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;
        try {
            appVersion = this.getPackageManager()
                    .getPackageInfo(this.getPackageName(), 0)
                    .versionName;
        } catch (Exception e) {
            appVersion = "0.0.0";
        }
        SophixManager.getInstance().setContext(this)
                .setAesKey(aesKey)
                .setAppVersion(appVersion)
                .setSecretMetaData(appId, appSecret, rsa)
                .setEnableDebug(false)
                .setEnableFullLog()
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        switch (code){
                            case PatchStatus.CODE_LOAD_SUCCESS:
//                                Toast.makeText(getBaseContext(), "Patch更新成功", Toast.LENGTH_SHORT).show();
                                break;
                            case PatchStatus.CODE_LOAD_RELAUNCH:
                                // 如果需要在后臺重啟揍异,建議此處用SharePreference保存狀態(tài)全陨。
                                showForceRestartAppDialog();
                                break;
                        }
                    }
                }).initialize();
    }

    private void showForceRestartAppDialog(){
        new AlertDialog.Builder(getBaseContext())
                .setMessage("Patch更新成功,請重啟應(yīng)用衷掷!")
                .setCancelable(false)
                .setPositiveButton("退出應(yīng)用", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        SophixManager.getInstance().killProcessSafely();
                    }
                }).show();
    }
}

aesKey——必須是16位數(shù)字或字母的組合辱姨,是和補丁工具設(shè)置里面AES Key保持完全一致, 補丁才能正確被解密加載
appId——從 APP管理 中獲取
appSecret——從 APP管理 中獲取
rsa——從 APP管理 中獲取

?5、添加SophixStubApplication到你的AndroidManifest.xml中戚嗅。
我們只添加SophixStubApplication就可以了炮叶,MyApplication不用添加進去。因為SophixStubApplication內(nèi)部會通過反射找到我們的MyApplication渡处。關(guān)鍵代碼@SophixEntry(MyApplication.class)镜悉。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jsc.exam.sophix">

    <application
        android:name=".SophixStubApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AboutActivity"></activity>
    </application>

</manifest>

6、編寫混淆文件医瘫。在app下的proguard-rules.pro文件中添加:

#基線包使用侣肄,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/buidl/outputs/mapping/release路徑下,移動到/app路徑下

#修復(fù)后的項目使用醇份,保證混淆結(jié)果一致
#-applymapping /build/outputs/mapping/release/mapping.txt

#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize

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

{提別提示}:
??a稼锅、當(dāng)我們在打包發(fā)布包的時候我們開啟printmapping關(guān)閉applymapping僚纷。這時候在項目文件夾app\build\outputs\mapping\release下生成mappint.txt文件矩距。這時候apk和這個mapping.txt文件我們都要做一份保存(按照規(guī)范的開發(fā)流程,這時候在代碼倉庫中需要建立一個新的的分支branch怖竭,不管是用svn還是git代碼倉庫)锥债。apk用來發(fā)布,mappting.txt文件是用來生成補丁patch打包用。
??b哮肚、當(dāng)我們在打包補丁包的時候我們關(guān)閉printmapping登夫,開啟applymapping。這時候applymapping指向我們mappting.txt文件所在的路徑允趟。在demo中直接指向了app\build\outputs\mapping\release\mappint.txt恼策。

前言所說的各種 can not find class的罪魁禍首多半就是混淆。
如果找不類潮剪,我們可以從以下幾方面去找到問題:

A涣楷、檢查發(fā)布包、補丁包抗碰、APP管理的版本號是否一致总棵。
B、檢查發(fā)布包改含、補丁包是否用同一份mapping.txt來混淆打包的情龄。

只要注意以上兩點,集成Sophix基本上不會出現(xiàn)什么問題的捍壤。

源碼

示例https://github.com/JustinRoom/SophixDemo

結(jié)尾

??希望這篇小文章能幫使用Sophix的小伙伴們跳過這些坑骤视,不奢求打賞,加個關(guān)注啰鹃觉!我是JustinEoy专酗,QQ:1006368252

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盗扇,一起剝皮案震驚了整個濱河市祷肯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疗隶,老刑警劉巖佑笋,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斑鼻,居然都是意外死亡蒋纬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門坚弱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜀备,“玉大人,你說我怎么就攤上這事荒叶∧敫螅” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵些楣,是天一觀的道長脂凶。 經(jīng)常有香客問我宪睹,道長,這世上最難降的妖魔是什么艰猬? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮埋市,結(jié)果婚禮上冠桃,老公的妹妹穿的比我還像新娘。我一直安慰自己道宅,他們只是感情好食听,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著污茵,像睡著了一般樱报。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泞当,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天迹蛤,我揣著相機與錄音,去河邊找鬼襟士。 笑死盗飒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陋桂。 我是一名探鬼主播逆趣,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗜历!你這毒婦竟也來了宣渗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤梨州,失蹤者是張志新(化名)和其女友劉穎痕囱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暴匠,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡咐蝇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巷查。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片有序。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岛请,靈堂內(nèi)的尸體忽然破棺而出旭寿,到底是詐尸還是另有隱情,我是刑警寧澤崇败,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布盅称,位于F島的核電站肩祥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缩膝。R本人自食惡果不足惜混狠,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疾层。 院中可真熱鬧将饺,春花似錦、人聲如沸痛黎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湖饱。三九已至掖蛤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間井厌,已是汗流浹背蚓庭。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仅仆,地道東北人彪置。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蝇恶,于是被迫代替她去往敵國和親拳魁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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