欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Gradle 配置打包信息

程序员文章站 2022-04-02 08:08:52
前言在Android应用开发完成准备上线时,就会将代码打包成apk文件,此时就需要将测试环境切换为正式环境,一些简单的项目就只是简单的替换服务器地址和更改apk文件名而已,但是随着项目需要配置的东西越多,每次打包前都需要逐项修改配置文件,不仅十分繁琐而且稍有不慎忘记修改,将会酿成大错。因此,使用Gradle打包就可以完全自动修改,简直爽得不要不要的。开始先来看看Android项目中Gradle文件结构。......

前言

在Android应用开发完成准备上线时,就会将代码打包成apk文件,此时就需要将测试环境切换为正式环境,一些简单的项目就只是简单的替换服务器地址和更改apk文件名而已,但是随着项目需要配置的东西越多,每次打包前都需要逐项修改配置文件,不仅十分繁琐而且稍有不慎忘记修改,将会酿成大错。因此,使用Gradle打包就可以完全自动修改,简直爽得不要不要的。

开始

先来看看Android项目中Gradle文件结构。

-Project
	-app
		-build.gradle
	-build.gradle
	-settings.gradle
	-gradle.properties

我们一个一个文件的来看。

  • app目录下的build.gradle
    这个文件中的内容不用多说,大家肯定都十分熟悉了,因此我们只需要关注buildTypes就好了,其默认代码如下:
buildTypes {
        release {
            minifyEnabled false	// 是否混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'	//混淆文件
        }
    }

默认的release就是我们打包release版本时候的配置,默认只配置了不开启混淆以及指定了默认的混淆文件。如果我们需要构建其他类型的包或者修改参数则可以在这里进行操作。

  • Project目录下的build.gradle
    这里的build.gradle是针对整个project下所有的module而言的,在这里配置的东西可以在任何一个module使用。默认代码如下:
buildscript {
    ext.kotlin_version = "1.3.72"
    repositories {
        google()
        jcenter()
    }
    dependencies {
       ...
    }
}

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

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • settings.gradle
    这个文件内容比较简单,只定义了包含的module以及项目名,代码如下。
include ':app'
rootProject.name = "GradleTest"

熟悉了这几个文件,我们就可以进行操作起来了。

开始操作

首先我们解决第一个问题。

  • 应用配置信息杂乱繁多

为了解决这个问题,我们可以考虑将需要配置的信息单独存放在一个配置文件,统一修改配置。因此,在项目根目录下创建文件config.gradle。要想在整个项目中使用该文件,则需要在项目根目录下的build.gradle导入该文件,代码如下。

apply from: "config.gradle"

然后点击右上角的Sync Now完成导入。接下来就可以编辑配置信息了。
这里以App版本信息和服务器地址为例进行配置,代码如下。

ext{

    // 版本号以及版本名
    VERSION_CODE = 1
    VERSION_NAME = "1.0.0"

    // 服务器地址
    BASE_URL_DEBUG = "\"https://test.holo.com/\""
    BASE_URL_RELEASE = "\"https://api.holo.com/\""

}

配置完成后同样点击右上角的Sync Now完成导入。完成后打开app目录下的build.gradle,对config.gradle中的信息进行配置。

...
def config = rootProject.ext  // 导入配置信息对象

android {
		...
    defaultConfig {
        ...
        versionCode config.VERSION_CODE    // 应用配置信息
        versionName config.VERSION_NAME
        ...
    }
}

这样应用的信息配置问题就解决了,但是还没有解决服务器地址以及各种SDK的key的问题,那么我们继续。

  • 服务器地址及key的自动配置
    同样在app目录下的build.gradle下,在buildTypes对象下进行配置,代码如下:
buildTypes {

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // 在BuildConfig.java中声明一个类型为String,变量名为BASE_URL,值为config.BASE_URL_RELEASE的变量
            buildConfigField "String","BASE_URL",config.BASE_URL_RELEASE
        }

        // debug版本
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            buildConfigField "String","BASE_URL",config.BASE_URL_DEBUG
        }
    }

点击Build->Rebuild Project重新构建工程,随后会自动生成BuildConfig.java文件,然后可以直接在代码中引用刚才声明的变量。跑一下看看,测试代码如下:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<TextView>(R.id.text_view).text = BuildConfig.BASE_URL
    }

效果图如下
Android Gradle 配置打包信息
直接显示的为BASE_URL_DEBUG的值,其他SDK的key类似配置。

  • 打包apk自动命名

一般情况下,我们都是将打包后的apk手动重命名为我们想要的名字,这样一点都不优雅而且比较麻烦,不如自动生成指定文件名的apk。
首先创建一个productFlavors,然后进行配置。

flavorDimensions "type"
    productFlavors{
        // 声明一个变体
        holoApp{
            versionCode = config.VERSION_CODE
            versionName = config.VERSION_NAME
        }
    }

对变体进行输出配置。

android.applicationVariants.all{
        variant ->
            switch (variant.flavorName){
                case 'holoApp':
                    if(variant.name.contains("Release")){
                        // release版本
                        variant.outputs.all{
                            outputFileName = "HoloApp_${config.VERSION_NAME}_${today()}_release.apk"
                        }
                    }else if(variant.name.contains("Debug")){
                        // debug版本
                        variant.outputs.all{
                            outputFileName = "HoloApp_${config.VERSION_NAME}_${today()}_debug.apk"
                        }
                    }
                    break
            }
    }
// 获取当前日期
static def today(){
    def c = Calendar.getInstance()
    return "${c.get(Calendar.YEAR)}_${c.get(Calendar.MONTH)}_${c.get(Calendar.DAY_OF_MONTH)}"
}

最后配置签名信息。

signingConfigs{
        release{
        // holo.jks 应位于app目录下
            storeFile file("./holo.jks")
            storePassword '123456'
            keyAlias = 'holokey'
            keyPassword = '123456'
        }
    }

添加签名信息到变体。

flavorDimensions "type"
    productFlavors{

        holoApp{
            versionCode = config.VERSION_CODE
            versionName = config.VERSION_NAME
            signingConfig = signingConfigs.release
        }

    }

最后点击右上角的Sync Now完成后,就可以在项目Gradle视图中的ProjectName->Tasks->build目录下找到assembleVariantName(我这里是叫做assembleHoloApp)这个task,双击运行或者在终端输入gradlew assembleVariantName开始打包。
打包完成后就可以在app/build/outputs/apk/variantName/release下查看正式包,在app/build/outputs/apk/variantName/debug下查看测试包了,是不是方便了许多。

本文地址:https://blog.csdn.net/qq_31054411/article/details/109331442

相关标签: Android Gradle