module-build.gradle结构分析与相关使用介绍

module-build.gradle结构分析与相关使用介绍


gradle基本结构:

apply plugin: 'com.android.application'

android {   
    // 编译版本
    compileSdkVersion 27
    buildToolsVersion "27.0.2"

    // 默认配置
    defaultConfig {   
        applicationId "com.xxx.xxx"  // 包名
        minSdkVersion 16     // 最小兼容版本
        targetSdkVersion 27  // 最大兼容版本

        // 版本码 给设备程序识别版本(升级)用的,必须是一个interger值
        versionCode 4    
        // 版本号 给用户看的    
        versionName "2.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        /*ndk {
            //选择要添加的对应cpu类型的.so库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }*/

        // gradle(动态)设置manifest中的 内容
        manifestPlaceholders = [
                JPUSH_PKGNAME: applicationId,
                JPUSH_APPKEY : "xxxxxxxxxxxxxx", //JPush上注册的包名对应的appkey.
                JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
        ]

    }

    //签名配置
    signingConfigs {
        config {
            keyAlias 'key0' //key别名
            keyPassword 'xxxx' //key密码,最好不要配置在脚本里
            storeFile file('F:/xxxx/xxxxx.jks') //证书路径,证书最好不要放入项目源码
            storePassword 'xxxx' //证书密码,最好不要配置在脚本里
        }
    }

    buildTypes {
            release {    // 发行版设置 
            // 打开混淆
            minifyEnabled true 
            // 打开压缩资源 没有使用的资源不会加载
            shrinkResources true   
            // 混淆规则
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // 加入签名配置
            signingConfig signingConfigs.config 
        }
    }
}

//源文件目录设置,是AndroidSourceSet类型。
sourceSets{ } 

//产品风格配置,ProductFlavor类型 可用于多渠道打包
productFlavors{ }

//测试配置,TestOptions类型
testOptions{ } 

//aapt配置,AaptOptions类型
aaptOptions{ } 

//lint配置,LintOptions类型
lintOptions{ } 

//dex配置,DexOptions类型
dexOptions{ } 

//编译配置,CompileOptions类型
compileOptions{ } 

//PackagingOptions类型
packagingOptions{ } 

//JacocoExtension类型。 用于设定 jacoco版本
jacoco{ } 

//Splits类型
splits{ } 

dependencies {
    // 添加的各种第三方库
}

相关使用


一、gradle脚本自动化生成APK

1 在android{} 标签中

//签名配置
    signingConfigs {
        config {
            keyAlias 'key0' //key别名
            keyPassword 'xxxx' //key密码,最好不要配置在脚本里
            storeFile file('F:/xxxx/xxxx.jks') //证书路径,证书最好不要放入项目源码
            storePassword 'xxxx' //证书密码,最好不要配置在脚本里
        }
    }

2 在buildType中加入签名配置

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //加入签名配置
            signingConfig signingConfigs.config 
        }
    }

注意 signingConfigs 一定要在 buildTypes 之前 否则 找不到config

3 执行编译打包命令

若 gradle 加入了环境变量 则直接用 gradle命令即可
将gradle加入环境变量中

右键 我的电脑 ---》属性 ---》左边有个:高级系统设置 ---》高级 ---》环境变量 ---》系统变量 选项中 ---》新建 --》变量名:GRADLE_HOME,变量值:你复制的gradle 最高版本的gradle 根目录 ---》确定。

   再在 系统变量 选项中 ---》找到:path 系统路径 ---》在变量值最后加入:%GRADLE_HOME%/bin (因为在bin文件夹下才有gradle.bat 可运行文件)---如果加入之前的系统路径最后没有“;”,要记得加入----》确定。

在windows开始菜单中,输入cmd,打开dos桌面,输入:gradle -v,回车
若出现了 Build time 等信息 而非 不是内部命令即成功

也可以通过./gradlew替代gradle(只能在项目根目录下使用)

用 gradle命令 生成 apk
在 项目的 根目录下 按着 shift+鼠标右键 打开cmd
输入命令

gradle assembleRelease

即可生成 发行版的 apk包

生成文件在 :G:\项目名\app\build\outputs\apk\release 下


问题:
Execution failed for task ‘:app:processReleaseResources’. > Failed to execute aapt
有可能是别的地方的错误,看看前面的出错
发现是找不到 dimen.xml这个文件
加上dimen.xml文件即可
dimen.xml 不是在 values.xml中加 (这个文件最好别修改)
而是自己新建dimen.xml 并且根据不同的 values适配 生成不同的 dimen.xml


二、把签名配置从源码的build.gradle中移除 因为放在源码中不安全 并且 不同开发人员的证书路径不同

1 在项目根目录下新建config/signgradle.txt文件,在项目外部创建sign.gradle文件

//在该文件里指定了sign.gradle文件路径
xxx/xxx/sign.gradle

2 源gradle中配置的内容放在 sign.gradle中

android {
  //签名配置
    signingConfigs {
        config {
            keyAlias 'key0' //key别名
            keyPassword 'xxxxx' //key密码,最好不要配置在脚本里
            storeFile file('F:/xxxx/xxxx.jks') //证书路径,证书最好不要放入项目源码
            storePassword 'xxxx' //证书密码,最好不要配置在脚本里
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config //加入签名配置
        }
    }
}

3 在源gradle文件中加载 signgradle.txt文件

//加载签名信息  
File configFile = file('../.config/signgradle.txt')  
if (configFile.exists()) {  
    // 读取文件内容 即sign.gradle配置文件的地址 
    def signGradlePath = configFile.newReader().readLine().trim()  
    println 'lucher, path:' + signGradlePath  
    if (file(signGradlePath).exists()) {  
        apply from: signGradlePath  
    }  
}  

4 执行编译打包命令

4.1 编译所有productFlavor及对应所有buildType的apk.(productFlavor和buildType的笛卡尔积)

//如果当前Project包含多个Module,在Project根目录执行gradle assemble会编译所有的Module

$gradle assemble (简写:$gradle a)  //仅仅执行项目打包所必须的任务集

$gradle build                //执行项目打包所必须的任务集,以及执行自动化测试,所以会较慢

4.2 编译指定productFlavor及buildType的apk

//如果缺失某参数,则会把该参数的所有配置都进行编译,即如果运行gradle assembleflavor,则会编译出flavor所有buildType的apk
$gradle assemble[productFlavor][buildType]

//例如:
$gradle assemble (简写:$gradle a 、 $gradle ass)

$gradle assembleflavorRelease (简写:$gradle aR 、$gradle assflavorR)

$gradle assembleflavorDebug(简写:$gradle aD 、$gradle assflavorD)

5 不用手动输入 gradle命令 而是点击.bat文件自动批处理执行

在项目根目录下创建一个指定的文件夹(用于编译跑脚本用),例如config,然后在该目录下分别创建.bat文件(win上批处理后缀文件)和签名文件

批处理文件如下autoSignAndPackage.bat:

:快速编译打包apk脚本

echo  " **************************打包开始 ************************** "

:执行打包命令前,需要先定位到项目根目录(即这里的上一层目录)
cd ..
:执行打包命令
gradle aRelease

echo  "**************************打包完成************************** "

双击 bat文件 即可自动执行


shell脚本,即工程中.config/build.sh

#快速编译打包apk脚本

echo  " **************************打包开始 ************************** "
sleep 1
#执行打包命令前,需要先定位到项目根目录
cd ..
#执行打包命令
gradle a

echo -e "**************************打包完成************************** "

#桌面右上角弹出通知
notify-send build.sh "打包完成!"

然后就可以直接通过./build.sh或者在文件管理器里双击build.sh文件来打包了


三、gradle中添加自定义方法
在android标签外
如 获取当前时间

//获取当前时间  
def getCurrentTime() {  
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))  
}  

四、gradle修改apk文件名
结合三

    //apk文件重命名
    android.applicationVariants.all { variant ->
        variant.outputs.all { 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 = "app_${variant.productFlavors[0].name}-V${defaultConfig.versionName}-${getCurrentTime()}-${buildType}.apk"
                outputFileName = new File(fileName) 
               outputFileName  = new File(outputFile.parent, fileName)  // 该方式会加上前面的路径
            }
        }
    }

gradle (动态) 更改 manifest中的 内容

manifestPlaceholders = [APP_NAME : "app-百度"]
然后 manifest中 的 application的lable使用
android:label="${APP_NAME}" 

这样就可以 根据 gradle中 不同的渠道 去设置app不同的名称

通过该方式也可以添加产品风格配置脚本,用于多渠道打包

//产品风格配置,可用于多渠道打包  
productFlavors {  
    //百度推广渠道  
    baidu {  
        applicationId "com.lucher.myapplication"  
        versionCode 1  
        versionName "1.0"  
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]  
  manifestPlaceholders = [  APP_NAME  : "app-百度"] //自定义App名称,需要把AndroidManifest.xml里的label改为: android:label="${APP_NAME}"  
    }  
    //360推广渠道  
    qh360 {  
        applicationId "com.lucher.myapplication"  
        versionCode 1  
        versionName "1.0"  
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]  
        manifestPlaceholders = [  APP_NAME  : "app-360"] //自定义App名称,需要把AndroidManifest.xml里的label改为: android:label="${APP_NAME}"  
    }  

猜你喜欢

转载自blog.csdn.net/weixin_37577039/article/details/79982964