构建配置 defaultConfig signingConfigs buildTypes productFlavors dependencies


project 目录的 build.gradle 文件

// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config/config_dependencies.gradle"
apply from: "config/config_android.gradle" //后面引用的 gradle 配置中的属性会覆盖掉前面引用的配置中的属性

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
x
1
// Top-level build file where you can add configuration options common to all sub-projects/modules.
2
apply from: "config/config_dependencies.gradle"
3
apply from: "config/config_android.gradle" //后面引用的 gradle 配置中的属性会覆盖掉前面引用的配置中的属性
4
5
buildscript {
6
7
    repositories {
8
        google()
9
        jcenter()
10
    }
11
    dependencies {
12
        classpath 'com.android.tools.build:gradle:3.1.3'
13
    }
14
}
15
16
allprojects {
17
    repositories {
18
        google()
19
        jcenter()
20
    }
21
}
22
23
task clean(type: Delete) {
24
    delete rootProject.buildDir
25
}
实际自定义的部分只有最上面的那两行

自定义的两个 .gradle 文件

config_android.gradle
//作用:对所依赖的系统版本、第三方库版本等进行统一的管理。
// 注意:每一个此类型的文件必须包含一个根节点ext,且ext下必须包含一个属性android,除此之外可以随意定义其他属性或方法
ext {
    android = [compileSdkVersion: 26,
               buildToolsVersion: "27.0.3",
               minSdkVersion    : 14,
               targetSdkVersion : 22,
               versionName      : getGitBranch() + "_" + getGitTag() + "_" + getGitSHA(), //根据git信息生成版本名
               versionCode      : getGitCommitCount(),  //根据git提交次数生成版本号
    ]
}

//获取Git 分支名,参考 https://blog.csdn.net/ouyang_peng/article/details/77802596
static def getGitBranch() {
    return 'git symbolic-ref --short -q HEAD'.execute().text.trim() //例如 master
}

//获取Git Tag
def getGitTag() {
    return 'git describe --tags'.execute([], project.rootDir).text.trim() //例如 bqt20094
    //注意,如果没有设置 tag 的话结果为:fatal: No names found, cannot describe anything.
}

//获取Git 版本号
static def getGitSHA() {
    return 'git rev-parse --short HEAD'.execute().text.trim()  //例如 3d5851e
}

//获取Git 提交次数
static def getGitCommitCount() {
    return 'git rev-list --count HEAD'.execute().text.trim().toInteger() //例如 8
}
32
1
//作用:对所依赖的系统版本、第三方库版本等进行统一的管理。
2
// 注意:每一个此类型的文件必须包含一个根节点ext,且ext下必须包含一个属性android,除此之外可以随意定义其他属性或方法
3
ext {
4
    android = [compileSdkVersion: 26,
5
               buildToolsVersion: "27.0.3",
6
               minSdkVersion    : 14,
7
               targetSdkVersion : 22,
8
               versionName      : getGitBranch() + "_" + getGitTag() + "_" + getGitSHA(), //根据git信息生成版本名
9
               versionCode      : getGitCommitCount(),  //根据git提交次数生成版本号
10
    ]
11
}
12
13
//获取Git 分支名,参考 https://blog.csdn.net/ouyang_peng/article/details/77802596
14
static def getGitBranch() {
15
    return 'git symbolic-ref --short -q HEAD'.execute().text.trim() //例如 master
16
}
17
18
//获取Git Tag
19
def getGitTag() {
20
    return 'git describe --tags'.execute([], project.rootDir).text.trim() //例如 bqt20094
21
    //注意,如果没有设置 tag 的话结果为:fatal: No names found, cannot describe anything.
22
}
23
24
//获取Git 版本号
25
static def getGitSHA() {
26
    return 'git rev-parse --short HEAD'.execute().text.trim()  //例如 3d5851e
27
}
28
29
//获取Git 提交次数
30
static def getGitCommitCount() {
31
    return 'git rev-list --count HEAD'.execute().text.trim().toInteger() //例如 8
32
}
config_dependencies.gradle
//作用:对所依赖的系统版本、第三方库版本等进行统一的管理。
// 注意:每一个此类型的文件必须包含一个根节点ext,且ext下必须包含一个属性android,除此之外可以随意定义其他属性或方法
ext {
    android = [] //因为后面引用的 gradle 配置中的属性会覆盖掉前面引用的配置中的属性,所以不应该在这里操作任何 android 属性的成员


    version = [
            support_v7: "27.1.1",
            gson      : "2.6.2", // gson
    ]

    dependencies = [
            "support_v7": "com.android.support:appcompat-v7:${version["support_v7"]}", // android  support v7 library
            "gson"      : "com.google.code.gson:gson:${version["gson"]}", // gson
    ]
}
16
1
//作用:对所依赖的系统版本、第三方库版本等进行统一的管理。
2
// 注意:每一个此类型的文件必须包含一个根节点ext,且ext下必须包含一个属性android,除此之外可以随意定义其他属性或方法
3
ext {
4
    android = [] //因为后面引用的 gradle 配置中的属性会覆盖掉前面引用的配置中的属性,所以不应该在这里操作任何 android 属性的成员
5
6
7
    version = [
8
            support_v7: "27.1.1",
9
            gson      : "2.6.2", // gson
10
    ]
11
12
    dependencies = [
13
            "support_v7": "com.android.support:appcompat-v7:${version["support_v7"]}", // android  support v7 library
14
            "gson"      : "com.google.code.gson:gson:${version["gson"]}", // gson
15
    ]
16
}

app 目录的 build.gradle 文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion rootProject.ext.android["compileSdkVersion"]
    buildToolsVersion rootProject.ext.android["buildToolsVersion"]

    //*******************************************************************************************************************************
    //                                                          【defaultConfig】
    //*******************************************************************************************************************************
    defaultConfig {
        applicationId "com.bqt.test"
        minSdkVersion rootProject.ext.android["minSdkVersion"]
        targetSdkVersion rootProject.ext.android["targetSdkVersion"]
        versionName rootProject.ext.android["versionName"]
        versionCode rootProject.ext.android["versionCode"]

        flavorDimensions "bqt" //必须带上一个 flavorDimensions[维度、尺寸],值可以随意
        testInstrumentationRunner "android.support.com.bqt.test.runner.AndroidJUnitRunner"
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

        // 放在这里可以在任何地方获取到。key可以不必用引号括起来,但是字符串类型的值必须使用【'"】和【"'】括起来才可以
        // 否则,值最匹配什么类型就是什么类型。比如【"1"】和【"@drawable/icon"】是int类型,而【'"1"'】才代表字符串类型
        manifestPlaceholders = [release_time_value: new Date().format("yyyy-MM-dd HH:mm:ss E", TimeZone.getDefault())]
    }

    //*******************************************************************************************************************************
    //                                                          【signingConfigs】
    //*******************************************************************************************************************************
    signingConfigs { //配置签名信息,例如各个不同产品的签名文件位置、密码、昵称、昵称密码等,要放在 buildTypes 上面配置
        beakeystore { //除了默认的 debug 签名外,signingConfigs 中的其他签名必须完整的配置签名相关的信息
            storeFile file('../config/bea.keystore')
            storePassword 'beachinambk'
            keyAlias 'bea.keystore'
            keyPassword 'beachinambk'

            v2SigningEnabled true
        }

        debug { //默认的 debug 签名,不需要指定签名信息
            v2SigningEnabled true
        }

        beakeystore2.initWith(beakeystore)
        beakeystore2 {
            storeFile file('../config/bea2.keystore')
        }
    }

    //*******************************************************************************************************************************
    //                                                           【buildTypes】
    //*******************************************************************************************************************************
    buildTypes { // 用于区分正式包和debug包。默认正式签名时就会走release脚本,调试签名时会走debug脚本
        release {
            debuggable false //是否可调试。debug模式默认为true,release模式默认是false
            zipAlignEnabled true// 是否启用Zipalign优化,对齐app所有资源。因为对齐处理发生在签名之后,所以启用时必须指定了签名信息
            shrinkResources true// 在构建时是否自动移除无用的资源以减小apk包的大小(包括图片,布局,菜单等,但不包括value资源文件)

            minifyEnabled true //是否启用混淆。debug与release的默认值都为false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //配置混淆文件所在路径
            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
            consumerProguardFiles 'consumer-proguard-rules.pro'

            signingConfig signingConfigs.beakeystore2 //使用自己配置的签名信息

            manifestPlaceholders = [baidu_map_key_value: "20094"]  //注意,这里的值用双引号括起来并不代表其就是String类型
            buildConfigField "String", "BASE_URL", '"http://110.com/"' //自定义属性,可以在 BuildConfig 中获取设置的值
        }

        debug {
            signingConfig signingConfigs.debug  //使用默认的 debug 签名,即使不配置,也是使用的此默认签名

            manifestPlaceholders = [baidu_map_key_value: "10086"]  //注意,这里的值用双引号括起来并不代表其就是String类型
            buildConfigField "String", "BASE_URL", '"http://120.com/"' //自定义属性,可以在 BuildConfig 中获取设置的值
        }

        pre.initWith(release) //initWith的作用是:拷贝指定构建类型 release 中的所有变量到 pre,然后gradle就会自动生成新的task
        pre { //预发布版本,该版本除了下面指定的配置与release版本不同外,其他都与release相同
            debuggable true
        }
    }

    //*******************************************************************************************************************************
    //                                                      【productFlavors】
    //*******************************************************************************************************************************
    productFlavors { //用于为不同的产品分配专有属性;构建基于同一份代码的不同Android项目有差异的部分;多渠道打包
        productA {  //新建产品productA,在defaultConfig的基础上做修改
            applicationId "com.bqt.test.productA"  // defaultConfig 中可以设置的这里基本也都可以设置

            resValue "string", "app_icon_name", "产品A" //替换掉指定的资源文件,比如应用名

            buildConfigField "boolean", "isHongkongUser", "true"//自定义属性,可以在 BuildConfig 中获取设置的值
            buildConfigField "int", "countryCode", "20094"//自定义属性,可以在 BuildConfig 中获取设置的值

            manifestPlaceholders = [app_logo         : "@drawable/icon",//用于替换清单文件中的标签,比如应用logo,多渠道信息
                                    app_channel_value: "小米应用市场",
            ]
        }

        productB {  //新建产品productB
            applicationIdSuffix ".productB" //在defaultConfig中默认applicationId的基础上在后面追加一段
            versionNameSuffix "_productB" //在defaultConfig中默认versionName的基础上在后面追加一段

            resValue "string", "app_icon_name", "产品B" //替换掉指定的资源文件,比如应用名

            buildConfigField "boolean", "isHongkongUser", "false"//自定义属性,可以在 BuildConfig 中获取设置的值
            buildConfigField "int", "countryCode", "20095"//自定义属性,可以在 BuildConfig 中获取设置的值

            manifestPlaceholders = [app_logo         : "@drawable/icon2",//用于替换清单文件中的标签,比如应用logo,多渠道信息
                                    app_channel_value: "应用宝",
            ]
        }
    }
}

//***********************************************************************************************************************************
//                                                       【dependencies】
//***********************************************************************************************************************************
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation rootProject.ext.dependencies["support_v7"] // android support library
    implementation rootProject.ext.dependencies["gson"] // gson
}
x
1
apply plugin: 'com.android.application'
2
3
android {
4
    compileSdkVersion rootProject.ext.android["compileSdkVersion"]
5
    buildToolsVersion rootProject.ext.android["buildToolsVersion"]
6
7
    //*******************************************************************************************************************************
8
    //                                                          【defaultConfig】
9
    //*******************************************************************************************************************************
10
    defaultConfig {
11
        applicationId "com.bqt.test"
12
        minSdkVersion rootProject.ext.android["minSdkVersion"]
13
        targetSdkVersion rootProject.ext.android["targetSdkVersion"]
14
        versionName rootProject.ext.android["versionName"]
15
        versionCode rootProject.ext.android["versionCode"]
16
17
        flavorDimensions "bqt" //必须带上一个 flavorDimensions[维度、尺寸],值可以随意
18
        testInstrumentationRunner "android.support.com.bqt.test.runner.AndroidJUnitRunner"
19
        compileOptions {
20
            sourceCompatibility JavaVersion.VERSION_1_8
21
            targetCompatibility JavaVersion.VERSION_1_8
22
        }
23
24
        // 放在这里可以在任何地方获取到。key可以不必用引号括起来,但是字符串类型的值必须使用【'"】和【"'】括起来才可以
25
        // 否则,值最匹配什么类型就是什么类型。比如【"1"】和【"@drawable/icon"】是int类型,而【'"1"'】才代表字符串类型
26
        manifestPlaceholders = [release_time_value: new Date().format("yyyy-MM-dd HH:mm:ss E", TimeZone.getDefault())]
27
    }
28
29
    //*******************************************************************************************************************************
30
    //                                                          【signingConfigs】
31
    //*******************************************************************************************************************************
32
    signingConfigs { //配置签名信息,例如各个不同产品的签名文件位置、密码、昵称、昵称密码等,要放在 buildTypes 上面配置
33
        beakeystore { //除了默认的 debug 签名外,signingConfigs 中的其他签名必须完整的配置签名相关的信息
34
            storeFile file('../config/bea.keystore')
35
            storePassword 'beachinambk'
36
            keyAlias 'bea.keystore'
37
            keyPassword 'beachinambk'
38
39
            v2SigningEnabled true
40
        }
41
42
        debug { //默认的 debug 签名,不需要指定签名信息
43
            v2SigningEnabled true
44
        }
45
46
        beakeystore2.initWith(beakeystore)
47
        beakeystore2 {
48
            storeFile file('../config/bea2.keystore')
49
        }
50
    }
51
52
    //*******************************************************************************************************************************
53
    //                                                           【buildTypes】
54
    //*******************************************************************************************************************************
55
    buildTypes { // 用于区分正式包和debug包。默认正式签名时就会走release脚本,调试签名时会走debug脚本
56
        release {
57
            debuggable false //是否可调试。debug模式默认为true,release模式默认是false
58
            zipAlignEnabled true// 是否启用Zipalign优化,对齐app所有资源。因为对齐处理发生在签名之后,所以启用时必须指定了签名信息
59
            shrinkResources true// 在构建时是否自动移除无用的资源以减小apk包的大小(包括图片,布局,菜单等,但不包括value资源文件)
60
61
            minifyEnabled true //是否启用混淆。debug与release的默认值都为false
62
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //配置混淆文件所在路径
63
            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
64
            consumerProguardFiles 'consumer-proguard-rules.pro'
65
66
            signingConfig signingConfigs.beakeystore2 //使用自己配置的签名信息
67
68
            manifestPlaceholders = [baidu_map_key_value: "20094"]  //注意,这里的值用双引号括起来并不代表其就是String类型
69
            buildConfigField "String", "BASE_URL", '"http://110.com/"' //自定义属性,可以在 BuildConfig 中获取设置的值
70
        }
71
72
        debug {
73
            signingConfig signingConfigs.debug  //使用默认的 debug 签名,即使不配置,也是使用的此默认签名
74
75
            manifestPlaceholders = [baidu_map_key_value: "10086"]  //注意,这里的值用双引号括起来并不代表其就是String类型
76
            buildConfigField "String", "BASE_URL", '"http://120.com/"' //自定义属性,可以在 BuildConfig 中获取设置的值
77
        }
78
79
        pre.initWith(release) //initWith的作用是:拷贝指定构建类型 release 中的所有变量到 pre,然后gradle就会自动生成新的task
80
        pre { //预发布版本,该版本除了下面指定的配置与release版本不同外,其他都与release相同
81
            debuggable true
82
        }
83
    }
84
85
    //*******************************************************************************************************************************
86
    //                                                      【productFlavors】
87
    //*******************************************************************************************************************************
88
    productFlavors { //用于为不同的产品分配专有属性;构建基于同一份代码的不同Android项目有差异的部分;多渠道打包
89
        productA {  //新建产品productA,在defaultConfig的基础上做修改
90
            applicationId "com.bqt.test.productA"  // defaultConfig 中可以设置的这里基本也都可以设置
91
92
            resValue "string", "app_icon_name", "产品A" //替换掉指定的资源文件,比如应用名
93
94
            buildConfigField "boolean", "isHongkongUser", "true"//自定义属性,可以在 BuildConfig 中获取设置的值
95
            buildConfigField "int", "countryCode", "20094"//自定义属性,可以在 BuildConfig 中获取设置的值
96
97
            manifestPlaceholders = [app_logo         : "@drawable/icon",//用于替换清单文件中的标签,比如应用logo,多渠道信息
98
                                    app_channel_value: "小米应用市场",
99
            ]
100
        }
101
102
        productB {  //新建产品productB
103
            applicationIdSuffix ".productB" //在defaultConfig中默认applicationId的基础上在后面追加一段
104
            versionNameSuffix "_productB" //在defaultConfig中默认versionName的基础上在后面追加一段
105
106
            resValue "string", "app_icon_name", "产品B" //替换掉指定的资源文件,比如应用名
107
108
            buildConfigField "boolean", "isHongkongUser", "false"//自定义属性,可以在 BuildConfig 中获取设置的值
109
            buildConfigField "int", "countryCode", "20095"//自定义属性,可以在 BuildConfig 中获取设置的值
110
111
            manifestPlaceholders = [app_logo         : "@drawable/icon2",//用于替换清单文件中的标签,比如应用logo,多渠道信息
112
                                    app_channel_value: "应用宝",
113
            ]
114
        }
115
    }
116
}
117
118
//***********************************************************************************************************************************
119
//                                                       【dependencies】
120
//***********************************************************************************************************************************
121
dependencies {
122
    implementation fileTree(dir: 'libs', include: ['*.jar'])
123
    implementation rootProject.ext.dependencies["support_v7"] // android support library
124
    implementation rootProject.ext.dependencies["gson"] // gson
125
}

设置完之后,点击下面 Build Variants 栏可以切换默认点击 Run 时运行的任务:
我们在上面的 productFlavors 中设置了两个产品,在 buildTypes 中设置了三个构建类型,所以我们可选的打包任务就有 2*3 = 6 个。

实际 build 时的配置信息

{
    "debuggable": "false",
    "embedMicroApp": "true",
    "jniDebuggable": "false",
    "mBuildConfigFields": {
        "BASE_URL": "http://120.com/",
        "countryCode": 20094,
        "isHongkongUser": true
    },
    "mConsumerProguardFiles": [
        "你指定的自动寻找的第三方库里的混淆文件"
    ],
    "mManifestPlaceholders": {
        "baidu_map_key_value": "20094"
    },
    "mProguardFiles": [
        "C:/Android/_coder/_workspace_as/FragmentTest/build/intermediates/proguard-files/proguard-android.txt-3.1.3",
        "C:/Android/_coder/_workspace_as/FragmentTest/app/proguard-rules.pro"
    ],
    "mResValues": {
        "app_icon_name": "com.android.builder.internal.ClassFieldImpl@efa088c5"
    },
    "minifyEnabled": "true",
    "name": "release",
    "pseudoLocalesEnabled": "false",
    "renderscriptDebuggable": "false",
    "renderscriptOptimLevel": "3",
    "signingConfig": {
        "keyAlias": "bea.keystore",
        "keyPassword": "beachinambk",
        "name": "beakeystore",
        "storeFile": "C:/Android/_coder/_workspace_as/FragmentTest/config/bea.keystore",
        "storePassword": "beachinambk",
        "storeType": "C:/Android/_coder/_workspace_as/FragmentTest/config/bea.keystore",
        "v1SigningEnabled": "true",
        "v2SigningEnabled": "true"
    },
    "testCoverageEnabled": "false",
    "zipAlignEnabled": "true"
}
x
 
1
{
2
    "debuggable": "false",
3
    "embedMicroApp": "true",
4
    "jniDebuggable": "false",
5
    "mBuildConfigFields": {
6
        "BASE_URL": "http://120.com/",
7
        "countryCode": 20094,
8
        "isHongkongUser": true
9
    },
10
    "mConsumerProguardFiles": [
11
        "你指定的自动寻找的第三方库里的混淆文件"
12
    ],
13
    "mManifestPlaceholders": {
14
        "baidu_map_key_value": "20094"
15
    },
16
    "mProguardFiles": [
17
        "C:/Android/_coder/_workspace_as/FragmentTest/build/intermediates/proguard-files/proguard-android.txt-3.1.3",
18
        "C:/Android/_coder/_workspace_as/FragmentTest/app/proguard-rules.pro"
19
    ],
20
    "mResValues": {
21
        "app_icon_name": "com.android.builder.internal.ClassFieldImpl@efa088c5"
22
    },
23
    "minifyEnabled": "true",
24
    "name": "release",
25
    "pseudoLocalesEnabled": "false",
26
    "renderscriptDebuggable": "false",
27
    "renderscriptOptimLevel": "3",
28
    "signingConfig": {
29
        "keyAlias": "bea.keystore",
30
        "keyPassword": "beachinambk",
31
        "name": "beakeystore",
32
        "storeFile": "C:/Android/_coder/_workspace_as/FragmentTest/config/bea.keystore",
33
        "storePassword": "beachinambk",
34
        "storeType": "C:/Android/_coder/_workspace_as/FragmentTest/config/bea.keystore",
35
        "v1SigningEnabled": "true",
36
        "v2SigningEnabled": "true"
37
    },
38
    "testCoverageEnabled": "false",
39
    "zipAlignEnabled": "true"
40
}
里面的一些关键部分:
  • mBuildConfigFields 对应通过 buildConfigField 自定义的属性
  • mConsumerProguardFiles 对应通过 consumerProguardFiles 指定的自动寻找的第三方库里的混淆文件
  • mManifestPlaceholders  对应通过 manifestPlaceholders 替换清单文件中的标签
  • mProguardFiles 对应通过 proguardFiles 设置的混淆文件
  • mResValues 对应通过 resValue 替换掉指定的资源文件
  • signingConfig 代表设置的签名信息
其他字段基本见名知意。

以上内容我是这么产生的,比如将 app 目录的 build.gradle 文件中的 buildTypes 中的 debug 中的一个 buildConfigField 定义故意改错,比如定义了一个这个东西
android {
    buildTypes {
        debug {
            buildConfigField "int", "BASE_CODE", 1//自定义属性
        }
    }
}
1
android {
2
    buildTypes {
3
        debug {
4
            buildConfigField "int", "BASE_CODE", 1//自定义属性
5
        }
6
    }
7
}
则编译时就会报错
Could not find method buildConfigField() for arguments [int, BASE_CODE, 1] on BuildType_Decorated{name=debug, debuggable=true, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscriptDebuggable=false, renderscriptOptimLevel=3, minifyEnabled=false, zipAlignEnabled=true, signingConfig=SigningConfig_Decorated{name=debug, storeFile=C:\Users\baiqi\.android\debug.keystore, storePassword=android, keyAlias=AndroidDebugKey, keyPassword=android, storeType=C:\Users\baiqi\.android\debug.keystore, v1SigningEnabled=true, v2SigningEnabled=true}, embedMicroApp=false, mBuildConfigFields={BASE_URL=com.android.builder.internal.ClassFieldImpl@459c7615}, mResValues={}, mProguardFiles=[], mConsumerProguardFiles=[], mManifestPlaceholders={baidu_map_key_value=10086}} of type com.android.build.gradle.internal.dsl.BuildType.
Open File
x
1
Could not find method buildConfigField() for arguments [int, BASE_CODE, 1] on BuildType_Decorated{name=debug, debuggable=true, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscriptDebuggable=false, renderscriptOptimLevel=3, minifyEnabled=false, zipAlignEnabled=true, signingConfig=SigningConfig_Decorated{name=debug, storeFile=C:\Users\baiqi\.android\debug.keystore, storePassword=android, keyAlias=AndroidDebugKey, keyPassword=android, storeType=C:\Users\baiqi\.android\debug.keystore, v1SigningEnabled=true, v2SigningEnabled=true}, embedMicroApp=false, mBuildConfigFields={BASE_URL=com.android.builder.internal.ClassFieldImpl@459c7615}, mResValues={}, mProguardFiles=[], mConsumerProguardFiles=[], mManifestPlaceholders={baidu_map_key_value=10086}} of type com.android.build.gradle.internal.dsl.BuildType.
2
Open File
从这些错误信息里面我可以提取出构建时的一些配置信息。

2018-7-18

猜你喜欢

转载自www.cnblogs.com/baiqiantao/p/9333024.html
今日推荐