Gradle自动化构建(十一) Others

本文深入探讨了Gradle在Android项目中的应用,包括源码管理、自定义插件配置及变体Variant的详细解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

###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
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值