###app
// SourceSet类:管理源码、资源、库等 存放的位置 , android中的是 AndroidSourceSet类 , android中所有用到的路径,如java、manifest、assets、res等都可以在这里修改
android {
sourceSets {
main { // main 闭包对应main目录,在这之下可以做main目录下的文件路径指定
// 除了这样修改,还可以用变成的思想去修改res, 如 this.android.sourceSets.main.res.srcDirs ‘src/main/res’, ‘src/main/res-test’
res.srcDirs ‘src/main/res’, ‘src/main/res-test’ // 同设置so库的路径一样,多添加一个资源路径, 赋值方式用 =[] 和 空格 都可以
}
}
}
// plugin
apply plugin: ‘hj.media’ // 报找不到此插件,在 resource/META-INF/gradle-plugins/ 下右键 new Resource Bundle 生成 properties 文件就好了?
hjPlugin { // 在project中调用自定义插件中定义的闭包
hjversionName = rootProject.project(‘app’).ext.hjversionName // 对应自定义插件中的 ReleaseInfoExtension 的成员属性
hjversionCode = rootProject.project(‘app’).ext.hjversionCode // 直接使用 project(‘app’) 会报找不到app ,需要 rootProject.
hjversionInfo = rootProject.project(‘app’).ext.hjversionInfo
hjfileName = ‘testTask.xml’
}
// 变体 Variant
// 在 BaseExtension 类中能找到所有在 android {} 模块下的设置
// 在 BaseVariant 类中能找到所有android的task
// 变体共有三种:applicationVariants(只适用于app plugin,输出为apk) libraryVariants(只适用于library plugin,输出为aar) testVariants(两个plugin都适用)
// 这三个都会分别返回一个ApplicationVariant、LibraryVariant和TestVariant对象的DomainObjectCollection。
// 使用这三个collection中的其中一个都会触发生成所有对应的task。这意味着使用collection之后不需要更改配置。
// DomainObjectCollection可以直接访问所有对象,或者通过过滤器进行筛选
// 中文文档 http://avatarqing.github.io/Gradle-Plugin-User-Guide-Chinese-Verision/advanced_build_customization/manipulation_taskstask.html
this.afterEvaluate {
this.android.applicationVariants.all { ApplicationVariant variant -> // 因为app导入的插件为 'com.android.application' 所以变体类型为 ApplicationVariant
def name = variant.name // name=main_hjDebug
def baseName = variant.baseName // baseName=main_hj-debug
def buildType = variant.buildType // 编译类型,debug、release
def flavorName = variant.flavorName // 渠道名,在 android 的 productFlavors 模块中定义的
def output = variant.outputs.first() // variant.outputs返回虽然是一个list,但是size只有1
def outputFile = output.outputFile // 变体最终的输出文件的路径,因为app是ApplicationVariant,所以输出是一个apk,路径默认是 .\build\outputs\apk\ 下
def appName = "app-$variant.baseName-${variant.versionName}.apk" // 修改生成的apk名
// output.outputFile = new File('E:\\gradle', appName) // outputFile 为 read-only
println "variant : name=$name, baseName=$baseName, buildType=$buildType.name, flavorName=$flavorName, outputs=${variant.outputs.size()}"
SigningConfig sign = variant.signingConfig // 变体的签名信息,debug时签名信息如下注释,release时,如果android中没定义signingConfig,会返回null
if (sign!=null) {
def storeFile = sign.storeFile // storeFile=C:\Users\Administrator\.android\debug.keystore
def storePassword = sign.storePassword // storePassword=android
def keyAlias = sign.keyAlias // keyAlias=AndroidDebugKey
def keyPassword = sign.keyPassword // keyPassword=android
def v1SigningEnabled = sign.v1SigningEnabled // v1SigningEnabled=true
def v2SigningEnabled = sign.v2SigningEnabled // v2SigningEnabled=true
println "storeFile=$storeFile, storePassword=$storePassword, keyAlias=$keyAlias, keyPassword=$keyPassword, " +
"v1SigningEnabled=$v1SigningEnabled, v2SigningEnabled=$v2SigningEnabled"
}
// 获取变体中的task
def task = variant.checkManifest // 获取 checkManifest task ,checkManifest是项目构建prebuild task之后执行的task ,也可获取其他task
println task.name+", "+task.description // checkDebugManifest, null
}
}
###自定义插件
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
* 自定义插件
* */
class HjPlugin implements Plugin<Project> {
/**
* apply 函数是插件入口函数
* @param project 引入此插件的project对象
*/
@Override
void apply(Project project) {
println "hello hjplugin : "+project.name
project.extensions.create('hjPlugin', ReleaseInfoExtension) // 给project对象拓展名叫 hjplugin 的闭包
project.tasks.create('hjPluginTask', ReleaseInfoTask) // 给project对象添加task
}
}