本篇博客 主要爲本人學習過程總結,有不對的地方麻煩指出,一塊兒學習進步html
前言android
最近也是搞到了一個 電子書 《Android+Gradle權威指南》,學習一波Gradle 知識,嘗試配置簽名設置和配置Walle實現多渠道打包。閱讀時間:15分鐘git
咱們即可以經過點擊左上角的Build->Generate Signed APK->Next,若是沒有jks 文件,則須要本身建立,而後選擇對應的Build Type進行打包。github
對於部分不用上架的App來講,這波操做還能夠接受,可是若是須要上傳到國內的各個平臺則須要屢次重複這個操做,能把人搞死...,經過這篇文章能夠學到 Gradle 簽名配置 及 Walle 配置實習 多渠道打包。安全
咱們先來看一下新建的項目 默認的 app gradle文件默認主要配置以下, markdown
首先將咱們生成好的 jks文件放到project 目錄下 app
defaultConfig {
....
}
signingConfigs {
release {
storeFile file(../ymcandroid.jks)//簽名文件路徑 storePassword ymc****** keyAlias key0 keyPassword ymc******//簽名密碼 println("====== signingConfigs.release ======") } } 複製代碼
上述代碼中的部分變量分別對應於 視圖打包中的 咱們須要添加的 jks 文件相關信息。 ide
- 坑: signingConfigs代碼塊必定要寫在buildTypes前面,不然會報下面這種錯: Could not find property ‘debugConfig’ on SigningConfig container.
咱們在項目路徑下的app/build/outputs能夠看到咱們打包的apk。oop
這裏也上下個人 buildTypes 配置學習
buildTypes {
release {
minifyEnabled false
//是否移除無用資源
zipAlignEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
複製代碼
上述已是簡單的 簽名了,可是我這個wanAndroid 項目須要上傳到Github上,因此咱們這裏先說一下 忽略文件,在上傳git 的時候,咱們將忽略部分文件,如下是我項目中的忽略文件配置
# Built application files //
*.apk
*.ap_
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
/local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# Intellij
*.iml
.idea/workspace.xml
# Keystore files
*.jks
*.iws
.idea/
複製代碼
咱們能夠在其中找到咱們將要配置 jks密碼信息的 local.properties 文件。
ndk.dir=E\:\\AndroidSDK\\ndk-bundle
sdk.dir=E\:\\AndroidSDK
keystore.path=../ymcandroid.jks
keystore.password=ymc******
keystore.alias=key0
keystore.alias_password=ymc******
複製代碼
咱們這裏就須要修改 app build.gradle 文件,將明文的地方替換掉
def keystoreFilepath = ''
def keystorePSW = ''
def keystoreAlias = ''
def keystoreAliasPSW = ''
// default keystore file, PLZ config file path in local.properties
def keyfile = file('s.keystore.temp')
Properties properties = new Properties()
// local.properties file in the root director
properties.load(project.rootProject.file('local.properties').newDataInputStream())
keystoreFilepath = properties.getProperty("keystore.path")
if (keystoreFilepath) {
keystorePSW = properties.getProperty("keystore.password")
keystoreAlias = properties.getProperty("keystore.alias")
keystoreAliasPSW = properties.getProperty("keystore.alias_password")
keyfile = file(keystoreFilepath)
}
android {
compileSdkVersion 27
defaultConfig {
applicationId "cn.white.ymc.wanandroidmaster"
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
signingConfigs {
release {
storeFile keyfile//簽名文件路徑
storePassword keystorePSW
keyAlias keystoreAlias
keyPassword keystoreAliasPSW //簽名密碼
println("====== signingConfigs.release ======")
}
}
buildTypes {
release {
minifyEnabled false
//是否移除無用資源
zipAlignEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//簽名文件存在,則簽名
if (keyfile.exists()) {
println("WITH -> buildTypes -> release: using jks key")
signingConfig signingConfigs.release
}else {
println("WITH -> buildTypes -> release: using default key")
}
}
}
}
dependencies {
...
}
複製代碼
上述代碼 主要修改地方 就是使用 gradle 語法讀取 local.properties文件,獲取其中信息,若是有就 簽名打包。這樣咱們就能夠保證 key文件的安全性了。
講完 簽名,咱們就須要來看 Walle 的配置和部分Gradle 相關操做。
打包更加快速傳統的經過productFlavors渠道包的方式,渠道10個之內還能夠接受,若是100個渠道包,要死人,而採用美團Walle多渠道打包的方式只須要打一個包的時間。 配置更加靈活能夠在APK渠道包中經過配置config文件,針對於不一樣渠道包配置各個渠道定製化額外信息。
整個APK(ZIP文件格式)會被分爲如下四個區塊:
Contents of ZIP entries(from offset 0 until the start of APK Signing Block) APK Signing Block ZIP Central Directory ZIP End of Central Directory
這個是V2簽名包的APK包格式,新的應用簽名方案有着良好的向後兼容性,能徹底兼容低於Android 7.0(Nougat)的版本。區塊一、三、4都是受保護區塊,不容許修改保護區塊。美團打包的方式,是在2區塊內寫入ID-value的擴展信息(渠道信息),並保存到APK中。這樣,每打一個渠道包只需複製一個APK,而後在APK中添加一個ID-value便可。
項目的根目錄 build.gradle 文件中添加Walle Gradle插件的依賴
classpath 'com.meituan.android.walle:plugin:1.1.6'
複製代碼
App的 build.gradle 文件中apply這個插件,並添加上用於讀取渠道號的AAR
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.6'
}
複製代碼
咱們單獨新建一個 gradle 用來保存配置插件 multlple-channel.gradle,內容以下
apply plugin: 'walle'
walle {
// 指定渠道包的輸出路徑
apkOutputFolder = new File("${project.buildDir}/outputs/channels")
// 定製渠道包的APK的文件名稱
apkFileNameFormat = '${appName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
複製代碼
部分配置解析
apkOutputFolder:指定渠道包的輸出路徑, 默認值爲new File(" {appName}- {channel}.apk
變量含義
projectName - 項目名字
appName - App模塊名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名稱 (對應渠道打包中的渠道名字)
versionName - versionName (顯示用的版本號)
versionCode - versionCode (內部版本號)
buildTime - buildTime (編譯構建日期時間)
fileSHA1 - fileSHA1 (最終APK文件的SHA1哈希值)
flavorName - 編譯構建 productFlavors 名
複製代碼
記得在添加完成後 必定要在app build.gradle 文件中引入
apply from: 'multlple-channel.gradle'
複製代碼
接下來配置 channelFile
meituan # 美團
samsungapps #三星
hiapk
anzhi
xiaomi # 小米
91com
gfan
appchina
nduoa
3gcn
mumayi
10086com
wostore
189store
lenovomm
hicloud
meizu
wandou
# Google Play
# googleplay
# 百度
baidu
#
# 360
360cn
#
# 應用寶
myapp
複製代碼
上述 市場平臺,讀者能夠自行刪減留下須要的,接下來咱們使用 Android Studio 進行打包
打包會經歷一段時間,等成功後,咱們打開 配置輸出地址 就能夠看到咱們須要的 各個渠道的安裝包了。