Android Studio Gradle(一)初步理解--群英传

一: Android Studio Gradle 构建项目

在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : tree,可以获取项目结构

项目结构的Gradle资源包含:
1,全局build.gradle : 控制每个module的编译过程
2,module的build.gradle
3,gradle.properties : 设置Gradle脚本中的参数
4,local.properties : Gradle的sdk相关环境变量配置
5,setting.gradle : 配置Gradle多项目管理

全局build.gradle :

最重要的是buildscript的部分代码

buildscript {
    // 指定使用的远程仓库
    repositories {
        jcenter()
        google()
    }
    // 指定依赖的Android Gradle 插件版本
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
    }
}

module的build.gradle

// apply 领域
// 指定这个module是一个Android Application
apply plugin: 'com.android.application'

// android 领域
// 指定构建过程中所用到的所有参数
android{
}

// dependencies领域
// 指定构建过程种所依赖的所有库
dependencies{
}


local.properties
指定项目使用的sdk路径

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Fri Oct 12 14:07:25 GMT+08:00 2018
ndk.dir=D\:\\working\\Android\\sdk\\ndk-bundle
sdk.dir=D\:\\working\\Android\\sdk

二: Android Studio Gradle 构建项目 Task

在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew task,可以获取项目所有task

在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew task -all,可以获取项目所有task之间的调用关系

需要了解掌握的基本task

  • assemble task : 用于项目组合输出,包含assembleDebug和assembleRelease
  • Check : 用于执行检查任务
  • Build : 组合命令,执行了check和assemble的所有工作
  • Clean : 清理所有的中间编译结果

三: Android Studio Gradle 更改项目结构

在android领域中进行配置 :

// 自定义项目结构
sourceSets{	
      main{
         java.srcDirs=['src']
         res.srcDirs=['res']
         assets.srcDirs=['assets']
         jni.srcDirs=['jni']
         jniLibs.srcDirs=['libs']
         manifest.srcDirs=['AndroidManifest.xml']
	
	// 也可以分类
	res.srcDirs=[
		'src/main/res/',
		'src/main/res/layout/activity',
		'src/main/res/layout/fragment'
	]	
     }
}

四 : Android Studio Gradle 构建项目配置

全局配置参数 :
在全局build.gradle中指定全局参数

ext{
	compileSdkVersion = 23
	buildToolsVersion = '23.0.2'
	minSdkVersion = 14
	targerSdkVersion = 23
	versionCode = 3
	versionName = '1.0.1'
}

引用全局参数配置 :

android{	
	compileSdkVersion rootProject.ext.compileSdkVersion
}

app module -> build.gradle -> android{} -> defaultConfig{}
构建开发配置信息

defaultConfig {
    applicationId "com.sheng.app"
    minSdkVersion 15
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
} 

// 可以动态控制versionName
def getCustomVersionName(){
}
versionName getCustomVersionName()

app module -> build.gradle -> android{} -> buildTypes{}
构建生成的Apk具备的功能,Log日志…

buildTypes {
      release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew build 可以在module的output/apk目录下生成apk文件

系统会默认生成3个apk文件,2个debug类型,1个release类型

自定义构建apk类型

buildTypes {
      release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    cys {
        // 为应用设置包名 : 默认包名 + .cys
    	applicationIdSuffix ".cys"
    }
}

在Android Studio 软件下 打开 Terminal终端 ,输入命令行 : gradle / gradlew clean 和 gradle / gradlew build 可以在module的output/apk目录下生成apk文件

系统会生成4个apk文件,2个debug类型,1个release类型,1个cys类型

自定义构建apk类型的继承

buildTypes {
      release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    // cys继承debug
    cys.initWith(buildTypes.debug)
    cys {
        // 为应用设置包名 : 默认包名 + .cys
     applicationIdSuffix ".cys"
    }
}

构建类型的参数如下 :

Property nameDefault values for debugDefault values for release / other
debuggabletruefalse
jniDebugBuildfalsefalse
renderscriptDebugBuildfalsefalse
rederscriptOptimLevel33
packageNameSuffixnullnull
versionNameSuffixnullnull
signingConfigandroid.signingConfigs.debugnull
zipAlignfalsetrue

构建signingConfigs
为应用签名,默认只有debug有签名

生成签名 :
Android Studio -> Build -> Generate Signed APK -> 输入签名相关信息 -> 获取到.jks签名文件

配置签名 :
在module -> build.gradle -> android{}

signingConfig{
	cys{
		storeFile file("xxx.jks")
		storePassword "123456"
		keyAlias "cys"
		keyPassword "123456"
	}
}

android{} 下可选配置 :

// 指定Java的编译版本
compileOptions{
	sourceCompatibility JavaVersion.VERSION_1_8
	targetCompatibility JavaVersion.VERSION_1_8 
}

// 控制Lint的代码检查
lintOptions{
	// Lint Check 发生Error的时候,是否继续编译
	abortOnError false
}

Gradle 动态参数配置
比如签名文件配置在android{}下,代码写死,这很不友好,所以一般会通过.properties 配置动态参数
首先打开gradle.properties,添加配置

systemProp.keyAliasPassword=123456
systemProp.keyAlias=cys
systemProp.keyStorePassword=123456
systemProp.keyStore=xxx.jks

使用 :

signingConfigs{
	cys{
		storeFile fileSystem.properties['keyStore']();
		storePassword System.properties['keyStorePassword']
		keyAlias System.properties['keyAlias']
		keyPassword System.properties['keyAliasPassword']
	}
}

或者
直接使用Key / Value
首先打开gradle.properties,添加配置

cys.KeyAlias=cys
cys.KeyAliasPassword=123456

使用 :

signingConfigs{
 cys{
  storeFile fileSystem.properties['keyStore']();
  storePassword System.properties['keyStorePassword']
  keyAlias System.properties['cys.keyAlias']
  keyPassword System.properties['cys.keyAliasPassword']
 }
}

或者
直接使用属性方式
首先打开gradle.properties,添加配置

pKeyAlias=cys
pKeyAliasPassword=123456

使用 :

signingConfigs{
 cys{
  storeFile fileSystem.properties['keyStore']();
  storePassword System.properties['keyStorePassword']
  keyAlias pKeyAlias
  keyPassword pKeyPassword
 }
}

系统参数
Gradle内置了很多系统级别的参数,这些参数可以在使用中直接获取值
使用 :

task printProperties{
	println project
	println project.name
	println project.buildDir
	println project.buildFile
	prinfln project.version
	println name
	println buildDir
	println path
}

输出

一些Gradle内置的系统变量

多渠道打包 :

流程 :
1,创建渠道占位符
在AndroidManifest 文件中的Application节点下,创建meta-data节点

<meta-data 
	android:name="PRODUCT"
	// ${CHANNEL_VALUE} 要进行的渠道占位符
	android:value="${CHANNEL_VALUE}"/>

2, 配置Gradle脚本
app module -> build.gradle -> android{}
添加productFlavors,并增加定义的渠道名,使用manifestPlaceholders指定要替换的渠道占位符的值

productFlavors{
	product1{
		manifestPlaceholders=[CHANNEL_VALUE:"PRODUCT1"]
	}
	product2{
		manifestPlaceholders=[CHANNEL_VALUE:"PRODUCT2"]
	}
	product3{
 	 	manifestPlaceholders=[CHANNEL_VALUE:"PRODUCT3"]
 	}
}

// 脚本优化
productFlavors.all{ flavor ->
	flavor.manifestPlaceholders = [CHANNEL_VALUE:name]
}

3, 终端执行gradle / gradlew build命令可以在module的output/apk目录下生成apk文件

生成重命名包:

对生成的apk包名进行重命名

// 获取所有的apk包
applicationVariants.all{ vatiant ->
	variant.outputs.each{ output ->
		// 判断文件是否是apk,是否是release版本
		if(output.outputFile != null && 
			output.outputFile.name.endsWith('.apk') && 
			'release'.equals(variant.buildType.name)){
			// 重命名
			def apkFile = new File(output.outputFile.getParent(),
				"CYSApp_${variant.flavorName}_ver${variant.versionName}.apk")
				output.outputFile = apkFile
		}
	}
}

不同版本添加不同代码

设置buildConfigField(类型,名称,值)

app module -> build.gradle -> android{} -> buildTypes{}

buildTypes{
	release{
		// 设置debug模式
		buildConfigField "boolean" "testFlag" "true"	
		// 设置app名称 需要删除string.xml下的app名称
		resValue("string", "app_name", "Release")
	}
	cys{
	 	buildConfigField "boolean" "testFlag" "false" 
	 	resValue("string", "app_name", "CYS")
	}
}

五 : Android Studio Gradle 多项目依赖

jar包依赖 :

module下都有lib文件夹,只需要把jar包放到lib文件夹下,右键选择"add as library" ,即可导入依赖

Android Studio 生成jar包

task makeJar(type : Jar){
	// 清空已经存在的jar包
	delete ‘lib/sdk.jar’
	// 指定生成的jar包
	baseName 'sdk'
	// 从class文件生成jar包
	from('build/intermediates/classes/debug/com/cys/')
	// 打包进jar包后的文件目录结构
	into('com/cys/')
	// 去掉不需要打包的目录和文件
	exclude('test/', 'BuildConfig.class', 'R.class')
	// 去掉R文件
	exclude { it.name.startsWith('R$'); }
}

so库依赖

需要在module/src/main 目录下创建一个jniLibs目录即可,开发者把对应的armeabi,armeabi-v7a等CPU文件拷贝过来,并添加相应的so文件

本地库项目依赖

创建module,在Android Studio -> Setting -> Project Structure 中,添加module依赖

远程仓库依赖

Gradle支持以aar的形式依赖远程服务器上的库项目

本地aar依赖

当开发者对一个module进行编译后,在它的module/build/outputs/aar/目录下,会生成相应的aar文件,使用的时候,直接在主项目中右键 new module -> import .aar packages即可

使用Gradle上传aar到Maven库

uploadArchives{	
	repositories{
		mavenDeployer{
			pom.groupId = GROUPID
			pom.artifactId = ARTIFACTID
			if(System.properties['isRelease'].toBoolean()){
					pom.version = VERSION
					repository(url : nexusRelease){
						authentication(userName : nexusUsername, password : nexusPassword)
					}
			}else {
				pom.version = "${ VERSION }-SNAPSHOT"
				repository(url : nexusSnapshots){
					authentication(userName : nexusUsername, password : nexusPassword)
				}
			}
			pom.project{
				description 'XXXXXX'
			}
		}
	}
}

同时,还需要在gradle.properties文件中进行参数的配置

GROUP_ID = com.xxx.xxx
ARTIFACT_ID=aaaa
VERSION=1.x.x
RELEASE_REPOSITORY_URL=maven url
nexusUsername = username
nexusPassword=password
systemProp.isRelease=true

最后在终端执行 gradle / gradlew uploadArchives ,就可以完成依赖库的上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值