今天的越写悦快乐系列文章为大家带来Android应用如何使用Walle进行渠道打包。我们知道在中国大陆境内的Android分发渠道数不胜数,而如何进行渠道打包,把等待上架应用商店的应用进行打包是一件繁琐而且容错出错的事情,那么我们是不是可以借助现成的打包工具替我们完成这样的工作呢?今天我为大家介绍一款渠道打包的工具Walle,它可以快速为我们生成应用商店的包,节省我们的打包时间。
开发环境
- Window 10.0.17763
- Java 8.0.191
- Android Studio 3.3.2
Gradle 版本
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
Build 版本
dependencies {
classpath "com.android.tools.build:gradle:3.2.1"
}
App签名
要进行App打包,需要我们先进行App签名,那么如何给App进行签名呢?目前有两种方法可以生成App签名:
- 使用Android Studio进行签名
- 使用KeyTool命令行进行签名
创建项目
创建项目的步骤我就不多说了,聪明的你肯定能搞定的......
签名
切换到项目窗口后,点击Build -> Generate Signed Bundle / APK ...
,弹出签名窗口,选择APK
签名后点击下一步
随后我们根据提示新建(Create new...)或者选择已经存在(Choose existing...)的签名文件
此时我们选择创建新的签名,那么会弹出一个窗口,输入必要的Key Store Path、Password、Alias、Password和Certificate(至少输入一项)。
点击OK按钮后,Android Studio会把签名信息写入app/build.gradle
文件中,此时我们的第一步工作App签名就大功告成了。
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "me.weitao.packfile"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
sign {
storeFile file('path/release.keystore')
storePassword 'password'
keyAlias 'alias'
keyPassword "password"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.sign
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.sign
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
App单独打包
完成了第一步的签名工作,那么对于App的打包那就很简单了,还是选择Build -> Generate Signed Bundle / APK ...
,选择APK方式进行签名,随后选择上一步创建的签名文件,输入密码和别名后,点击下一步。
选择输出路径、构建类型和签名版本V2后,点击完成,等待打包结果。
等待一会儿,我们会在app/release
目录下看的生成的apk文件,那么对于单独打包的工作我们就愉快地完成了。
使用Walle进行渠道打包
添加依赖
1)我们需要在根项目的build.gradle
文件中添加classpath项
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'com.meituan.android.walle:plugin:1.1.6'
}
ext {
// Sdk and Tools
minSdkVersion = 21
targetSdkVersion = 28
compileSdkVersion = 28
buildToolsVersion = '28.0.3'
// Testing Dependencies
junitVersion = '4.12'
runnerVersion = '1.0.2'
espressoVersion = '3.0.2'
}
}
- 需要在模块的
build.gradle
文件中添加插件并依赖library
apply plugin: 'com.android.application'
apply plugin: 'walle'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "me.weitao.packfile"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
sign {
storeFile file('path/release.keystore')
storePassword 'password'
keyAlias 'alias'
keyPassword "password"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.sign
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.sign
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.meituan.android.walle:library:1.1.6'
testImplementation 'junit:junit:' + rootProject.ext.junitVersion
androidTestImplementation 'com.android.support.test:runner:' + rootProject.ext.runnerVersion
androidTestImplementation 'com.android.support.test.espresso:espresso-core:' + rootProject.ext.espressoVersion
}
打包配置
最后,在app/build.gradle
文件中配置Walle。
walle {
// 指定渠道包的输出路径
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名称
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
获取渠道文件
我们可以从这里复制过来放在
channel
文件中,上一步的配置渠道文件的原因就在于读取这个渠道文件。
APK打包
配置完成后,我们点击Android Studio的Gradle
窗口,可以从模块app
下的任务类别中找到打包的选项,点击assembleDebugChannels
或者 assembleReleaseChannels
进行渠道打包。
当然我们也可以在命令行执行gradlew clean assembleReleaseChannels
进行打包。
参考
个人总结及感想
很庆幸自己有时间总结和整理这篇文章,通过梳理和思考让我们对App签名、App打包和渠道打包有了更加直观的认识和理解,当然我们也可以使用其他方式进行渠道打包,这篇文章使用的Walle进行渠道打包只是引子,更多的底层打包Tasks我会抽时间为大家分享,那么接下来我会为大家分享如何使用命令行生成App签名指纹,敬请期待我的下一篇文章,也希望大家一直保持学习的热情,探索技术进步给我们带来的改变。若是我的文章对你有所启发,那将是我莫大的荣幸。