日志

Gradle系列之Android Gradle基础配置

 来源    2020-09-17    1  

原文发于微信公众号 jzman-blog,欢迎关注交流。

通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章:

上篇文章了解了 Android Gradle 插件的一下配置方法,记得刚开始接触 Android 中的 build.gradle 配置文件也是一脸懵逼,不知道各个配置项的具体含义,这篇文章将对 Android 开发中一些最基本的配置进行介绍,如果你有这方面的疑惑,相信这篇文章对你有一定收获

  1. 默认配置
  2. 配置签名信息
  3. 构建应用类型
  4. 使用混淆
  5. 启用zipalign优化

默认配置

defaultConfig 是 Android Gradle 配置文件中的一个配置块,defaultConfig 的类型是 ProductFlavor,如果没有自定义 ProductFlavor,则使用默认的 ProductFlavor 来配置 Android 工程,下面对 defaultConfig 中的一下配置属性进行介绍:

//默认的ProductFlavor配置块
defaultConfig {
    //配置App的包名
    applicationId "com.manu.base"
    //配合App最低支持的Android系统版本,下面两种minSdkVersion的配置效果是一致的
    minSdkVersion 19
    <!--minSdkVersion 'KitKat'-->
    //配置App基于哪个Android SDK开发
    targetSdkVersion 26
    //配置App的内部版本号,一般用于版本升级
    versionCode 1
    //配置App外部版本号,该版本号供用户查看
    versionName "1.0"
    //配置单元测试时使用的Runner
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    //配置测试App的包名
    testApplicationId "com.manu.androidgradleproject.test"
    //使用指定的签名文件配置
    signingConfig signingConfigs.release
}

配置签名信息

配置 App 签名信息的好处无非是防止 App 被恶意篡改,签名可保证 App 的唯一性且只有使用相同签名的后续升级包才能正常安装,在创建完签名文件之后,如果不做配置打包时每次都必须要指定签名文件的密码、别名等,一般 App 开发时在 denug 和 release 模式下时配置不同的签名文件。

第一步:创建签名证书文件,如下图所示填写相关信息:

第二步:使用 signConfigs 配置块配置已创建签名证书文件的相关信息如下:

//签名文件配置
signingConfigs {
    release{
        //签名证书文件
        storeFile file("project.jks")
        //签名证书文件密码
        storePassword "111111"
        //签名证书密钥别名
        keyAlias "project_jks"
        //签名证书中密钥密码
        keyPassword "111111"
    }
    debug{
        //默认情况下,debug模式下的签名已配置为Android SDK自动生成的debug签名文件证书
        //默认签名文件位置:.android/debug.keystore
    }
}

第三步:使用签名文件配置,在 android{} 下 defaultConfig{} 中使用上述配置,具体如下:

defaultConfig {
    //...
    //使用指定的签名文件配置
    signingConfig signingConfigs.release
}

除了在 defaultConfig{} 中配置,还可以在分别在 denbug 或者是 release 模式下配置不同的签名文件,可在 buildTypes{} 中单独配置配置,具体如下:

buildTypes {
    release {
        signingConfig signingConfigs.release
        //...
    }
    debug{
        signingConfig signingConfigs.debug
        //...
    }
    
    //...
}

构建应用的类型

Android Gradle 内置了两种构建类型 debug 和 release,两者区别是前者一般用在调试状态,后者一般用于正式发布状态,其他方面都一样,那么如何增加新的构建类型呢,可直接在 buildTypes{} 中添加要添加的类型即可,buildTypes 接收的参数是一个域对象,添加的构建类型都是 BuildType,所以可以通过 BuildType 的相关属性来配置构建类型,下面是 BuildType 的常见的一些配置属性:

buildTypes {
    release {
        //...
    }
    debug{
        //配置签名
        signingConfig signingConfigs.debug
        //配置在当前构建类型下applicationId的后缀,构建生成Apk的包名会在applicationId的基础上添加后缀
        applicationIdSuffix '.debug'
        //配置是否生成一个可供调试的Apk
        denbuggable true
        //配置是否生成一个可供调试jni(c/c++)代码的Apk
        jniDebuggable true
        //是否启用proguard混淆
        minifyEnabled true
        //配置当程序中方法数超过65535个时,是否启用自动拆分多个dex的功能,
        multiDexEnabled true
        //配置proguard混淆使用的配置文件,可配置对个混淆文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
        //配置是否自动清理未使用的资源,默认为false
        shrinkResources true
        //开启zipalign优化(见下文)
        zipAlignEnabled true
    }
}

当在 buildTypes{} 中添加新的构建类型之后,Android Gradle 都会自动生成一个 SourceSet,构建 Apk 会从对应的 SourceSet 中进行构建,切记新构建类型的名称不能和已有的相同。且要在 src 目录下为新创建的构建类型添加源代码目录和资源文件等,在创建好构建类型的同时,Android Gradle 插件也会生成对应的 assemble 任务来用于构建该类型的项目,如 release 对应的是 assembleRelease,执行该任务会生成对应的 Apk.

使用混淆

代码混淆主要了增加反编译的难度,发布正式版 App 时一般都得进行代码混淆,实际上 Android SDK 下面已经提供了默认的混淆文件,具体位置在 Android SDK 下面的 tools/progrard 下面,里面的内容主要是一些最基本的不能混淆的内容,两个默认的混淆文件如下:

//没优化
proguard-android.txt 
//已优化
proguard-android-optimize.txt

那么如何使用混淆呢,在 buildTypes{} 中对应的构建类型下设置 minifyEnabled 为 true 开启混淆,然后配置具体的混淆文件,具体如下:

buildTypes {
    release {
        //开启混淆
        minifyEnabled false
        //配置混淆文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
   //...
}

启用 zipalign 优化

zipalign 是 Android 提供的一个整理优化 apk 文件的工具,可在一定程度上上提高系统和应用的运行效率,更快的读取 apk 中的资源,降低内存的使用,开启 zipalign 优化只需要在 buildTypes{} 中对应的构建类型下开启 zipalign 优化即可,具体如下:

buildTypes {
    release {
       //开启zipalign优化
       zipAlignEnabled true
       //''
    }
   //...
}

这篇算介绍了 Android 开发中一些常见配置项的介绍。

可以关注公众号:零点小筑(jzman-blog),一起交流学习。

[Android Studio系列(五)] Android Studio手动配置Gradle的方法
日志1 问题 (1) android sutdio第一次打开一个工程巨慢怎么办? (2) 手动配置Gradle Home为什么总是无效? (3) 明明已经下载了Gradle,配置了gradle home, ...
Gradle – 相当于android的test {}配置块
问答Gradle有测试配置块 https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html "` appl ...
1
java – Gradle产品风味的“纯”gradle(不是android gradle)
问答我想用gradle为不同的客户构建一个java库. 在"纯粹"的gradle中有没有类似于android知道的产品风味? 谢谢.::答案是肯定的,但你必须使用新的Gradle软件模 ...
1
SpringCloud系列九:SpringCloudConfig 基础配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服务端、抓取配置文件信息、客户端使用 SpringCloudConfig 进行配置、单仓库目录匹配、应用仓库自动选择、仓库匹配模式)
日志声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringCloudConfig 基础配置 2.具体内容 通过名词就可以发现,SpringCloudConfig 核 ...
2
Android Gradle 构建工具(Android Gradle Build Tools)是什么?
日志转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...
1
android – Gradle任务在构建配置中更改布尔值
问答我想创建一个非常简单的任务,它在我的gradle配置中更改一个布尔值. 我在Android应用程序上工作,可以使用多个配置文件运行,并且对于每个构建需要指定在我的代码中应用程序是否必须伪造蓝牙. 我的 ...
1
新的Android Gradle构建系统构建配置包名称与提供者权限冲突
问答我已经更新了我的项目以使用新的基于Gradle的构建系统,这主要是因为我使用这个设备进行开发,因为我的设备上安装了我的应用程序,因此我无法使用它.我在新的构建系统的packageNameSuffix产 ...
1
android – 将风味配置保存在单独的.gradle文件中
问答简短 – 是否有办法将风味配置保存在单独的.gradle文件中? 有关更多详细信息 – 我希望将每个风格.gradle文件(如flavorGermany.gradle,flavorUkraine.gr ...
1
在gradle上构建android项目时,找不到名称为“default”的配置
问答我试图将eclipse项目导入到android工作室,但是它给出了这个错误. Could not fetch model of type 'IdeaProject' using Gradle inst ...
2
如何在Android Gradle配置中获取当前的buildType
问答我想基于当前的buildType在Android Gradle项目中动态添加依赖项.我知道我可以specify the buildType in the dependency: compile pro ...
2
Android Gradle – 从外部文件加载签名配置
问答在Gradle for Android中,似乎是公共实践来定义发布版本的签名配置,如下所示: android { signingConfigs { debug { storeFile file(&qu ...
1
android – Gradle Error:资源’attr/font’的重复值,配置“解决方案无效
问答我正在尝试为我的第一个Android应用程序创建圆形按钮. 为此,我将库添加为 在circlebutton / app / build.gradle中编译'com.cuboid:cuboidcircl ...
1
android – Gradle中究竟是什么“按需配置”?
问答我最近更改了Gradle中的一些设置以加快其进程,其中一个更改了这个:gradle.properties文件中的org.gradle.configureondemand = true属性. 我知道你可 ...
1
android-ndk – 如何配置NDK与Android Gradle插件0.7
问答新的Android gradle插件(0.7)似乎包括对NDK的新支持,但在文档中有很少甚至没有提到它(唯一的参考,我发现是一个测试称为ndkSanAngeles). 它看起来像gradle正在寻找N ...
1
android – Gradle 4.0无法找到匹配的配置
问答我试图在新的Android Studio 3.0 canary 2中打开我现有的项目.我根据instructions更新了Gradle,更改了依赖配置的名称,但我继续得到下一个错误: Unable t ...
1
FindBugs Android Gradle没有配置类错误
问答我正在尝试使用Android构建的Gradle的FindBugs插件. build.gradle文件 buildscript { repositories { mavenCentral() } dep ...
1
Android gradle androidTestApi&testApi配置已废弃
问答我有2个模块,模块A和模块B.模块B依赖于模块A,模块A通过使用api配置将依赖库共享给模块B. 在设置测试环境时,在模块A内部,我也使用testApi& androidTestApi使用共享 ...
1
android – 在Gradle中,是否可以根据其他构建配置字段创建一个布尔构建配置字段?
问答在Gradle中,如何基于其他构建配置字段创建布尔构建配置字段? 例如: buildConfigField BOOLEAN, TEST_A, "false" buildConfig ...
1
android – Gradle – 继承了proguard配置吗?
问答这可能过于宽泛,但我想解释如何在项目及其依赖项之间传递Proguard和minification配置,以了解这些操作在项目的依赖关系树中的深度. 我有关于`themodule'的build.gradl ...
1
Android拓展系列(12)--使用Gradle发布aar项目到JCenter仓库
日志目的 发布自己的android library(也就是aar)到公共的jcenter仓库,所有的人都能用gradle最简单的方式引用. 为什么选择jcenter,它兼容maven,而且支持更多形式仓库 ...
1