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 签名

相关文章
相关标签/搜索