当前位置: 首页 > 科技观察

AndroidGradle从实现实践

时间:2023-03-13 04:13:01 科技观察

前言上一篇文章对Gradle进行了概述,同时对Groovy语言进行了简单的介绍。有了之前的基础,现在可以更加细心的学习了,下面我们就来说说如何在AndroidStudio中配置我们的Build文件,完成一些特定的功能,进行自定义构建。本文将从每个gradle文件入手,分析我们在每个文件中可以进行哪些配置,这些配置可以起到什么作用,以及如何使用gradle满足自定义需求进行构建。AndroidStudio中的Gradle文件我们新建一个Android工程,AndroidStudio会默认为我们生成以下文件,Project构建文件,Module构建文件,Project配置文件,混淆规则文件等,那么这些文件有什么作用呢?可以做什么样的配置?settings.gradleinclude':app'新建的项目默认只有上面的语句,用来指示Gradle在构建应用时应该包含哪些模块。对于大部分项目来说,文件中可能只有上面这一个,但是当我们的项目引入其他功能模块或者业务逻辑模块时,我们需要在include语句中添加相应的模块。有两个build.gradlebuild文件,一个用于我们的模块,一个用于项目。在Project中,默认生成如下配置//Top-levelbuildfilewhereyoucanaddconfigurationoptionscommontoallsub-projects/modules.buildscript{repositories{jcenter()}dependencies{classpath'com.android.tools.build:gradle:2.2.3'//注意:不要将您的应用程序依赖项放在这里;theybelongintheindividualmodulebuild.gradlefiles}}在项目的build文件中,我们可以添加一些子模块的通用配置,而不需要在每个子模块中单独配置。可以判断依赖仓库是jcenter还是其他依赖仓库。模块中默认生成的是我们模块在构建时自身的一些配置选项。gradle.properties是gradle的配置文件,可以定义一些常量供build.gradle使用,比如版本号等,随着我们业务的增长,构建文件会越来越大,可维护性会变差。当我们要修改一些内容的时候需要一个一个的去查找,但是当我们把一些配置常量放在一个单独的文件中的时候,可维护性就比以前提高了。我们可以在这个文件中添加一些信息,比如构建SDK版本。COMPILE_SDK_VERSION=23BUILD_TOOLS_VERSION=23.0.1VERSION_CODE=1然后,我们就可以在构建文件中引用它了。引用方式可以直接通过变量名。配置构建构建类型构建类型定义了Gradle在构建和打包您的应用程序时使用的某些属性,并且通常针对开发生命周期的不同阶段进行配置。例如,调试构建类型支持使用调试密钥对APK进行签名的调试选项;而发布构建类型压缩、混淆APK,并使用发布密钥对APK进行签名以进行分发。您必须至少定义一种构建类型来构建您的应用程序-AndroidStudio默认创建调试和发布构建类型。要开始为您的应用程序自定义打包设置,请了解如何配置构建类型。默认构建方法defaultConfig{applicationId"com.chenjensen.gradlelearn"minSdkVersion14targetSdkVersion24versionCode1versionName"1.0"testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"}我们可以根据自己的需要只对发布的版本进行混淆等操作,对于debug版本不行,我们可以在buildType中配置。buildTypes{release{minifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}debug{}}产品风味产品风味代表您可以向用户发布的不同应用版本,例如免费和付费应用版本。您可以自定义产品风格以使用不同的代码和资源,同时共享和重用所有应用程序版本通用的部分。产品口味是可选的,您必须手动创建它们。我们可以在productFlavors{}代码块中配置我们需要的设置。产品口味支持与defaultConfig相同的属性,因为defaultConfig实际上属于ProductFlavor类。这意味着您可以在defaultConfig{}块中为所有风格提供基本配置,每个风格都可以覆盖任何默认值,例如applicationId。ApplicationId作为我们APK的包名,用来区分不同的包。manifest中的package字段用于命名资源类的包名。***生成的R类文件就在这个包下。如果其他包中的代码需要引用资源,可以通过该路径调用。例如productFlavors{demo{applicationId"com.example.myapp.demo"versionName"1.0-demo"}full{applicationId"com.example.myapp.full"versionName"1.0-full"}}通过productflavors的配置,我们可以针对不同的应用市场发布不同的应用包,针对不同的应用包,我们可以细化配置到具体的SDK版本。不同应用市场的分布使我们能够收集不同应用市场的下载率。依赖关系构建系统管理来自本地文件系统和远程存储库的项目依赖关系。这使您不必手动搜索、下载依赖项的二进制包并将其复制到项目目录中。Android中添加依赖的三种方式//dependourlocalmodulecompileproject(":mylibrary")//remotebinarydependenciescompile'com.android.support:appcompat-v7:25.1.0'//localbinarydependencies,willdetectjarfilesinourlocallibscompilefileTree(dir:'libs',include:['*.jar'])//javaTest依赖于testCompile'junit:junit:4.12'//AndroidTest依赖于androidTestCompile'c??om.android.support.test.espresso:espresso-core:2.2.2'当我们添加一个依赖时,这个依赖还依赖其他的依赖,而我们要移除其中一个依赖,compile方法可以接受一个闭包参数,我们可以使用这个闭包来移除一些依赖。androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{excludegroup:'com.android.support',module:'support-annotations'})是通过编译配置的,Gradle会配置这个依赖项被添加到类路径和应用程序的APK中。除了编译配置,还有apk和provided。apk指定Gradle需要与应用程序的APK一起打包的仅运行时依赖项。您可以将此配置与JAR二进制依赖项一起使用,但不能与其他库模块依赖项或AAR二进制依赖项一起使用。provided指定Gradle不与应用程序的APK打包的编译时依赖项。如果运行时不需要此依赖项,这将有助于减小APK的大小。您可以将此配置与JAR二进制依赖项一起使用,但不能与其他库模块依赖项或AAR二进制依赖项一起使用。签名构建系统可以在构建配置中指定签名设置,并可以在构建过程中自动为您的APK签名。构建系统通过使用默认密钥和具有已知凭据的证书对调试构建进行签名来避免在构建时提示密码。除非为此构建明确定义了签名配置,否则构建系统不会签署发布构建。如果您没有分发密钥,您可以按照为您的应用程序签名中所述生成一个。由于调试证书是由构建工具创建的,并且在设计上并不安全,因此大多数应用商店(包括GooglePlay商店)不接受调试证书来签署APK以供发布。已签名的应用程序应用升级:当系统为应用程序安装更新时,它会将新版本中的证书与现有版本中的证书进行比较。如果证书匹配,系统将允许更新。如果新版本使用不同的证书签名,则必须为该应用程序分配另一个包名称-在这种情况下,用户将新版本安装为全新的应用程序。应用程序模块化:Android允许使用相同证书签名的多个APK在同一进程中运行(如果应用程序要求这样做),以便系统将它们视为单个应用程序。这样,您的应用程序可以按模块部署,用户可以独立更新每个模块。当您创建签名配置时,AndroidStudio会将您的签名信息以纯文本形式添加到模块的build.gradle文件中。如果您与团队合作或开源您的代码,您应该将此敏感信息移出构建文件,以免其他人轻易访问。为此,创建一个单独的属性文件来存储安全信息。然后在本地获取外部文件的配置,然后在发布代码的时候保存我们的秘钥配置文件。在项目的根目录下创建一个名为keystore.properties的文件。storePassword=myStorePasswordkeyPassword=mykeyPasswordkeyAlias=myKeyAliasstoreFile=myStoreFileLocation在module的build.gradle文件中,在android{}块之前添加加载keystore.properties文件的代码defkeystorePropertiesFile=rootProject.file("keystore.properties")//InitializeanewProperties()objectcalledkeystoreProperties.defkeystoreProperties=newProperties()//Loadyourkeystore.propertiesfileintothekeystorePropertiesobject.keystoreProperties.load(newFileInputStream(keystorePropertiesFile))使用语法keystoreProperties['propertyname']来引用存储在keystoreProperties中的属性。修改模块的build.gradle文件的signingConfigs块以使用此语法引用存储在keystoreProperties中的签名信息。android{signingConfigs{config{keyAliaskeystoreProperties['keyAlias']keyPasswordkeystoreProperties['keyPassword']storeFilefile(keystoreProperties['storeFile'])storePasswordkeystoreProperties['storePassword']}}...}ProGuard构建系统允许您更改正文指定不同的ProGuard规则文件。构建系统可以运行ProGuard以在构建过程中缩小和混淆类。代码压缩是通过ProGuard提供的,它检测并删除打包应用程序中未使用的类、字段、方法和属性,包括本机代码库中未使用的项目(这使其成为解决64k引用限制工具的有用方法)。ProGuard还优化字节码,删除未使用的代码指令,并使用短名称混淆剩余的类、字段和方法。混淆代码会使您的APK难以进行逆向工程。关于ProGuard更详细的介绍可以参考之前的项目搭建文章。启用代码压缩minifyEnabledtrue启用混淆规则proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'getDefaultProguardFile('proguard-android.txt')方法可以从AndroidSDKtools/proguard/文件夹ProGuard中获取默认值设置。proguard-rules.pro文件用于添加自定义ProGuard规则。默认情况下,此文件位于模块的根目录中。ProGuard每次执行后,会生成文件dump.txtAPK中所有class文件的内部结构如下。mapping.txt提供原始和混淆后的类、方法和字段名称之间的转换。seeds.txt列出了未混淆的类和成员。usage.txt列出了从APK中删除的代码。这些文件存储在/build/outputs/mapping/release/中。对于其中一些类,我们不想混淆它们,我们需要在ProGuard配置文件中添加一行-keep代码。例如:-keeppublicclassMyClass