Gradle學習(三):關於Android Gradle插件

本篇將講述Android Gradle插件在實際項目中的使用,以實際使用爲例java

一、引如Android Gradle插件

引入第三方插件的方法: 根build.gradle中:android

buildscript{
	repositories {
		jcenter()
	}
	dependecies {
		classpath 'com.android.tools.build:gradle:1.5.0'
	}
}
複製代碼

引入第三方gradle庫的方法:先在根build.gradle中使用classpath引入路徑,由於是在根工程中配置,全部子工程都不用配置了markdown

在其餘模塊中使用,如App模塊,在模塊下的build.gradle文件中:app

apply plugin : 'com.android.application'
android{
	compileSdkVersion 23
	buildToolsVersion "23.0.1"
}
複製代碼

apply plugin: 'com.android.application' 建立應用項目 apply plugin: 'com.android.library' 建立庫工程 apply plugin: 'com.android.test' 建立測試工程框架

二、經常使用Android配置

編譯SDK版本和構建工具版本模塊化

android {
	//編譯Android工程的SDK版本
	compileSdkVersion 23
	//Android構建工具的版本
	buildToolsVersion "23.0.1"
}
複製代碼

defaultConfig:默認配置,它是一個ProductFlavor工具

defaultConfig {
	//配置包名
	applicationId "com.breeze.qrcode"
	//最低支持的Android版本
	minSdkVersion 15
	//基於哪一個Android版本開發
	targetSdkVersion 26
	//版本號
	versionCode 1
	//版本名稱
	versionName "1.0.0"
}
複製代碼

配置簽名信息測試

signingConfigs {
	release {
		//簽名證書文件路徑
		storeFile file("myrelease.keystore")
		//簽名證書文件密碼
		storePassword "password"
		//簽名證書中的密鑰別名
		keyAlias "Alias"
		//簽名證書中密鑰的密碼
		keyPassword "password"
	}
	//配置多項
	debug {
		//....
	}
}
//使用
defaultConfig{
signingConfig signingConfigs.release
}
複製代碼

構建的應用類型gradle

android {
	buildTypes {
		release {
			//是否混淆
			minifyEnabled true
			//配置是否啓用自動拆分多個Dex
			multiDexEnabled true
			// 配置是否自動清理未使用的資源,默認未false
			shrinkResources true
			//簽名配置
			signingConfig signingConfigs.release
			//混淆文件配置
			proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
			//啓用zip對齊
			zipAlignEnabled true
		}
		 //配置其餘編譯類型
		debug {
			//不混淆
			minifyEnabled false
			zipAlignEnabled true
			signingConfig signingConfigs.debug
		}
	}
}
複製代碼

修改生成的apk的名稱 先介紹一個概念: 變體:打包渠道和編譯類型的組合,對應一個apk包ui

this.afterEvaluate {
	tasks['build'].doLast {
		android.applicationVariants.all {
			variant ->
				variant.outputs.each {
					output->
						def fileName = "xxxxx.apk"
						if(variant.buildType.isDebuggable()) {
							fileName = "yyyy.apk"
						}
						def outputFile = output.outputFile
						File targetFile = new File(outputFile.parent, fileName)
						if (targetFile.exists()) {
							targetFile.delete()
						}
						if (outputFile != null && outputFile.name.endsWith(".apk")) {
							output.outputFile.renameTo(targetFile)
						}
				}
		}
	}
}
複製代碼

多渠道打包

android {
	productFlavors {
		google {
			applicationId "com.xxx.game.google"
			manifestPlaceholders.put("UMENG_CHANNEL", "google")
		}
	}
}
//manifest文件中使用
<meta-data android:value="${UMENG_CHANNEL}" android:name="UMENG_CHANNEL"/>
複製代碼

三、模塊化時使用

作模塊化框架時會遇到將module獨立成應用編譯運行,和將module看成libiary的狀況,而且使用不一樣的Manifest,不一樣的源碼

//isBuildModule定義的布爾值表明當前module要作lib仍是application
if (IsBuildModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

//配置相應的manifest
sourceSets {
    main {
        if (IsBuildModule.toBoolean()) {
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        } else {
            manifest.srcFile 'src/main/release/AndroidManifest.xml'
            //集成開發模式下排除debug文件夾中的全部Java文件
             java {
                    exclude 'debug/**'
           		  }
        }
    }
}
複製代碼
相關文章
相關標籤/搜索