Android Studio 簽名配置及使用Walle實現多渠道打包

本篇博客 主要爲本人學習過程總結,有不對的地方麻煩指出,一塊兒學習進步html

前言android

最近也是搞到了一個 電子書 《Android+Gradle權威指南》,學習一波Gradle 知識,嘗試配置簽名設置和配置Walle實現多渠道打包。閱讀時間:15分鐘git

簽名

視圖方式

  咱們即可以經過點擊左上角的Build->Generate Signed APK->Next,若是沒有jks 文件,則須要本身建立,而後選擇對應的Build Type進行打包。github

  對於部分不用上架的App來講,這波操做還能夠接受,可是若是須要上傳到國內的各個平臺則須要屢次重複這個操做,能把人搞死...,經過這篇文章能夠學到 Gradle 簽名配置 及 Walle 配置實習 多渠道打包。安全

Gradle 配置簽名

  咱們先來看一下新建的項目 默認的 app gradle文件默認主要配置以下, app gradle文件默認主要配置markdown

  1. 準備工做

首先將咱們生成好的 jks文件放到project 目錄下 project目錄app

  1. 修改 app build.gradle
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.
  1. 打包Release apk 包

  咱們在項目路徑下的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 相關操做。

Walle 打包

爲何使用 美團多渠道打包

  打包更加快速傳統的經過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便可。

walle 配置

項目的根目錄 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(" p r o j e c t . b u i l d D i r / o u t p u t s / a p k " ) a p k F i l e N a m e F o r m a t :定製渠道包的 A P K 的文件名稱 , 默認值爲 {project.buildDir}/outputs/apk") apkFileNameFormat:定製渠道包的APK的文件名稱, 默認值爲 {appName}- b u i l d T y p e {buildType}- {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 進行打包 在這裏插入圖片描述

打包會經歷一段時間,等成功後,咱們打開 配置輸出地址 在這裏插入圖片描述 就能夠看到咱們須要的 各個渠道的安裝包了。

參考博客: Walle github Android studio 簽名

相關文章
相關標籤/搜索