android studio 如何利用build.buildgradle软件里的productFlavors动态切换代码

AndroidStudio工程中的build.gradle中的buildTypes、productFlavors的多构建、多渠道打包APK
buildTypes与productFlavors联合配置Module
buildTypes:构建类型,在Gradle组件中,默认提供”debug”、”release”两个配置,分别是调试与发布,在不同配置中我们可以对其进行设置,例如,当发布APP时,我们希望自己的APP发布到应用平台上不被别人给破解,所以我们需要在配置中写入minifyEnabled true来混淆我们的APP代码,然后在其中设置我们混淆的配置文件
buildTypes {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
proguard-android.txt是SDK中默认的混淆配置文件,proguard-rules.pro是项目中自带的自定义混淆配置文件
productFlavors:产品渠道,是不提供任何默认配置,在实际发布中,我们可以设置多个不同渠道,分别在其中写入配置、例如我现在有款产品,这款产品我们可以当外包的方式复制给其他公司,但是其他公司不可能所有的功能以及后台服务等信息和你一样,所以需要在产品渠道中设置相应的属性(QQ、后台Url等),这样就可以根据不同公司的情况设置不同的属性来打包出不同的apk文件
一般app的build.gradle
apply plugin: 'com.android.application'
compileSdkVersion 23
buildToolsVersion 23.0.3
publishNonDefault true
defaultConfig {
minSdkVersion 15
multiDexEnabled true
configurations {
releaseTest
buildTypes {
minifyEnabled false
shrinkResources false
innerTest {
minifyEnabled false
shrinkResources false
releaseTest {
minifyEnabled false
shrinkResources false
minifyEnabled false
shrinkResources false
productFlavors {
jianhang {
buildConfigField "String", "QQ", '"XXXXXXXXX"'
buildConfigField "String", "WEIXIN", '"XXXXXXXXXXXXXX"'
nonghang { …… }
shanghang { …… }
applicationVariants.all { variant-&
if(variant.flavorName.contains('jianhang')) {
else if(variant.buildType.name.equals('innerTest')) {
buildConfigField "String", "QQ", '"XXXXXXXXX"'
buildConfigField "String", "WEIXIN", '"XXXXXXXXXXXXXX"'
dependencies {
compile fileTree(include: '*.jar', dir: 'libs')
compile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
compile 'com.android.support:appcompat-v7:24.1.0'
compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
releaseCompile project(path: ':XXXXXXX', configuration: 'release')
debugCompile project(path: ':XXXXXXXX', configuration: 'debug')
innerTestCompile project(path: ':XXXXXXXX', configuration: 'innerTest')
releaseTestCompile project(path: ':XXXXXXXX', configuration: 'releaseTest')
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
在AndroidStudio中,我们可以通过Build Variants在其中设置,然后就可以根据不同的构建类型与产品渠道构建出不同的APK
build.gradle中buildTypes和productFlavors详解
Android Studio BuildType 构建类型
Android 自定义构建类型 BuildType
AndroidStudio下BuildTypes和ProductFlavors动态编译并重命名apk
Gradle Library项目的多渠道打包实现
利用Gradle的productFlavors使用应用多现场配置
android studio中productFlavors配置
Android Studio -使用 Gradle打包多版本APK——buildTypes和productFlavors
没有更多推荐了,拒绝访问 | www.colabug.com | 百度云加速
请打开cookies.
此网站 (www.colabug.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(43ee234a6b4643e9-ua98).
重新安装浏览器,或使用别的浏览器彩云为衣 清风为吟 明月为心 与天地同舞
Gradle中productFlavors的使用指南
我们都知道gradle非常强大,功能太多,今天就来给大家介绍下productFlavors的逆天用法。productFlavors通常是指同一软件的不同版本,比如收费版,免费版。这个版本的逻辑肯定是不一样的。
如果在使用gradle之前,可能需要比较头痛的写2套代码,但现在,完全可以在一套代码中解决。
比如,我们可以在gradle文件中定义两个flavor。
productFlavors {
applicationId "com.win16.myapplication2.free"
applicationId "com.win16.myapplication2.charge"
我这里做了点扩展,为不同的favors生成了不同的包名。
现在我们有了2个flavor。这时,我们需要在src下,建立两个文件夹,分别以这两个flavor命名。工程结构看起来是这样子的
分别在这两个目录下创建一些代码。比如:
在Free下,
* Created by Rex on .
* blog.csdn.net/zoudifei
* powered by Win16.com
public class Logic {
public void someFuction(Context context) {
Toast.makeText(context, "This is free version!",Toast.LENGTH_LONG).show();
在Charge下:
* Created by Rex on .
* blog.csdn.net/zoudifei
* powered by Win16.com
public class Logic {
public void someFuction(Context context) {
Toast.makeText(context, "This is charge version!",Toast.LENGTH_LONG).show();
这两个类的接口是相同的,区别是弹出来的Toast不相同。
然后,我们在main文件夹下使用这个类
new Logic().someFuction(this);
在BuildVarious中,选择chargeDebug
这时发现,在charge目录下面的Java变成了蓝色,这时,表示引用的是此目录下的文件。
其实不管是buildType或是productFlavor都可以用这种方式进行版本的差异化管理。
Android Studio -使用 Gradle打包多版本APK——buildTypes和productFlavors
Android gradle 中使用productFlavors
【Gradle】借助gradle的ProductFlavor实现多App间代码库复用
Gradle实现的两种简单的多渠道打包方法
build.gradle中buildTypes和productFlavors详解
Gradle系列第(三)篇---Android Studio与Gradle那些事儿
利用productFlavors实现一套代码打包多版本
利用Gradle的productFlavors使用应用多现场配置
使用gradle的productFlavors实现Android项目多渠道打包
Android Studio配置Gradle(包括signingConfigs、buildTypes和productFlavors等)
没有更多推荐了,Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道) - 简书
Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)
如果本文帮助到你,本人不胜荣幸,如果浪费了你的时间,本人深感抱歉。
希望用最简单的大白话来帮助那些像我一样的人。如果有什么错误,请一定指出,以免误导大家、也误导我。
本文来自:
感谢您的关注。
最近有个需求一次要打包9个类型的App,而且常量和String.xml都有变量。虽然之前也是一直存在变量,但是每次也仅仅只打包一个。这让我每次改变量,打包9个。要是以后每次都打包9次,我得疯了。
根据之前的了解,gradle 应该是可以解决这个问题的。所以就仔细研究了一番。
先放一个完整的 多渠道/多环境 打包的配置,然后再来讲解。
不同环境,不同包名;
不同环境,修改不同的 string.xml 资源文件;
不同环境,修改指定的常量;
不同环境,修改 AndroidManifest.xml 里渠道变量;
不同环境,引用不同的 module。
先放一个完整的配置,可以参考:
apply plugin: 'com.android.application'
compileSdkVersion 22
buildToolsVersion '22.0.1'
// 签名文件
signingConfigs {
keyAlias 'lyl'
keyPassword '123456'
storeFile file('../lyl.jks')
storePassword '123456'
// 默认配置
defaultConfig {
//applicationId "com.lyl.app"
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0.0"
signingConfig signingConfigs.config
multiDexEnabled true
// gradle 3.0.0 以上需要有这个
// flavorDimensions "app"
// 多渠道/多环境 的不同配置
productFlavors {
// gradle 3.0.0 以上需要有这个
// dimension "app"
// 每个环境包名不同
applicationId "com.lyl.dev"
// 动态添加 string.xml 字段;
// 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
resValue "string", "app_name", "dev_myapp"
resValue "bool", "isrRank", 'false'
// 动态修改 常量 字段
buildConfigField "String", "ENVIRONMENT", '"dev"'
// 修改 AndroidManifest.xml 里渠道变量
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "dev"]
// gradle 3.0.0 以上需要有这个
// dimension "app"
applicationId "com.lyl.stage"
resValue "string", "app_name", "stage_myapp"
resValue "bool", "isrRank", 'true'
buildConfigField "String", "ENVIRONMENT", '"stage"'
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "stage"]
// gradle 3.0.0 以上需要有这个
// dimension "app"
applicationId "com.lyl.prod"
resValue "string", "app_name", "myapp"
resValue "bool", "isrRank", 'true'
buildConfigField "String", "ENVIRONMENT", '"prod"'
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "prod"]
dexOptions {
incremental true
// javaMaxHeapSize "4g"
//移除lint检测的error
lintOptions {
abortOnError false
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
buildTypes {
signingConfig signingConfigs.config
buildConfigField("boolean", "LOG_DEBUG", "false")
minifyEnabled false
zipAlignEnabled true
//移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
// 批量打包(gradle 3.0.0 以下)
applicationVariants.all { variant -&
variant.outputs.each { output -&
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//输出apk名称为:渠道名_版本名_时间.apk
def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName)
// 批量打包(gradle 3.0.0 以上)
// android.applicationVariants.all { variant -&
// variant.outputs.all {
outputFileName = // "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk"
repositories {
mavenCentral()
dependencies {
compile 'com.facebook.android:facebook-android-sdk:4.0.0'
compile project(':qrscan')
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.google.code.gson:gson:2.3'
compile files('libs/android-async-http-1.4.6.jar')
compile 'com.google.android.gms:play-services:7.5.0'
compile 'com.android.support:support-annotations:22.1.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'de.hdodenhof:circleimageview:2.1.0'
接下来我们来详细看看修改特定的字段。
不同环境的设置基本都是在 productFlavors 里设置的,
而且在里面你想添加多少个环境都可以。
1. 不同环境,不同包名;
productFlavors {
applicationId "com.lyl.dev"
applicationId "com.lyl.stage"
applicationId "com.lyl.prod"
这里注意,在 defaultConfig 中,大家应该都是写了个默认的 applicationId 的。
经测试,productFlavors 设置的不同环境包名会覆盖 defaultConfig 里面的设置,
所以我们可以推测,它执行的顺序应该是先执行默认的,然后在执行分渠道的,如果冲突,会覆盖处理,这也很符合逻辑。
2. 不同环境,添加 string.xml 资源文件;
利用 resValue 来定义资源的值,顾名思义 res 底下的内容应该都可以创建,最后用 R.xxx.xxx 来引用。
如下就根据不同的类型,添加了不同的 app_name 字段,以及定义了 布尔值,可以通过 R.string.app_name 来引用。
注意,这里是添加,是在 string.xml 里面添加了一个字段app_name,所以在现有的 string.xml 中不能有这个字段,否则会报错!!!
productFlavors {
resValue "string", "app_name", "dev_myapp"
resValue "bool", "isrRank", 'false'
resValue "string", "app_name", "stage_myapp"
resValue "bool", "isrRank", 'true'
resValue "string", "app_name", "myapp"
resValue "bool", "isrRank", 'true'
通过以上我们大概可以推测出 color、dimen 也可以通过类似的方法添加。
3. 不同环境,动态修改指定的常量;
使用 BuildConfig 的变量。
①定义字段
当我们定义如下字段之后,编译后自动生成文件,在 app/build/source/BuildConfig/dev/com.lyl.dev/BuildConfig 目录,
打开这个文件,我们就能看到我们所定义的字段了。
productFlavors {
buildConfigField "String", "ENVIRONMENT", '"dev"'
buildConfigField "String", "ENVIRONMENT", '"stage"'
buildConfigField "String", "ENVIRONMENT", '"prod"'
②引用字段
在我们自己的任意的类中,来直接通过 BuildConfig 就可以调用我们定义的字段。
public class Constants {
public static final String ENVIRONMENT = BuildConfig.ENVIRONMENT;
注意:这里有个小细节,看其中第三个参数,是先用了“'”,然后在用了“"”,这种语法在 Java 里可能比较陌生,但是在很多其他语言中,这种用法是很常见的。
它的意思是 "dev" 这个整体是属于一个字符串,至于为什么要这么写,你把单引号去掉,然后去 app/build/source/BuildConfig/dev/com.lyl.dev/BuildConfig 这个文件看一看就知道了。
4. 不同环境,修改 AndroidManifest.xml 里渠道变量
①在 AndroidManifest.xml 里添加渠道变量
&application
android:icon="${app_icon}"
android:label="@string/app_name"
android:theme="@style/AppTheme"&
&meta-data
android:name="UMENG_CHANNEL"
android:value="${ENVIRONMENT}" /&
&/application&
②在 build.gradle 设置 productFlavors
productFlavors {
manifestPlaceholders = [ENVIRONMENT: "dev",
: "@drawable/icon_dev"]
manifestPlaceholders = [ENVIRONMENT: "stage",
: "@drawable/icon_stage"]
manifestPlaceholders = [ENVIRONMENT: "prod",
: "@drawable/icon_prod"]
这样我们可以在不同环境使用不同的 key 值。
5. 不同环境,引用不同的 module
这个就很强大了,根据不同的环境,引用对应的 module。
你可以替换大量的图片,string,color,vaule等等。
首先,要建立跟渠道对应的 module,然后再引用。
引用方式如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// 引用本的项目
devCompile project(':devModule')
stageCompile project(':stageModule')
prodCompile project(':prodModule')
// 也可以分渠道引用网络的。因为这里都相同,所以地址也就都一样了
devCompile 'com.roughike:bottom-bar:2.0.2'
stageCompile 'com.roughike:bottom-bar:2.0.2'
prodCompile 'com.roughike:bottom-bar:2.0.2'
xxxCompile 代表 各个渠道的名称。
然后把需要分渠道的文件,放到不同的 module 里面,把主项目的文件删掉。
千万注意:如果这样做了,每次需要引用的时候,在各个渠道的 module 里面都必须要放置文件哦,不然会找不到资源。
通过这种方式可以替换整套素材资源,具体如何使用还得看项目需求。
通过以上方式,我们基本可以 通过 gradle 动态设定应用标题,应用图标,替换常量,设置不同包名,更改渠道等等。
最后,做完所有的配置之后,然后就是打包操作了。
打包某一个(日常编译)
因为 buildTypes 里面有两种,所以每个渠道都会有两种模式。
打包所有的,就是正常打包流程
如图所示:
图片来源网络
图片来源网络
打包完成之后,然后就可以在我们指定的目录下,看到我们所生成的apk包。
使用 local.properties 存放私密配置
以上就可以基本实现 gradle 的设置,但是如果我们要将我们的项目上传到 Github ,或者要将项目发送给别人。上面有些私密的东西就会被别人看到。比如:.jks 文件的密码。
在项目跟目录下,有个 local.properties 文件,我们可以使用它来存放一些私密的属性,然后在 gradle 中读取,而 local.properties 文件不需要上传。
local.properties 文件里设置如下:
sdk.dir=D\:\\Android\\android-sdk
gaodeKey=e4d1c347dd
keyPassword=123456
在 build.gradle 读取 local.properties 字段信息
// 加载 local.properties 资源
Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream() ;
properties.load( inputStream )
// 签名文件
signingConfigs {
keyAlias 'lyl'
// 获取 local.properties 字段信息
keyPassword properties.getProperty( 'keyPassword' )
storeFile file('../lyl.jks')
storePassword properties.getProperty( 'keyPassword' )
这样就可以将自己想要隐藏的一些数据隐藏起来。
可能加快 Android Studio 编译的办法
1. 在根目录的 build.gradle 里加上如下代码:
allprojects {
// 加上这个
tasks.withType(JavaCompile) {
//使在一个单独的守护进程编译
options.fork = true
//增量编译
options.incremental = true
repositories {
2. 在 app 级别下 build.gradle 里 加上
dexOptions {
incremental true
最后放上一个多渠道的项目地址,可以参考:
如果本文有什么问题,请一定指出。
一个有文艺情怀的程序员。
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险;如何批量修改生成的apk文件名,这样我们就可以修改成我们需要的,从文件名中就可以看到渠道,版本号以及生成日期等信息,这多方便啊;还有其他突破65535方法的限...
本文原作者为:kale2010 .blog地址:http://www.cnblogs.com/tianzhijiexian/微博:https://weibo.com/shark0017 Gradle技巧 全局配置 Android工程的每个module都有一个自己私有的bui...
Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details带目录浏览地址:http://www.maoyupeng.com/sprin...
对我来说 人生最大的幸运 是在花开的季节 遇到如花的你 恰是阳光正好 恰是心扉敞开 你唱歌时恬静的样子 你唱歌时空灵的声音 如同刻刀雕琢顽石般的刻在灵魂 如同醍醐灌顶般的闷进胸腔血液 在余生里 都是那双软软的眼睛
我们说的这个故事,从很久很久以前开始……嘿嘿,大家不要误会,没有几百年那么久啦,不过十几年前而已。 那是猫猫和微微的第一次相见,现在想起来,依然历历在目,充满动感和活力。 “貌貌。” “猫猫?” “貌貌!” “猫猫。” “是貌貌!不是猫猫!!!” “猫猫……” “砰!”微微...
下面介绍些微信开发者常使用的代码大全吧!收藏 1 getfpkey 得到手机基本信息 2 pickpoi 定位当前位置 3 fullexit 完全退出微信 4 sightinfo 打开查看小视频参数(以后你小视频的时候就都显示了) 5 traceroute 打开诊断网络 6...
子曰:“学而不思则罔,思而不学则殆” 何解? 意思是一味读书而不思考,就会因为不能深刻理解书本的意义而不能合理有效利用书本的知识,甚至会陷入迷茫,也就是我们日常所说的书呆子;而反过来,如果一味空想而不去进行实实在在地学习和钻研,则终究是沙上建塔,一无所得。 自从订阅了李笑来...
第25天 这本书的这一章一开始就讲如果控制主板上的蜂鸣发专声器发声,看到这个我很兴奋。因为到目前为止我还没有用windows api或者自己写程序让电脑发出声音,终于可以尝试一下了,虽然不是声卡发声,只是最低级的蜂鸣发声器,但是还是很兴奋。 我们控制主板上的发声器也和控制中...  最近一年来的工作最让我深有感悟的就是测试动不动就是问我要测试包,弄的我实在是叫苦不堪。今天正好有个工作空档期,也有些意外看到过些类似的博文,正好在这个工作空档期实现了Window上跑Gradle脚本自动构建Android项目。
  首先,开发环境:
    系统:Win7
    Gradle版本:4.2
    Android Studio: 2.2.2
  关于Gradle下android{}的配置字段说明如下:
    defaultConfig{} 默认配置,是ProductFlavor类型。它共享给其他ProductFlavor使用    sourceSets{ } 源文件目录设置,是AndroidSourceSet类型。    buildTypes{ } BuildType类型    signingConfigs{ } 签名配置,SigningConfig类型    productFlavors{ } 产品风格配置,ProductFlavor类型    testOptions{ } 测试配置,TestOptions类型    aaptOptions{ } aapt配置,AaptOptions类型    lintOptions{ } lint配置,LintOptions类型    dexOptions{ } dex配置,DexOptions类型    compileOptions{ } 编译配置,CompileOptions类型    packagingOptions{ } PackagingOptions类型    jacoco{ } JacocoExtension类型。 用于设定 jacoco版本    splits{ } Splits类型
  脚本构建工作如下:
    关于Gradle配置编译Apk相关签名如下:  
signingConfigs {
storeFile file('E:\Gsafty\keystoreName.keystore') //绝对路径
storePassword ""
keyAlias "alias"
keyPassword ""
  构建类型(开发过程中会不断的提交测试debug包到测试人员去测试)
    如下代码仅做参考:
buildTypes {
minifyEnabled false
shrinkResources false
zipAlignEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
minifyEnabled false
shrinkResources false
zipAlignEnabled false
minifyEnabled false
shrinkResources false
zipAlignEnabled false
sourceSets {
jni.srcDirs = []
  多渠道打包构建不同渠道的多个类型apk
    这里不同的渠道会根据构建类型生成对应的apk,其对应关系为渠道种类数*构建编译类型数等于编译出的APK数。
/*多渠道包*/
productFlavors{
applicationId "com.domin.armn"
versionCode "1.0"
versionName "1.2.0"
manifestPlaceholders = [appName: "tencent"]
applicationId "com.domin.armn"
versionCode "1.0"
versionName "1.2.0"
manifestPlaceholders = [appName: "baidu"]
  自定义生成的APK包名称
    例如:module_flavor-version-time-buildtype.apk 
    在APP下的build.gradle根目录下声明如下:
//获取当前时间
def getCurrentTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
    在Android{}目录下声明如下:  
/*apk重命名*/
android.applicationVariants.all { variant -&
variant.outputs.each { output -&
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def buildType = variant.buildType.name
//这里修改apk文件名,格式为 module_flavor-version-time-buildtype.apk
def fileName = "Gsafety_${variant.productFlavors[0].name}-V${defaultConfig.versionName}-${getCurrentTime()}-${buildType}.apk"
output.outputFile = new File(outputFile.parent, fileName)
  进阶配置项
    以上所有的设置尚且不能够完全满足自动化编译,仍然需要用户手动输入命令去运行编译APK包,这当然不是我们最想要的结果。
    Gradle执行相关命令如下:     
      注:在使用编译命令之前请确保gradle已经加入环境变量,如果没加入可以通过./gradlew替代gradle(只能在项目根目录下使用)
      1编译所有productFlavor及对应所有buildType的apk.        $gradle assemble&&&//仅仅执行项目打包所必须的任务集        $gradle build&& & & & &&//执行项目打包所必须的任务集,以及执行自动化测试,所以会较慢        如果当前Project包含多个Module,在Project根目录执行gradle assemble会编译所有的Module      2编译指定productFlavor及buildType的apk        $gradle assemble[productFlavor][buildType]        如果缺失某参数,则会把该参数的所有配置都进行编译,即如果运行gradle assembleflavor,则会编译出flavor所有buildType的apk        例如:          $gradle assemble          $gradle assembleflavorRelease&          $gradle assembleflavorDebug        注:gradle支持命令缩写,上面两个命令也可以写成如下格式          $gradle a          $gradle ass          $gradle aR          $gradle assflavorR          $gradle aD          $gradle assflavorD
    在项目根目录下创建一个指定的文件夹(用于编译跑脚本用),例如.config,然后在该目录下分辨创建.bat文件(win7上批处理后缀文件)和签名文件
      批处理文件如下build.bat:
      注意:这里可能会在CMD窗口出现中文乱码,这是由于便于问题,不会影响编译。
#快速编译打包apk脚本
" **************************打包开始 ************************** "
#执行打包命令前,需要先定位到项目根目录
#执行打包命令
echo -e "**************************打包完成************************** "
#桌面右上角弹出通知
notify-send build.sh "打包完成!"
      创建签名文件sign.txt:
      签名文件之所以放到外边这里是为了更好的保护签名文件,尽量少的给其他人知道&安全考虑&。
signingConfigs {
storeFile file('E:\Gsafty\keystoreName.keystore') //绝对路径
storePassword ""
keyAlias "alias"
keyPassword ""
     将签名文件应用到app的build.gradle文件下的android{}:
//加载签名信息
File configFile = file('../.config/sign.txt')
if (configFile.exists()) {
def signGradlePath = configFile.newReader().readLine().trim()
println 'lucher, path:' + signGradlePath
if (file(signGradlePath).exists()) {
apply from: signGradlePath
   最后就是开发人员的福利了,在window机器上直接点击.bat文件执行批处理命令,即可在项目build目录下的apk目录下得到对应的apk包.
阅读(...) 评论()}

我要回帖

更多关于 手机美化build.gradle 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信