在使用Android studio创建项目会出现两个build.gradle:
一. Project项目级别的build.gradle
(1)、buildscript{}闭包里是gradle脚本执行所需依赖,分别是对应的maven库和插件。
闭包下包含:
1、repositories闭包
2、dependencies闭包
maven库 repositories 示列
repositories { maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/' } google() jcenter() //代码托管仓库 mavenCentral() }
插件dependencies示列
dependencies { classpath 'com.android.tools.build:gradle:4.0.0' }
(2)、allprojects{}闭包里是项目本身需要的依赖,比如项目所需的maven库。`
闭包下包含:maven库repositories
maven库示列
repositories { maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/' } google() jcenter() //代码托管仓库 mavenCentral() }
(3)、task clean(type: Delete){}
- 1、是gradle 运行clean时,执行此处定义的task任务,该任务继承自Delete,删除根目录中的build目录。其中buildscript包含repositories闭包和dependencies闭包。
- 2、repositories{}闭包:配置远程仓库该闭包中声明了jcenter()和google()的配置,其中jcenter是一个代码托管仓库,上面托管了很多Android开源项目,在这里配置了jcenter后我们可以在项目中方便引用jcenter上的开源项目,从Android Studio3.0后新增了google()配置,可以引用google上的开源项目。
- 3、dependencies{}闭包:配置构建工具,该闭包使用classpath声明了一个Gradle插件,由于Gradle并不只是用来构建Android项目,因此此处引入相关插件来构建Android项目,其中’4.0.0’为该插件的版本号,可以根据最新的版本号来调整。
二. app模块下的build.gradle
(1)、apply 声明是Android程序 ,apply plugin表示应用了一个插件,一般分为两种类型:application程序木块和library模块
- 1、apply plugin: ‘com.android.application’ 表示这是一个应用程序模块
- 2、apply plugin: ‘com.android.library’ 标识这是一个库模块
- 3、apply from: ‘config.gradle’ 标识这是一个自定义的配置gradle
(2)、android{}闭包下的配置
-
compileSdkVersion是用来指定编译应用程序时所使用的Android SDK版本。它对应于在项目的build.gradle文件中的android块中设置的值。一般情况下,我们将其设置为最新的Android SDK版本,以便能够使用最新的Android平台提供的功能和特性
-
compileSdkVersion和minSdkVersion比较,compileSdkVersion表示当前项目的编译版本,即你想让AndroidStudio以什么SDK版本去编译你的项目,minSdkVersion表示当前项目支持的最低安卓系统版本,
-
buildToolsVersion则是指构建工具的SDK版本,也就是AndroidStudio中设置的AndroidSDK版本,buildToolsVersion要高于compileSdkVersion版本,这个很好理解,如果编译版本高于AndroidStudio的SDK版本,那AndroidStudio怎么给项目编译呢?
-
targetSdkVersion app的目标sdk版本,可以理解为当前app在这个版本是比较稳定的,针对这个版本所开发的,是安卓提供的前向兼容的主要手段,它的作用就是当targetSdkVersion为20的app运行在系统版本号高于20的手机系统中,app所执行的旧版本api,在高版本可能不一样了,但是安卓为了兼容在系统层会读取当前应用的targetSdkVersion,当targetSdkVersion版本号低于当前版本就会执行旧版本的api,不会导致由于系统的原因而让app运行失常。
-
defaultConfig{} 是 Android Gradle 插件中使用的默认配置块。它用于指定应用程序的默认配置参数。
defaultConfig { applicationId "com.yxj.xxxx" minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode 0000 versionName "1.1.0000" ndk {// 1、armeabi-v7a:第七代及以上的ARM处理器,2011年以后生产的大部分Android设备都使用。// 2、arm64-v8a:第8代、64位ARM处理器,很少设备,三星GalaxyS6是其中之一。// 3、armeabi:第5代、第6代的ARM处理器,早期的手机用的比较多。// 4、X86:平板、模拟器用得比较多。// 5、X86_64:64位得平板。// abiFilters 'armeabi', 'x86',"armeabi-v7a", "arm64-v8a",'x86_64' } //Android应用程序默认具有SingleDex支持,这限制了您的应用程序只有65536个方法(引用).所以multidexEnabled = true只是意味着你现在可以在你的应用程序中编写超过65536个方法(引用). multiDexEnabled true }
- 自动化打包配置signingConfigs{}
signingConfigs { debug { storeFile file('F:\\Android_work\\work\\xxx.keystore') storePassword '000000' keyAlias = 'keyAlias' //key的别名 keyPassword '000000' v1SigningEnabled true v2SigningEnabled true } release { storeFile file('F:\\Android_work\\work\\xxx.keystore') storePassword '000000' keyAlias = 'keyAlias '//key的别名 keyPassword '000000' v1SigningEnabled true v2SigningEnabled true } }
- lintOptions{} 用于配置静态代码分析工具Lint的参数和行为
lintOptions { // true--关闭lint报告的分析进度 quiet true // true--错误发生后停止gradle构建 abortOnError false // true--只报告error ignoreWarnings true // true--忽略有错误的文件的全/绝对路径(默认是true) //absolutePaths true // true--检查所有问题点,包含其他默认关闭项 checkAllWarnings true // true--所有warning当做error warningsAsErrors true // 关闭指定问题检查 disable 'TypographyFractions','TypographyQuotes' // 打开指定问题检查 enable 'RtlHardcoded','RtlCompat', 'RtlEnabled' // 仅检查指定问题 check 'NewApi', 'InlinedApi' // true--error输出文件不包含源码行号 noLines true // true--显示错误的所有发生位置,不截取 showAll true // 回退lint设置(默认规则) lintConfig file("default-lint.xml") // true--生成txt格式报告(默认false) textReport true // 重定向输出;可以是文件或'stdout' textOutput 'stdout' // true--生成XML格式报告 xmlReport false // 指定xml报告文档(默认lint-results.xml) xmlOutput file("lint-report.xml") // true--生成HTML报告(带问题解释,源码位置,等) htmlReport true // html报告可选路径(构建器默认是lint-results.html ) htmlOutput file("lint-report.html") // true--所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建 checkReleaseBuilds true // 在发布版本编译时检查(即使不包含lint目标),指定问题的规则生成崩溃 fatal 'NewApi', 'InlineApi' // 指定问题的规则生成错误 error 'Wakelock', 'TextViewEdits' // 指定问题的规则生成警告 warning 'ResourceAsColor' // 忽略指定问题的规则(同关闭检查) ignore 'TypographyQuotes' }
- compileOptions{}是一个用于配置 Gradle 编译选项的对象。它可以在 Gradle 构建文件中使用
compileOptions { //配置 Java 编译参数: sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 // Java 编译器标志参数: compilerArgs.addAll(['-Xlint:unchecked', '-Xlint:deprecation']) //配置 Kotlin 编译参数: kotlinOptions { jvmTarget = "1.8" freeCompilerArgs += ['-Xopt-in=kotlin.RequiresOptIn'] //配置 C 语言编译参数: apply plugin: 'cpp' cppCompilerArgs.add('-std=c99') cppCompilerArgs.add('-Wall') //配置 C++ 编译参数: apply plugin: 'cpp' cppCompilerArgs.add('-std=c++11') cppCompilerArgs.add('-Wall') }
- buildTypes{}可以配置我们需要的构建类型,例如我们常用到的 “测试类型” 和 “本地类型”,则可以使用如下配置
- minifyEnabled:表明是否对代码进行混淆,true表示对代码进行混淆,false表示对代码不进行混淆,默认的是false。
- proguardFiles: 指定混淆的规则文件,这里指定了proguard-android.txt文件和proguard-rules.pro文件两个文件,proguard-android.txt文件为默认的混淆文件,里面定义了一些通用的混淆规则。proguard-rules.pro文件位于当前项目的根目录下,可以在该文件中定义一些项目特有的混淆规则。
- buildConfigField:用于解决Beta版本服务和Release版本服务地址不同或者一些Log打印需求控制的。例如:配置buildConfigField(“boolean”, “LOG_DEBUG”, “true”),这个方法接收三个非空的参数,第一个:确定值的类型,第二个:指定key的名字,第三个:传值,调用的时候BuildConfig.LOG_DEBUG即可调用。
- debuggable:表示是否支持断点调试,release默认为false,debug默认为true。
- jniDebuggable:表示是否可以调试NDK代码,使用lldb进行c和c++代码调试,release默认为false
- signingConfig:设置签名信息,通过signingConfigs.release或者signingConfigs.debug,配置相应的签名,但是添加此配置前必须先添加signingConfigs闭包,添加相应的签名信息。
- renderscriptDebuggable:表示是否开启渲染脚本就是一些c写的渲染方法,默认为false。
- renderscriptOptimLevel:表示渲染等级,默认是3。
- pseudoLocalesEnabled:是否在APK中生成伪语言环境,帮助国际化的东西,一般使用的不多。
- applicationIdSuffix:和defaultConfig中配置是一的,这里是在applicationId
中添加了一个后缀,一般使用的不多。 - versionNameSuffix:表示添加版本名称的后缀,一般使用的不多。
- zipAlignEnabled:表示是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率,release和debug默认都为true。
buildTypes { //发布版本类型 release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } // 测试类型,给测试人员 debug{ minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } // 本地类型,和后端联调使用 local{ minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
- packagingOptions{}是一个用于配置Android项目的属性,用于控制应用程序打包过程中的资源和依赖项的处理方式。这个属性通常用于解决资源冲突和冗余问题。
在Android中,一个应用程序可能会依赖多个库或模块,每个库或模块都可能包含一些相同的资源文件或类文件。当编译和打包应用程序时,如果存在冲突的资源文件或类文件,编译器将会抛出错误。packagingOptions提供了一种配置方式,让开发者能够控制冲突的处理方式。
// 配置packagingOptions packagingOptions { //exclude:用于排除特定的资源文件或类文件,使其不被打包到最终的APK文件中。可以使用通配符来匹配文件名或文件路径 exclude 'META-INF/LICENSE.txt' // 排除名为LICENSE.txt的文件 exclude 'META-INFarmeabi/libYTCommon.so" doNotStrip "*/armeabi-v7a/libYTCommon.so" doNotStrip "*/x86/libYTCommon.so" doNotStrip "*/arm64-v8a/libYTCommon.so" }
- sourceSets{}可以指定需要被编译的源文件,不在指定路径下的源文件将会被排除(即不会被编译)。Gradle通过SourceSets实现了Java项目的目录布局定义
sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['libs'] //如果我们不想用默认的,可以重新指定,按如下方式就可以修改目录布局结构 java { srcDir 'src/java' // 指定源码目录 } resources { srcDir 'src/resources' //资源目录 } }
- aaptOptions{} aapt 全称为 Android Asset Packaging Tool,即为Android资源打包工具。可以通过其来进行配置打包的细节。
aaptOptions { //给 aapt 执行时添加额外参数,添加的参数可通过 aapt --help 进行查看 additionalParameters '--auto-add-overlay' additionalParameters '--rename-manifest-package','com.zinc.test' // 会将包名更改为 com.zinc.test //设置线程数 cruncherProcesses 4 //设置是否无法找到配置条目,则强制aapt返回错误。 failOnMissingConfigEntry true //设置忽略的资源 // 忽略掉 png 后缀的图像,只会排除 assets 下的资源,res下的资源不会排除 ignoreAssets "*.png" //设置忽略的资源 noCompress 'foo', 'bar' ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~" // 忽略掉 png 后缀的图像,只会排除 res 下的资源,assets下的资源不会排除 ignoreAssetsPattern '*.png' //是否对资源进行压缩,默认不对"jpg"、"png"压缩。如果传入’’,则表明全部资源不会进行压缩。压缩后的资源可以通过 aapt l -v apk路径 进行查看压缩的细节。 // 不对 bat 进行压缩 noCompress '.bat' }
-
productFlavors{}闭包:多个渠道配置
productFlavors是android{}中的一个扩展属性,主要用来让同一套代码可以打包成不同的apk包,又可以成为变体(Variants)。其实该productFlavors属性是与buildTypes配合使用的 -
buildFeatures
(3)、dependencies{}闭包是指在开发 Android 应用程序时,所需的各种库和模块。这些依赖项可以帮助开发者实现不同的功能和特性,例如网络请求、图形绘制、数据库操作等
dependencies { //引入文件树,这里会把libs目录下所有的jar包自动引入 implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //引入指定jar包文件,这里传递是相对路径即相当于module下的build.gradle文件的路径,如以下写法则是引入与module下的build.gradle同路径下的jar包 implementation files('crazymo.jar') //引入依赖库Module方式1 implementation project(':libcrazymo') implementation project(path:':libcrazymo') }
gradle3.0中compile依赖关系已被弃用,被implementation和api替代,provided被compile only替代,apk被runtime only替代。
- runtime only——只打包不参与编译,用于指定Gradle
不与应用的apk一起打包的依赖库,如果运行时无需依赖此依赖库,这将有助于apk大小的优化。 - compile only——只编译不打包到apk
- api——跟2.x版本的 compile完全相同
- implementation——只能在内部使用此模块,比如我在一个library中使用implementation依赖了gson库且我的主项目依赖了library,那么主项目就无法访问gson库中的方法,这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,如果你需要提供给外部访问,那么就使用api依赖即可。除了使用静态依赖的方式,还可以使用动态的形式进行依赖(实际项目中不太推荐),以下就是使用另一种形式进行依赖,虽然使用三句话都配置了相同的group和module的依赖,不过编译不会出错,因为Groovy会自动为你选择最新版本的并排除重复的。
来源地址:https://blog.csdn.net/u011932309/article/details/132447410