Android 中
build.gradle
文件是两个
app/build.gradle
project/build.gradle
app/build.gradle
* 上图① ② ③ ④ ⑤分别为:项目类型(应用或者是一个libary)、Android编译版本、manifest上的基本配置、创建类型、外部依赖
详细介绍:
apply plugin: 'com.android.application'// 声明是Android程序
android {
//版本配置
compileSdkVersion 26//是你SDK的版本号。
buildToolsVersion "26.0.2"//是你构建工具的版本,其中包括了打包工具aapt、dx等等
defaultConfig {
//应用的包名在安卓设备和商店中是作为应用的唯一标识,所以,一旦发布了应用程序,就不应该再修改,否则将被视为完全不同的应用
applicationId "com.suchengkeji.andeoid.gradlerdemo"
//SDK配置
minSdkVersion 21//app运行所需的最低sdk版本.低于minSdkVersion的手机将无法安装
targetSdkVersion 26 //应用的兼容模式
versionCode 1//整数值,代表应用程序代码的相对版本,也就是版本更新过多少次。
versionName "1.0"//字符串值,代表应用程序的版本信息,需要显示给用户。
// dex突破65535的限制
multiDexEnabled true//下面有介绍
}
buildTypes {
release {
// 是否进行混淆(设置是否使用优化打包)
minifyEnabled false
//设置为true后,生成的APK会去掉未使用的资源,减少APK的体积
shrinkResources true
//是否启动zipAlign优化
zipAlignEnabled false
// 混淆文件的位置(设置proguard文件(用于混淆代码))
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// 编译libs目录下的所有jar包
compile fileTree(dir: 'libs', include: ['*.jar'])
//编译所添加的外部依赖库
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
// 编译libray模块
compile project(':libray')
// 编译extras目录下的librayTwo模块(如果模块在某(extras)目录下)
compile project(':extras:librayTwo')
}
要点:
- Android程序声明处:
apply plugin: 'com.android.application'
是最新的写法,以前的写法是apply plugin: 'android'
-
compileSdkVersion
:是你SDK的版本号。告诉Gradle用哪个AndroidSDK版本编译你的应用。使用任何新添加的 API 就需要使用对应版本的 Android SDK。- 修改 compileSdkVersio不会改变运行时的行为。当你修改了compileSdkVersion的时候,可能会出现新的编译警告、编译错误,但新的compileSdkVersion不会被包含到APK 中:它纯粹只是在编译的时候使用。
-
buildToolsVersion
:是你构建工具的版本,其中包括了打包工具aapt、dx等等。这个需要你本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是buildversion的版本不对,这个可以手动更改成你本地已有的版本或者打开SDKManager去下载对应版本 -
minSdkVersion
:应用可以运行的最低要求,低于minSdkVersion的手机将无法安装。在开发时minSdkVersion也起到一个重要角色:lint 默认会在项目中运行,它在你使用了高于 minSdkVersion的API 时会警告你,帮你避免调用不存在的 API 的运行时问题(比如 minSdkVersion9但你使用了 sdkVersion 10 才有的API就会警告 )。- 如果只在较高版本的系统上才使用某些API,通常使用运行时检查系统版本的方式解决。 比如这样
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //...... } if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT&&Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //....... }
-
applicationId
:应用的包名在安卓设备和商店中是作为应用的唯一标识,所以,一旦发布了应用程序,就不应该再修改applicationId,否则将被视为完全不同的应用- application ID以前直接绑定到包名称; 因此一些Android API在其方法名称和参数名称中使用术语“包名称”,但这实际上是application ID。 例如,Context.getPackageName()方法返回application ID。 没有必要在app代码之外分享代码的真实包名。
- 如果您正在使用WebView,请考虑在application ID中使用您的程序包名称作为前缀; 否则您可能会遇到问题
applicationIdSuffix breaks some WebView use cases in apps
的问题。
*targetSdkVersion
:是Android提供向前兼容的主要依据,在应用的targetSdkVersion没有更新之前系统不会应用最新的行为变化。 - 随着 Android 系统的升级,某个系统的API或者模块的行为可能会发生改变,但是为了保证老 APK 的行为还是和以前兼容。只要APK的targetSdkVersion不变,即使这个APK安装在新Android系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的前向兼容性。
*versionCode
:整数值,代表应用程序代码的相对版本,也就是版本更新过多少次 - 整数值有利于其它程序比较,检查是升级还是降级。你可以把这个值设定为任何想设的值,但是,你必须保证后续更新版的值要比这个大。系统不会强制要求这一行为,但是随着版本更新值也增加是正常的行为。
- 一般来说,你发布的第一版程序的versionCode设定为1,然后每次发布都会相应增加,不管发布的内容是较大还是较小的。这意味着android:versionCode不像应用程序的发布版本(android:versionName)那样显示给用户。应用程序和发布的服务不应该显示这个版本值给用户。
-
versionName
:字符串值,代表应用程序的版本信息,需要显示给用户。- 与android:versionCode一样,系统不会为了任何内部的目的使用这个值,除了显示给用户外。发布的服务也需要提取这个值来显示给用户。
buildTypes
:构建类型,一般可以分为debug(主要用于开发阶段)和release(生产发布阶段)
buildTypes {
release {
//是否进行混淆(设置是否使用优化打包)
minifyEnabled </strong> false
//设置为true后,生成的APK会去掉未使用的资源,减少APK的体积
shrinkResources true
//是否启动zipAlign优化
zipAlignEnabled false
// 混淆文件的位置(设置proguard文件(用于混淆代码))
proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'</strong>
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
-
zipAlignEnabled
:AndroidSDK中包含一个“zipalign”的工具,它能够对打包的应用程序进行优化。在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率。因此,这种方式能够让应用程序和整个系统运行得更快。
配置多渠道打包(风格定制 )
android{
//配置多渠道打包(项目风格)
productFlavors {
huawei {
applicationId "com.suchengkeji.andeoid.gradlerdemo.huawei"
}
wandoujia {
applicationId "com.suchengkeji.andeoid.gradlerdemo.wandoujia"
}
}
}
配置打包签名设置
android{
signingConfigs {//签名的配置
debug {
storeFile file('H:\\configTest.jks')//签名文件路径
storePassword "123456"//签名密钥密码
keyAlias "configTest"//.jks文件别名
keyPassword "123456" //签名公钥密码
}
release {
storeFile file('H:\\configTest.jks')//签名文件路径
storePassword "123456"
keyAlias "configTest"
keyPassword "123456" //签名密码
}
}
}
- 配置完成打包签名设置后再
buildTypes{}
中的release{}
中天机打包命令行(可选设置)设置后可以通过命令打包-
gradlew assembleRelease
:这个是打包所有渠道(风格)release版本 -
gradlew assembleBaiduRelease
:只要打某个渠道的
打包后的apk文件在app–>build–>outputs—>apk中
使用gradlew时可能出现没有找到该命令,需要chmod 755 gradlew
-
project/build.gradle(根目录下的build.gradle)
- 用于添加子工程或模块共用的配置项。
-
buildscript
:配置此项目的构建脚本类路径。 -
repositories
:配置该项目的存储库。- 支持java 依赖库管理(maven/ivy),用于项目的依赖。
- 如果需要的话,从https://jcenter.bintray.com/下载code reposities。
-
dependencies
:配置此项目的依赖关系。- 依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件
- 定义classpath,gradle会从“repositories”中下载对应版本的Gradle。如果使用gradle wrapper的话,感觉这个配置会被忽略。Wrapper会自己去下载所使用的gradle版本。
- **不要把你的应用程序依赖这里;他们属于个别模块build.gradle文件
-
allprojects
:该配置会被应用到所有的子工程。
// 运行gradle clean时,执行此处定义的task。
// 该任务继承自Delete,删除根目录中的build目录。
// 相当于执行Delete.delete(rootProject.buildDir)。
// gradle使用groovy语言,调用method时可以不用加()。
task clean(type: Delete) {
delete rootProject.buildDir
}
提下根目录下还有一个
setting.gradle
:
- 作用就是导入子工程。它支持导入多个子工程,使整个工程支持multi-project的编译。
- 调用include函数,将子工程app(目录名为app)导入进来。
include ':app'
(有多个时用逗号分开)
dex突破65535的限制
-
首先是在defaultConfig节点使能多DEX功能
- 然后就是在
dependencies{}
中引入multidex库文件
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
- 最后就是你的AppApplication继承一下MultiDexApplication即可。