往往有時候會有打包多套App的需求,而這多個App的logo,啟動頁,引導頁,applicationId,第三方分享key都不一樣。放在以往我們的的做法往往使用多套代碼進行修改之后再打包,費時費力,后來通過gradle可以輕松完成這個過程,打包也變得很簡單。
gradle是一個基于Apache Ant和Apache Maven概念的項目自動化建構工具。他可以幫助我們輕松實現多渠道打包的功能,在這里我用多環境打包演示一下,因為多環境其實和多渠道一樣的道理。
項目目錄如下:
項目的gradle文件如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
ext {
// Sdk and tools
minSdkVersion = 15
targetSdkVersion = 24
compileSdkVersion = 24
buildToolsVersion = '24.0.1'
versionCode=350
versionName='3.5.0'
//package
applicationId='com.test'
// App dependencies
}
App下的gradle文件
apply plugin: 'com.android.application'
//獲取打包時間
def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
//獲取local.properties的內容
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
multiDexEnabled true
applicationId rootProject.ext.applicationId
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
}
//添加簽名文件
signingConfigs{
debug{}
release{
//為了保護簽名文件,把它放在local.properties中并在版本庫中排除
//不把這些信息寫入到版本庫中(注意,此種方式簽名文件中不能有中文)
storeFile file(properties.getProperty("keystroe_storeFile"))
storePassword properties.getProperty("keystroe_storePassword")
keyAlias properties.getProperty("keystroe_keyAlias")
keyPassword properties.getProperty("keystroe_keyPassword")
注:這種方案并不是唯一方案,也可以采用直接在這里寫死 但推薦以上方式。
}
}
buildTypes {
release {
//允許混淆代碼
minifyEnabled true
//打包過濾掉未引用資源文件
shrinkResources true
//引用混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//設置打包簽名
signingConfig signingConfigs.release
//批量修改打包之后的命名規則
applicationVariants.all{ variants ->
variants.outputs.each{ output ->
def outFile=output.outputFile
if (outFile!=null && outFile.name.endsWith(".apk"))
{
def fileName="diankeyuan_"+"${variants.productFlavors[0].name}"+"_V"+"${defaultConfig.versionName}"+"_${releaseTime()}"+".apk"
output.outputFile=new File(outFile.parent,fileName);
}
}
}
}
}
sourceSets {
main {
aidl.srcDirs = ['src/main/java']
jniLibs.srcDirs = ['libs']
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['assets']
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
allprojects {
repositories {
mavenCentral()
}
}
//測試環境 預生產環境 生產環境
productFlavors{
mtesting{
manifestPlaceholders = [app_name: "@string/app_name"]
}
preing{
manifestPlaceholders = [app_name: "@string/app_name"]
}
normal{
manifestPlaceholders = [app_name: "@string/app_name"]
}
}
//在項目src目錄下,建了mtesting,preing,normal目錄,注意都在java目錄下并且包名要一樣,在項目代碼
//里 可以如下引用:
**
* 參數拼接,沒有.do
*
* @param action
* @return
*/
// private String getUrlString(String action) {
// if (!action.equals("")) {
// return Api.baseurl + action;
// }
// return Api.baseurl + "/";
// }
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
}
local.properties文件
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Mon Oct 17 09:15:05 CST 2016
sdk.dir=/Users/luo_mac/Library/Android/sdk
#對應自己實際的證書路徑和名字,在這里由于簽名文件是放在app目錄下,因為沒有寫絕對路徑。
keystroe_storeFile=chuangke.key
keystroe_storePassword=123456
keystroe_keyAlias=chuangke
keystroe_keyPassword=123456
看完build.gradle和local.properties的具體內容之后,我們再來挑選幾個地方來具體說一下。
一. signingConfigs
在signingConfigs中主要是為打包配置簽名文件具體信息的,第一種方式把簽名文件的位置,storePassword ,keyAlias,keyPassword 等具體內容都直接寫在其中,然后使用gradle進行打包,第二種是通過通過使用local.properties文件來間接加載簽名文件的具體信息。一般我們更傾向于第二種方法,這樣有助于保護我們的簽名文件(在local.properties中不能有中文)。
二. productFlavors
不同渠道的設置基本都是在 productFlavors 里設置的,在里面想要添加多少個渠道都可以。
不同渠道app名稱
manifestPlaceholders = [app_name: "@string/app_name"]
也可以修改app名稱,通過resValue 我們可以在在 string.xml 里面添加了一個新的字段app_name,由于是添加,所以原來的string.xml 文件中不能存在app_name字段,否則會報錯。
當然我們還可以添加布爾類型,還可以為color.xml、dimen.xml添加一些我們需要的字段。
修改app圖標
當我們在productFlavors 中添加了不同渠道環境名稱之后,我們還可以mian文件夾同層級中建立渠道對應的文件夾,并放入特定的圖標文件,當然我們還可以放入其他資源文件,甚至AndroidManifest.xml都可以放入,Gradle在構建應用時,會優先使用flavor所屬dataSet中的同名資源。所以,在flavor的dataSet中添加同名的資源文件,會覆蓋默認的資源文件,這樣就能達到不同環境不同軟件圖標的功能。
另外我們在添加簽名之后,便可以直接使用命令打出不同渠道的apk包 ,命令是:
./gradlew assembleRelease
在使用這個命令時候,第一次也許會報一個-bash: ./gradlew: Permission denied的錯誤,可先使用如下命令
chmod +x gradlew
就可以編譯出你想要的Apk包了,希望能幫到此時的你?。?!