Android更新那些事(bugly、flavors、walle)...

關(guān)于android的更新,我了解到的方法有:
1、在應(yīng)用市場(chǎng),發(fā)布新版本
2、使用Bugly的全量更新(應(yīng)用升級(jí))
3、Bugly的熱更新

1、應(yīng)用升級(jí)、熱更新(Bugly)

1、介紹

升級(jí)功能是專為App的灰度升級(jí)而開發(fā)的組件,在bugly內(nèi)測(cè)頁面配置好App的更新策略,策略指定的老版本App在啟動(dòng)時(shí)會(huì)自動(dòng)檢測(cè)更新并提示升級(jí),為團(tuán)隊(duì)的應(yīng)用分發(fā),灰度內(nèi)測(cè)提供一站式解決方案。

使用熱更新(Bugly -微信Tinker),無需重新發(fā)版就可以使開發(fā)者緊急修復(fù)bug。使用Bugly 可以實(shí)現(xiàn)自動(dòng)下載補(bǔ)丁包、合成、并應(yīng)用補(bǔ)丁的功能,并且Bugly也提供了熱更新管理后臺(tái)讓開發(fā)者對(duì)每個(gè)版本補(bǔ)丁進(jìn)行管理。

2、集成

** 1、第一步:添加插件依賴**
在工程根目錄下“build.gradle”文件中添加:

buildscript {
   ...
   dependencies {
       // tinkersupport插件
       classpath "com.tencent.bugly:tinker-support:1.0.7"
   }

}

** 2、第二步:集成SDK**
gradle配置
在app module的“build.gradle”文件中添加:

dependencies {
         compile 'com.tencent.bugly:crashreport_upgrade:1.3.0'
}

依賴插件腳本
在app module的“build.gradle”文件中添加:

 // 依賴插件腳本
 apply from: 'tinker-support.gradle'

tinker-support.gradle內(nèi)容如下所示:

注:需要在同級(jí)目錄下創(chuàng)建tinker-support.gradle這個(gè)文件。

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

def bakPath = file("${buildDir}/bakApk/")
//在做補(bǔ)丁 的時(shí)候,需要修改這個(gè)
def appName = "app-0111-15-18-41"

/**
* 對(duì)于插件各參數(shù)的詳細(xì)解析請(qǐng)參考
*/
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ǔ)丁包時(shí),必需指定基線版本的apk,默認(rèn)值為空
   // 如果為空,則表示不是進(jìn)行補(bǔ)丁包的編譯
   // @{link tinkerPatch.oldApk }
   baseApk =  "${bakPath}/${appName}/app-release.apk"

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

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

   // 當(dāng)前版本唯一標(biāo)識(shí)
   //base:基線版本,patch:補(bǔ)丁
   tinkerId = "1.0.1-base"

   //多渠道
   //buildAllFlavorsDir="${bakPath}/${appName}"
   // 是否開啟代理Application,設(shè)置之后無須改造Application,默認(rèn)為false
   enableProxyApplication = false
}

** 3、添加權(quán)限、修改Application...**

3、打包

1、編譯基準(zhǔn)包
配置基準(zhǔn)包的tinkerId

// 唯一標(biāo)識(shí)當(dāng)前版本
tinkerId = "1.0.1-base"

執(zhí)行assembleRelease,編譯生成基準(zhǔn)包;在build/outputs/bakApk路徑下生成每次編譯的基準(zhǔn)包、混淆配置文件、資源Id文件,如下圖所示:

**執(zhí)行assembleRelease**,編譯生成基準(zhǔn)包

![生成的基準(zhǔn)包]A)PZ@YU5.png](http://upload-images.jianshu.io/upload_images/2206304-493c1170c2f3e91b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

啟動(dòng)apk,上報(bào)聯(lián)網(wǎng)數(shù)據(jù)
我們每次冷啟動(dòng)都會(huì)請(qǐng)求補(bǔ)丁策略,會(huì)上報(bào)當(dāng)前版本號(hào)和tinkerId,這樣我們后臺(tái)就能將這個(gè)唯一的tinkerId對(duì)應(yīng)到一個(gè)版本

2.1、應(yīng)用升級(jí)

應(yīng)用升級(jí)

2.2、對(duì)基線版本的bug修復(fù),根據(jù)基線版本生成補(bǔ)丁包

修改待修復(fù)apk路徑、mapping文件路徑、resId文件路徑,即修改3與2相同:


修改路徑

執(zhí)行tinkerPatchRelease,就能生成release編譯環(huán)境的補(bǔ)丁包。

生成的補(bǔ)丁包在build/outputs/patch目錄下:

補(bǔ)丁位置

3、上傳補(bǔ)丁包到平臺(tái)
上傳patch_signed_7zip.apk

4、

app module的“build.gradle”文件:

apply plugin: 'com.android.application'
android {
   compileSdkVersion 24
   buildToolsVersion "24.0.2"

   // 簽名配置
   signingConfigs {
       release {
           try {
               storeFile file("./keystore/buglyTest.jks")
               storePassword "111111"
               keyAlias "key"
               keyPassword "111111"
           } catch (ex) {
               throw new InvalidUserDataException(ex.toString())
           }
       }

       debug {
           storeFile file("./keystore/debug.keystore")
       }
   }

   defaultConfig {
       applicationId "com.buglydemo.buglytest"
       minSdkVersion 22
       targetSdkVersion 24
       versionCode 2
       versionName "1.0.1"

       // 開啟multidex,可以生成多個(gè)dex,防止方法數(shù)超過限定(65k)
       multiDexEnabled true
   }
   //構(gòu)建類型
   buildTypes {
       release {
           //不混淆
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           //簽名
           signingConfig signingConfigs.release
       }
       debug {
           debuggable true
           minifyEnabled false
           signingConfig signingConfigs.debug
       }
   }
   //跳過編譯警告
   lintOptions {
       checkReleaseBuilds false
       abortOnError false
   }
}

dependencies {
   compile fileTree(dir: 'libs', include: ['*.jar'])
   testCompile 'junit:junit:4.12'
   compile 'com.android.support:appcompat-v7:24.2.1'

   compile "com.android.support:multidex:1.0.1" // 多dex配置
   compile 'com.tencent.bugly:crashreport_upgrade:latest.release'//其中l(wèi)atest.release指代最新版本號(hào),也可以指定明確的版本號(hào),例如1.2.0
}

apply from: 'tinker-support.gradle'

</br>

參考:
Bugly Android熱更新使用指南、Bugly Android熱更新詳解、微信Android熱補(bǔ)丁實(shí)踐演進(jìn)之路解決Android方法數(shù)超出限定的問題

在編譯時(shí)通過新舊兩個(gè)Dex生成差異path.dex。在運(yùn)行時(shí),將差異patch.dex重新跟原始安裝包的舊Dex還原為新的Dex。

在使用bugly時(shí),要注意它的版本,如果版本不一致,有些效果就不一樣...

2、多渠道打包

2-1、多渠道打包-Flavors

在app module的“build.gradle”文件中添加:

android {
   ...
   defaultConfig {
       ...
       manifestPlaceholders = [ CHANNEL_VALUE:"default_channel" ]
   }
   productFlavors {
       default_channel{
       }
       yingyongbao {
       }
       open360 {
       }
       baidu {
       }
   }
   productFlavors.all{flavor->
       flavor.manifestPlaceholders=[CHANNEL_VALUE:name]
   }
}

tinker-support.gradle文件中添加:

tinkerSupport {
   ...
   buildAllFlavorsDir="${bakPath}/${appName}"
}

在AndroidManifest.xml中添加:

       <meta-data
           android:name="BaiduMobAd_CHANNEL"
           android:value="${CHANNEL_VALUE}" />

執(zhí)行assembleRelease,會(huì)自動(dòng)生成渠道包

渠道包

會(huì)自動(dòng)在AndroidManifest.xml中添加渠道和tinkerId

bugly_channel、tinker_id

之后就可以把渠道包分別進(jìn)行加固上傳了...

1、應(yīng)用升級(jí)

在應(yīng)用升級(jí)的時(shí)候,可以根據(jù)版本、渠道、網(wǎng)絡(luò)環(huán)境控制新版本的下發(fā)

下發(fā)條件-渠道
2、熱更新

執(zhí)行

2-2、多渠道打包 walle

1、配置

1、創(chuàng)建multiple-channel.gradle

apply plugin: 'walle'
walle {
   // 指定渠道包的輸出路徑
   apkOutputFolder = new File("${project.buildDir}/outputs/channels");
   // 定制渠道包的APK的文件名稱
   apkFileNameFormat = '${appName}-${channel}-${buildType}-v${versionName}.apk';
   // 渠道配置文件
   channelFile = new File("${project.getProjectDir()}/channel")
}

2、配置build.gradle
在根目錄 build.gradle 文件中添加:

buildscript {
   dependencies {
       classpath 'com.meituan.android.walle:plugin:1.1.3'
   }
}

并在當(dāng)前app的 build.gradle中添加:


dependencies {
   compile 'com.meituan.android.walle:library:1.1.3'
}
// 多渠道使用walle示例(注:多渠道使用)
apply from: 'multiple-channel.gradle'

3、創(chuàng)建渠道文件channel


渠道文件
2、生成渠道包

生成渠道包的方式是和assemble${variantName}Channels指令結(jié)合,渠道包的生成目錄默認(rèn)存放在 build/outputs/apk/,也可以通過walle閉包中的apkOutputFolder參數(shù)來指定輸出目錄

gradle assembleReleaseChannels
渠道包
3、獲取渠道信息
String channel = WalleChannelReader.getChannel(getApplication());
4、一個(gè)補(bǔ)丁修復(fù)所有渠道

在打渠道包的過程,因?yàn)闀?huì)走編譯流程,熱更新插件也會(huì)在bakApk生成對(duì)應(yīng)的基線版本,這個(gè)跟普通打包就沒有差別了:

一個(gè)補(bǔ)丁修復(fù)所有渠道

只需要上傳補(bǔ)丁包到補(bǔ)丁管理后臺(tái),然后下發(fā)即可。

來自于:Bugly 多渠道熱更新解決方案

如果把渠道包直接用工具進(jìn)行加固,可能會(huì)粗錯(cuò)...

3、樂固+walle

樂固 的 自助加固工具,在簽名的時(shí)候采用的是v1簽名,而渠道包生成工具walle,不支持V1簽名方案,需要在APK Signature Scheme V2簽名下才能生成渠道包??梢岳脄ipalign和apksigner對(duì)加固的apk進(jìn)行v2簽名,之后在多渠道打包。

1、檢測(cè)APK的簽名狀態(tài),工具地址:Android-GetAPKInfo
java -jar CheckAndroidV2SignatureByAPKSig.jar app-release.apk

正常打包一個(gè)release版,其簽名狀態(tài):


release版
2、加固,可以先不設(shè)置簽名和渠道
加固

使用不簽名的加固
3、使用Android SDK中的zipalign - 對(duì)齊操作 - 優(yōu)化

1、打開CMD,進(jìn)入Android SDK -> build-tools -> 25.+目錄
2、執(zhí)行命令:zipalign -v 4 [待優(yōu)化.apk路徑] [優(yōu)化后.apk路徑]

zipalign -v 4 app-baidu-release-v2.7.2_legu.apk liyi.apk
優(yōu)化
4、使用 apksigner 簽名

1、打開CMD,進(jìn)入Android SDK -> build-tools -> 25.+目錄
2、執(zhí)行命令:apksigner sign --ks [你的簽名文件] [apk路徑],之后會(huì)輸入簽名文件密碼。

apksigner sign --ks aishengjianshen.keystore app-release_legu_self_sign.apk
簽名
重新簽名之后的apk的狀態(tài)
5、使用walle打渠道包
java -jar walle-cli-all.jar batch -c yingyongbao,open360,baidu app-release_legu_self_sign.apk

參考1-方法:Meituan-Dianping/walleAndroid-GetAPKInfo、Android 7.0多渠道打包Signature Scheme v2簽名失效、Bugly 多渠道熱更新解決方案、Bugly-熱更新
參考2-原理:新一代開源Android渠道包生成工具WalleAndroid 新一代多渠道打包神器
參考的例子:Bugly-Android-Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容