以前写过修改apk生成路径和文件名的文章, 如下:
AS–›Gradle 7.0.0/4.1.0/4.0/3.3/3.0 修改APK生成路径和文件名(附AAR修改方式以及分析过程)_com.android.build.gradle.internal.api.libraryvaria-CSDN博客
这种方法入侵了gradle,破坏了原有的gradle环境, 经常会导致如下问题的产生:
- Error loading build artifacts from: ...app/intermediates/apk_ide_redirect_file/debug/redirect.tx
- In plugin 'com.android.internal.version-check' type 'com.android.build.gradle.internal.tasks.ListingFileRedirectTask' property 'listingFile'
- 'output-metadata.json' which doesn't exist.
这一次, 换一种思路实现, 以便达到相同效果.
这次通过监听assembleXXX任务(用于生成apk)和bundleXXX任务(用于生成aab), 在任务结束之后, 通过脚本复制对应的产物到指定的目录(顺便修改文件名),即可达到相同的效果.
android {
    tasks.whenTaskAdded { task ->
        tasks.create('收集产物任务') {
            doLast {
               //开始收集产物
            }
        }
        task.finalizedBy('收集产物任务')//挂载任务
    }
}
怎么设置对应的产物名称
这里通过applicationVariants拿到flavor和buildType, 将产物名称关联到这2个参数上.
android {
    applicationVariants.all { variant ->
        variant.flavorName //关键信息flavor
        variant.buildType.name //关键信息buildType
    }    
}
    
使用flavor和buildType按照一定规则, 生成唯一的key, 然后把产物名称通过ext对象存储,rootProject.ext.setProperty(key, name), 方便之后在task中读取.
怎么读取设置的产物名称
Android打包时, 都有对应的打包gradle task, 这个task.name就会包含flavor和buildType信息, 只要从任务名称中分离出这2个参数, 然后和上一步对应上, 就可以取出设置好的产物文件名了.
思路大体就是上述内容, 我已封装成了在线脚本, 一键食用.
脚本支持特性
- 支持收集apk,并支持重命名
- 支持收集aab,并支持重命名
- 收集mapping.txt
- 收集usage.txt
- 收集seeds.txt
- 收集R.txt
- 收集configuration.txt
- 支持AGP 8.0+
- 支持AGP 8.0-
使用方式
在apply脚本之前, 先配置产物名称:
ext {
    APP_NAME = "xxx"
    apkName = "#an-#vn_#fn_#bn_#ka"
}
//可用参数: #an:app名字APP_NAME; #vn:版本名; #d:当天日期yyyy-MM-dd; #t:当天时间yyyy-MM-dd_HH-mm; #fn:风味名; #bn:编译类型名;
//         #sn:使用的签名名称; #ka:使用的签名别名;
在工程的build.gradle中加入脚本:
国内
apply from: 'https://gitee.com/angcyo/CollectProduct/raw/master/app/collectProduct.gradle'
国外
apply from: 'https://raw.githubusercontent.com/angcyo/CollectProduct/master/app/collectProduct.gradle'
参数配置
在gradle.properties文件中配置产物输出目录, 默认为根目录下的.apk文件夹:
apk_path='.apk'
群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.
联系作者
点此QQ对话 该死的空格 点此快速加群

开源地址



















