在Android Gradle项目中,我们可以通过编写自定义Java方法并将其挂载到Gradle构建生命周期的对应阶段,实现构建完成后的自定义处理逻辑,这种方式比直接修改Gradle脚本更灵活,也便于代码复用和维护。

集成前的环境准备
首先需要确认项目的Gradle版本和Android Gradle插件版本兼容,本文示例基于Gradle 7.5和Android Gradle Plugin 7.4.2,项目结构为标准的Android应用项目。我们需要在项目根目录的build.gradle文件中添加自定义Java代码的依赖配置,确保Gradle能够识别我们编写的Java类。
编写自定义Java方法类
我们可以在项目的buildSrc目录下创建自定义的Java类,buildSrc是Gradle默认的构建逻辑目录,里面的代码会在构建开始前被编译并加入到构建脚本的classpath中。
创建目录结构
在项目根目录创建如下目录结构:
- buildSrc
- src
- main
- java
- com
- custom
- build
编写自定义处理逻辑类
在com.custom.build目录下创建PostBuildHandler.java文件,编写我们需要的自定义Java方法:
package com.custom.build;
import org.gradle.api.Project;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PostBuildHandler {
// 自定义方法:修改生成的APK文件名,添加构建时间后缀
public static void renameApkWithBuildTime(Project project) {
// 获取构建时间格式化字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String timeSuffix = sdf.format(new Date());
// 遍历项目的所有APK输出文件
project.getTasks().matching(task -> task.getName().startsWith("package")).forEach(task -> {
task.doLast(t -> {
project.getBuildDir().toPath().resolve("outputs/apk").toFile().listFiles((dir, name) -> name.endsWith(".apk")).forEach(apkFile -> {
// 构造新的文件名
String newName = apkFile.getName().replace(".apk", "_" + timeSuffix + ".apk");
Path newPath = Paths.get(apkFile.getParent(), newName);
try {
Files.move(apkFile.toPath(), newPath);
project.getLogger().lifecycle("APK文件已重命名为: " + newName);
} catch (Exception e) {
project.getLogger().error("APK重命名失败: " + e.getMessage());
}
});
});
});
}
// 自定义方法:复制构建产物到指定目录
public static void copyBuildArtifacts(Project project, String targetDir) {
project.getTasks().matching(task -> task.getName().equals("assembleRelease")).forEach(task -> {
task.doLast(t -> {
File target = new File(targetDir);
if (!target.exists()) {
target.mkdirs();
}
// 复制release版本的APK到目标目录
project.getBuildDir().toPath().resolve("outputs/apk/release").toFile().listFiles((dir, name) -> name.endsWith(".apk")).forEach(apkFile -> {
try {
Files.copy(apkFile.toPath(), Paths.get(targetDir, apkFile.getName()));
project.getLogger().lifecycle("APK已复制到目标目录: " + targetDir);
} catch (Exception e) {
project.getLogger().error("APK复制失败: " + e.getMessage());
}
});
});
});
}
}
在Gradle构建脚本中挂载自定义方法
编写完成自定义Java类后,我们需要在对应的模块的build.gradle文件中引入这个类,并将方法挂载到构建流程的对应阶段。这里以app模块的build.gradle为例:
// 引入自定义类
import com.custom.build.PostBuildHandler
plugins {
id 'com.android.application'
}
android {
// 省略常规Android配置
compileSdk 33
defaultConfig {
applicationId "com.example.myapp"
minSdk 21
targetSdk 33
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
// 挂载构建后处理逻辑
afterEvaluate {
// 调用自定义Java方法,实现APK重命名
PostBuildHandler.renameApkWithBuildTime(project)
// 调用自定义Java方法,复制构建产物到指定目录,这里替换为实际的目标路径
PostBuildHandler.copyBuildArtifacts(project, "/Users/xxx/Desktop/build_output")
}
验证集成效果
完成上述配置后,我们可以在终端执行构建命令验证效果:
./gradlew assembleRelease
构建完成后,我们可以在app/build/outputs/apk/release目录下看到重命名后的APK文件,文件名会包含构建时间后缀,同时如果目标目录存在,对应的APK也会被复制到该目录中。
注意事项
- 自定义Java类如果放在
buildSrc目录下,修改后需要重新同步Gradle项目才能生效 - 如果自定义方法需要依赖第三方库,需要在
buildSrc目录下的build.gradle中添加对应的依赖 - 挂载方法时要注意构建生命周期的顺序,
doLast表示在对应任务执行完成后触发,确保构建产物已经生成 - 如果处理逻辑比较复杂,也可以将自定义Java类封装成Gradle插件,方便在多个项目中复用
构建后处理的逻辑不要过于复杂,避免影响构建效率,如果处理逻辑耗时较长,可以考虑异步执行或者放到构建完成后的单独脚本中运行。
Android_Gradle自定义Java方法构建后处理Gradle插件修改时间:2026-07-09 07:06:28