熱更新:使用Bugly集成的Tinker

參考:
微信Tinker
Bugly Android熱更新使用指南

有了Bugly幫助我們集成暂筝,那么我們就無需過多去關(guān)心Tinker是如何配置的萤皂,因為其配置太麻煩了揣云。只是在遇到一些特別的問題時梳码,我們不妨去看看微信Tinker的幫助文檔人芽!

第一步:在總工程的build.grade下面添加依賴

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // tinkersupport插件, 其中l(wèi)astest.release指拉取最新版本望几,也可以指定明確版本號,例如1.0.4
        classpath "com.tencent.bugly:tinker-support:latest.release"
    }
}

第二步:在當(dāng)前Modle的build.grade中集成SDK

dependencies {

          compile "com.android.support:multidex:1.0.1" // 多dex配置
          compile 'com.tencent.bugly:crashreport_upgrade:latest.release' // 升級SDK
}

并在最上面加入依賴插件腳本

apply from: 'tinker-support.gradle'

這個腳本需要自己在當(dāng)前Model的根目錄下創(chuàng)建萤厅,要和build.grade在同一文件夾

QQ截圖20170211100428.png

tinker-support.gradle里面的內(nèi)容如下:

apply plugin: 'com.tencent.bugly.tinker-support'

def bakPath = file("${buildDir}/bakApk/")

/**
 * 此處填寫每次構(gòu)建生成的基準(zhǔn)包目錄
 */
def baseApkDir = "app-0208-15-10-00"

/**
 * 對于插件各參數(shù)的詳細(xì)解析請參考
 */
tinkerSupport {

    // 開啟tinker-support插件橄抹,默認(rèn)值true
    enable = true

    // 指定歸檔目錄,默認(rèn)值當(dāng)前module的子目錄tinker
    autoBackupApkDir = "${bakPath}"

    // 是否啟用覆蓋tinkerPatch配置功能惕味,默認(rèn)值false
    // 開啟后tinkerPatch配置不生效害碾,即無需添加tinkerPatch
    overrideTinkerPatchConfiguration = true

    // 編譯補(bǔ)丁包時,必需指定基線版本的apk赦拘,默認(rèn)值為空
    // 如果為空慌随,則表示不是進(jìn)行補(bǔ)丁包的編譯
    // @{link tinkerPatch.oldApk }
    baseApk = "${bakPath}/${baseApkDir}/app-release.apk"

    // 對應(yīng)tinker插件applyMapping
    baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

    // 對應(yīng)tinker插件applyResourceMapping
    baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"

    // 構(gòu)建基準(zhǔn)包和補(bǔ)丁包都要指定不同的tinkerId,并且必須保證唯一性
    tinkerId = "base-1.0.1"

    // 構(gòu)建多渠道補(bǔ)丁時使用
    // buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

    // 是否開啟反射Application模式
    enableProxyApplication = false

}

/**
 * 一般來說,我們無需對下面的參數(shù)做任何的修改
 * 對于各參數(shù)的詳細(xì)介紹請參考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    //oldApk ="${bakPath}/${appName}/app-release.apk"
    ignoreWarning = false
    useSign = true
    dex {
        dexMode = "jar"
        pattern = ["classes*.dex"]
        loader = []
    }
    lib {
        pattern = ["lib/*/*.so"]
    }

    res {
        pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
        ignoreChange = []
        largeModSize = 100
    }

    packageConfig {
    }
    sevenZip {
        zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
//        path = "/usr/local/bin/7za"
    }
    buildConfig {
        keepDexApply = false
        //tinkerId = "1.0.1-base"
        //applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" //  可選,設(shè)置mapping文件阁猜,建議保持舊apk的proguard混淆方式
        //applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可選丸逸,設(shè)置R.txt文件,通過舊apk文件保持ResId的分配
    }
}

更詳細(xì)的配置項參考tinker-support配置說明

注意這個文件中配置了enableProxyApplication = false
意思就是是否開啟反射Application模式,默認(rèn)為false
這是Tinker推薦的接入方式剃袍,一定程度上會增加接入成本黄刚,但具有更好的兼容性。

第三步:初始化SDK

分兩種情況來進(jìn)行初始化

情況一(推薦):enableProxyApplication = false

需要我們自定義的MyApplication繼承TinkerApplication

public class SampleApplication extends TinkerApplication {
    public SampleApplication() {
        super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",
                "com.tencent.tinker.loader.TinkerLoader", false);
    }
}

注意:這個類集成TinkerApplication類民效,這里面不做任何操作憔维,所有Application的代碼都會放到ApplicationLike繼承類當(dāng)中
四個參數(shù)解析
參數(shù)1:tinkerFlags 表示Tinker支持的類型 dex only、library only or all suuport畏邢,default: TINKER_ENABLE_ALL
參數(shù)2:delegateClassName Application代理類 這里填寫你自定義的ApplicationLike
參數(shù)3:loaderClassName Tinker的加載器业扒,使用默認(rèn)即可
參數(shù)4:tinkerLoadVerifyFlag 加載dex或者lib是否驗證md5,默認(rèn)為false

這里需要重新寫一個ApplicationLike來繼承DefaultApplicationLike

public class SampleApplicationLike extends DefaultApplicationLike {

    public static final String TAG = "Tinker.SampleApplicationLike";

    public SampleApplicationLike(Application application, int tinkerFlags,
            boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime,
            long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
    }


    @Override
    public void onCreate() {
        super.onCreate();
        // 這里實現(xiàn)SDK初始化舒萎,appId替換成你的在Bugly平臺申請的appId
        // 調(diào)試時程储,將第三個參數(shù)改為true
        Bugly.init(getApplication(), "900029763", false);
    }


    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        // you must install multiDex whatever tinker is installed!
        MultiDex.install(base);

        // 安裝tinker
        // TinkerManager.installTinker(this); 替換成下面Bugly提供的方法
        Beta.installTinker(this);
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {
        getApplication().registerActivityLifecycleCallbacks(callbacks);
    }

}

注意:這里發(fā)現(xiàn)官方文檔的一個bug,在onCreate中進(jìn)行了Bugly.init(this, "900029763", false);也就是Bugly調(diào)試的初始化,但是里面第一個參數(shù)是要傳入上下文的臂寝,而SampleApplicationLike 只是一個抽象類的實現(xiàn)類章鲤。這段應(yīng)該放在MyApplication的OnCreate()方法中才對,所以這里注釋掉了咆贬!
(其實在這里可以使用getApplication()來獲取上下文替換this,多謝小巫的提醒败徊。)

情況二(簡單):enableProxyApplication = true
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 這里實現(xiàn)SDK初始化,appId替換成你的在Bugly平臺申請的appId
        // 調(diào)試時掏缎,將第三個參數(shù)改為true
        Bugly.init(this, "900029763", false);
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        // you must install multiDex whatever tinker is installed!
        MultiDex.install(base);


        // 安裝tinker
        Beta.installTinker();
    }

}

注:無須你改造Application皱蹦,主要是為了降低接入成本,我們插件會動態(tài)替換AndroidMinifest文件中的Application為我們定義好用于反射真實Application的類(需要您接入SDK 1.2.2版本 和 插件版本 1.0.3以上)御毅。

第四步:AndroidManifest.xml的配置

1.權(quán)限配置
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<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_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

注意:如果你也想使用Bugly升級功能,你必須要進(jìn)行2怜珍、3項的配置端蛆,而如果你只想使用熱更新能力,你只需要配置權(quán)限即可酥泛。

2. Activity配置
<activity
    android:name="com.tencent.bugly.beta.ui.BetaActivity"
    android:theme="@android:style/Theme.Translucent" />
3. 配置FileProvider

注意:如果您想兼容Android N或者以上的設(shè)備今豆,必須要在AndroidManifest.xml文件中配置FileProvider來訪問共享路徑的文件。如果你使用的第三方庫也配置了同樣的FileProvider柔袁,你需要將第三方庫配置的路徑copy到我們配置的provider_path文件下呆躲。

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

${applicationId}請?zhí)鎿Q為您的包名,例如com.bugly.upgrade.demo捶索。這里要注意一下插掂,F(xiàn)ileProvider類是在support-v4包中的,檢查你的工程是否引入該類庫。

在res目錄新建xml文件夾辅甥,創(chuàng)建provider_paths.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->
    <external-path name="beta_external_path" path="Download/"/>
    <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->
    <external-path name="beta_external_files_path" path="Android/data/"/>
</paths>

這里配置的兩個外部存儲路徑是升級SDK下載的文件可能存在的路徑酝润,一定要按照上面格式配置,不然可能會出現(xiàn)錯誤璃弄。

第五步:混淆配置 (沒有混淆的可以忽略)

為了避免混淆SDK要销,在Proguard混淆文件中增加以下配置:

-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}

如果你使用了support-v4包,你還需要配置以下混淆規(guī)則:


-keep class android.support.**{*;}

到這里差不多就結(jié)束了夏块,其實配置真的很繁瑣疏咐,都是Bugly幫我們簡化了很多地方了。
下面就是我們自己去實踐的時間了:
熱更新實踐

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脐供,一起剝皮案震驚了整個濱河市浑塞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌患民,老刑警劉巖缩举,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匹颤,居然都是意外死亡仅孩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門印蓖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辽慕,“玉大人,你說我怎么就攤上這事赦肃〗︱龋” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵他宛,是天一觀的道長船侧。 經(jīng)常有香客問我,道長厅各,這世上最難降的妖魔是什么镜撩? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮队塘,結(jié)果婚禮上袁梗,老公的妹妹穿的比我還像新娘。我一直安慰自己憔古,他們只是感情好遮怜,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸿市,像睡著了一般锯梁。 火紅的嫁衣襯著肌膚如雪即碗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天涝桅,我揣著相機(jī)與錄音拜姿,去河邊找鬼。 笑死冯遂,一個胖子當(dāng)著我的面吹牛蕊肥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛤肌,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼壁却,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裸准?” 一聲冷哼從身側(cè)響起展东,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炒俱,沒想到半個月后盐肃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡权悟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年砸王,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峦阁。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡谦铃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榔昔,到底是詐尸還是另有隱情驹闰,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布撒会,位于F島的核電站嘹朗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诵肛。R本人自食惡果不足惜屹培,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曾掂。 院中可真熱鬧惫谤,春花似錦壁顶、人聲如沸珠洗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽许蓖。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膊爪,已是汗流浹背自阱。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留米酬,地道東北人沛豌。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像赃额,于是被迫代替她去往敵國和親加派。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

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