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í)功能是專(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í)行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"

       // 開(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

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的文件名稱(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)有差別了:

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

只需要上傳補(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):


release版
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
優(yōu)化
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
簽名
重新簽名之后的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/walle跨晴、Android-GetAPKInfo欧聘、Android 7.0多渠道打包Signature Scheme v2簽名失效Bugly 多渠道熱更新解決方案端盆、Bugly-熱更新
參考2-原理:新一代開(kāi)源Android渠道包生成工具Walle怀骤、Android 新一代多渠道打包神器
參考的例子:Bugly-Android-Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焕妙,隨后出現(xiàn)的幾起案子蒋伦,更是在濱河造成了極大的恐慌,老刑警劉巖焚鹊,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痕届,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡末患,警方通過(guò)查閱死者的電腦和手機(jī)研叫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)璧针,“玉大人嚷炉,你說(shuō)我怎么就攤上這事√匠鳎” “怎么了申屹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)隧膏。 經(jīng)常有香客問(wèn)我哗讥,道長(zhǎng),這世上最難降的妖魔是什么胞枕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任杆煞,我火速辦了婚禮,結(jié)果婚禮上曲稼,老公的妹妹穿的比我還像新娘索绪。我一直安慰自己,他們只是感情好贫悄,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布瑞驱。 她就那樣靜靜地躺著,像睡著了一般窄坦。 火紅的嫁衣襯著肌膚如雪唤反。 梳的紋絲不亂的頭發(fā)上凳寺,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音彤侍,去河邊找鬼肠缨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盏阶,可吹牛的內(nèi)容都是我干的晒奕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼名斟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脑慧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起砰盐,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闷袒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后岩梳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體囊骤,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年冀值,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了也物。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡池摧,死狀恐怖焦除,靈堂內(nèi)的尸體忽然破棺而出激况,到底是詐尸還是另有隱情作彤,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布乌逐,位于F島的核電站竭讳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浙踢。R本人自食惡果不足惜绢慢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洛波。 院中可真熱鬧胰舆,春花似錦、人聲如沸蹬挤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)焰扳。三九已至倦零,卻和暖如春误续,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扫茅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蹋嵌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葫隙。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓栽烂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恋脚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愕鼓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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