浅谈build.gradle写法,促使我们更高效开发
抓住人生中的一分一秒,胜过虚度中的一月一年!
背景
在开发中,build.gradle是必须配置的,本文章介绍一下build.gradle必须配置的代码,这些大家应该都会,主要是优化下写法
实现目标
1、多Module中minSdkVersion,targetSdkVersion,versionCode,versionName共用
2、v7包design包等依赖
3、签名文件模块配置
4、多渠道打包
5、64k方法数限制
1、多Module中minSdkVersion,targetSdkVersion,versionCode,versionName共用
当我们项目庞大时候,可能会依赖很多Module到项目中,这时每个Module都有自己的build.gradle,其中minSdkVersion等是必须配置的,当我们版本升级时候,需要每个Module都做修改,这样虽说也没多少操作,但也不是最高效的方法,所以我们便会想到怎样就可以一键可做修改
思路:将所有module中minSdkVersion等都引用我们指定的配置文件,这样改动一处即一键改动
1、首先在我们项目根build.gradle中配置
ext {
compileSdkVersion = 27
buildToolsVersion = '27.0.2'
supportLibraryVersion = '27.1.1'
minSdkVersion = 16
targetSdkVersion = 27
versionCode = 1
versionName = "1.0.1"
}
2、在APP,Module中build.gradle中引用根配置的东西
compileSdkVersion rootProject.compileSdkVersion
defaultConfig {
applicationId "com.baoming"
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
buildToolsVersion rootProject.buildToolsVersion
versionCode rootProject.versionCode
versionName rootProject.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
flavorDimensions "versionCode"
multiDexEnabled true //添加多 dex分包支持
// minifyEnabled true //是否混淆
// zipAlignEnabled true //是否设置zip对齐优化
// shrinkResources true // 移除无用的resource文件
}
2、v7包design包等依赖
我们正常依赖写法
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
优化后写法
api "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
api "com.android.support:design:$rootProject.supportLibraryVersion"
3、签名文件模块配置
通常我们签名文件jks别名密码都写到build.gradle中,如下
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
优化后,我们别名密码等在build.gradle只写引用,值放到其他地方
1、在app同级新建文件夹signings,如图所示
app.png
2、将签名文件jks放到文件夹下
3、新建signing.properties,里边内容写别名,密码,jks路径等
KEYSTORE_FILEPATH=../signings/aijiayou.jks
STORE_PASSWORD=123456
KEY_ALIAS=aijiayou
KEY_PASSWORD=123456
4、build.gradle引用签名文件(写到最外层,和android{}同级)
Properties signingProperties = new Properties()
signingProperties.load(new FileInputStream(file("../signings/signing.properties")))
5、build.gradle配置签名文件
signingConfigs {
key {
storeFile file(signingProperties['KEYSTORE_FILEPATH'])
storePassword signingProperties['STORE_PASSWORD']
keyAlias signingProperties['KEY_ALIAS']
keyPassword signingProperties['KEY_PASSWORD']
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.key
}
debug {
signingConfig signingConfigs.key
}
}
4、多渠道打包
多渠道打包我们经常会用到,同样也可以使用第三方工具进行分包
1、在AndroidManifest.xml中配置
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
2、在build.gradle配置,前提是配置好签名文件,需要哪个渠道在productFlavors 添加即可
applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
outputFileName = fileName
}
}
}
productFlavors {
aijiayuo {}
yingyongbao {}
xiaomi {}
oppo {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
5、64k方法数限制
大家我想可能会遇到这种问题,代码在低版本机跑步起来,可能是方法数超过了限制,错误信息
com.android.dex.DexIndexOverflowException:method IDnotin[0,0xffff]:65536
可采用这种办法
1、依赖multidex
compile 'com.android.support:multidex:1.0.3'
2、配置
defaultConfig {
applicationId "com.aijiayou"
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
buildToolsVersion rootProject.buildToolsVersion
versionCode rootProject.versionCode
versionName rootProject.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
flavorDimensions "versionCode"
---------------------------------------------------------------------------------------------------------
multiDexEnabled true 添加多 dex分包支持 (这条信息)
---------------------------------------------------------------------------------------------------------
// minifyEnabled true //是否混淆
// zipAlignEnabled true //是否设置zip对齐优化
// shrinkResources true // 移除无用的resource文件
}
3、MyApplication中重写
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
MultiDex.install(this);
}
全部代码如下
apply plugin: 'com.android.application'
Properties signingProperties = new Properties()
signingProperties.load(new FileInputStream(file("../signings/signing.properties")))
android {
compileSdkVersion rootProject.compileSdkVersion
defaultConfig {
applicationId "com.aijiayou"
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
buildToolsVersion rootProject.buildToolsVersion
versionCode rootProject.versionCode
versionName rootProject.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
flavorDimensions "versionCode"
multiDexEnabled true //添加多 dex分包支持
// minifyEnabled true //是否混淆
// zipAlignEnabled true //是否设置zip对齐优化
// shrinkResources true // 移除无用的resource文件
}
signingConfigs {
key {
storeFile file(signingProperties['KEYSTORE_FILEPATH'])
storePassword signingProperties['STORE_PASSWORD']
keyAlias signingProperties['KEY_ALIAS']
keyPassword signingProperties['KEY_PASSWORD']
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.key
}
debug {
signingConfig signingConfigs.key
}
}
compileOptions {//使用JAVA8语法解析
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
/* ndk {
//设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
abiFilters "armeabi"
}*/
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
outputFileName = fileName
}
}
}
productFlavors {
aijiayuo {}
yingyongbao {}
xiaomi {}
oppo {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
repositories {
maven { url 'https://jitpack.io' }
jcenter()
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
api "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
api "com.android.support:design:$rootProject.supportLibraryVersion"
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
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'
compile 'com.android.support:multidex:1.0.3'
}
最后,祝大家开发顺利!