關(guān)于android的更新丁存,我了解到的方法有:
1肩杈、在應(yīng)用市場(chǎng),發(fā)布新版本
2解寝、使用Bugly的全量更新(應(yīng)用升級(jí))
3扩然、Bugly的熱更新
1、應(yīng)用升級(jí)编丘、熱更新(Bugly)
1、介紹
升級(jí)功能是專(zhuān)為App的灰度升級(jí)而開(kāi)發(fā)的組件彤悔,在bugly內(nèi)測(cè)頁(yè)面配置好App的更新策略嘉抓,策略指定的老版本App在啟動(dòng)時(shí)會(huì)自動(dòng)檢測(cè)更新并提示升級(jí),為團(tuán)隊(duì)的應(yīng)用分發(fā)晕窑,灰度內(nèi)測(cè)提供一站式解決方案抑片。
使用熱更新(Bugly -微信Tinker),無(wú)需重新發(fā)版就可以使開(kāi)發(fā)者緊急修復(fù)bug杨赤。使用Bugly 可以實(shí)現(xiàn)自動(dòng)下載補(bǔ)丁包敞斋、合成、并應(yīng)用補(bǔ)丁的功能疾牲,并且Bugly也提供了熱更新管理后臺(tái)讓開(kā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 {
// 開(kāi)啟tinker-support插件济锄,默認(rèn)值true
enable = true
// 指定歸檔目錄,默認(rèn)值當(dāng)前module的子目錄tinker
autoBackupApkDir = "${bakPath}"
// 是否啟用覆蓋tinkerPatch配置功能霍转,默認(rèn)值false
// 開(kāi)啟后tinkerPatch配置不生效荐绝,即無(wú)需添加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}"
// 是否開(kāi)啟代理Application岩喷,設(shè)置之后無(wú)須改造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ǔ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í)
2.2虏两、對(duì)基線版本的bug修復(fù)愧旦,根據(jù)基線版本生成補(bǔ)丁包
修改待修復(fù)apk路徑、mapping文件路徑定罢、resId文件路徑笤虫,即修改3與2相同:
執(zhí)行tinkerPatchRelease,就能生成release編譯環(huán)境的補(bǔ)丁包祖凫。
生成的補(bǔ)丁包在build/outputs/patch目錄下:
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"
// 開(kāi)啟multidex惠况,可以生成多個(gè)dex遭庶,防止方法數(shù)超過(guò)限定(65k)
multiDexEnabled true
}
//構(gòu)建類(lèi)型
buildTypes {
release {
//不混淆
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//簽名
signingConfig signingConfigs.release
}
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.debug
}
}
//跳過(guò)編譯警告
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ù)超出限定的問(wèn)題
在編譯時(shí)通過(guò)新舊兩個(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
之后就可以把渠道包分別進(jìn)行加固上傳了...
1、應(yīng)用升級(jí)
在應(yīng)用升級(jí)的時(shí)候降盹,可以根據(jù)版本与柑、渠道、網(wǎng)絡(luò)環(huán)境控制新版本的下發(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的文件名稱(chēng)
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/推正,也可以通過(guò)walle閉包中的apkOutputFolder參數(shù)來(lái)指定輸出目錄
gradle assembleReleaseChannels
3、獲取渠道信息
String channel = WalleChannelReader.getChannel(getApplication());
4宝惰、一個(gè)補(bǔ)丁修復(fù)所有渠道
在打渠道包的過(guò)程植榕,因?yàn)闀?huì)走編譯流程,熱更新插件也會(huì)在bakApk生成對(duì)應(yīng)的基線版本掌测,這個(gè)跟普通打包就沒(méi)有差別了:
只需要上傳補(bǔ)丁包到補(bǔ)丁管理后臺(tái)内贮,然后下發(fā)即可产园。
來(lái)自于:Bugly 多渠道熱更新解決方案
坑
如果把渠道包直接用工具進(jìn)行加固汞斧,可能會(huì)粗錯(cuò)...
3、樂(lè)固+walle什燕?
樂(lè)固 的 自助加固工具粘勒,在簽名的時(shí)候采用的是v1簽名,而渠道包生成工具walle屎即,不支持V1簽名方案庙睡,需要在APK Signature Scheme V2簽名下才能生成渠道包〖祭可以利用zipalign和apksigner對(duì)加固的apk進(jìn)行v2簽名乘陪,之后在多渠道打包。
1雕擂、檢測(cè)APK的簽名狀態(tài)啡邑,工具地址:Android-GetAPKInfo
java -jar CheckAndroidV2SignatureByAPKSig.jar app-release.apk
正常打包一個(gè)release版,其簽名狀態(tài):
2井赌、加固谤逼,可以先不設(shè)置簽名和渠道
3、使用Android SDK中的zipalign - 對(duì)齊操作 - 優(yōu)化
1仇穗、打開(kāi)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
4纹坐、使用 apksigner 簽名
1枝冀、打開(kāi)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
5、使用walle打渠道包
java -jar walle-cli-all.jar batch -c yingyongbao,open360,baidu app-release_legu_self_sign.apk
參考1-方法:Meituan-Dianping/walle跨晴、Android-GetAPKInfo欧聘、Android 7.0多渠道打包Signature Scheme v2簽名失效、Bugly 多渠道熱更新解決方案端盆、Bugly-熱更新
參考2-原理:新一代開(kāi)源Android渠道包生成工具Walle怀骤、Android 新一代多渠道打包神器
參考的例子:Bugly-Android-Demo