Android开发:如何在Gradle构建APK后调用Java方法?
解决Android Gradle构建后调用Java方法的几种方案
方案1:在Gradle任务中直接加载并调用已编译的Java类
如果你的MyClass是Android项目模块内的类,先确保它在assembleRelease执行前已完成编译,再通过Gradle脚本加载类并调用方法:
tasks.whenTaskAdded { task -> if (task.name == 'assembleRelease') { task.finalizedBy postApkProcess } } task postApkProcess { doLast { // 指定Android模块编译后的类文件目录 def classDir = file("${project.buildDir}/intermediates/javac/release/classes") // 将类目录添加到当前类加载器的路径中 this.class.classLoader.addURL(classDir.toURI().toURL()) // 加载目标类、实例化并调用方法 def myClass = Class.forName("com.yourpackage.MyClass") def instance = myClass.getDeclaredConstructor().newInstance() instance.postBuild() } }
注意替换com.yourpackage.MyClass为你实际的类全限定名;如果类依赖第三方库,需要把对应jar包路径也加到类加载器中。
方案2:用Exec任务执行Java main方法(无需Java插件)
直接通过Exec任务调用系统java命令,指定类路径和主类,彻底避免Java插件与Android插件的冲突:
tasks.whenTaskAdded { task -> if (task.name == 'assembleRelease') { task.finalizedBy postApkProcess } } task postApkProcess(type: Exec) { // 拼接类路径:编译后的类目录 + 依赖jar包(按需添加) def classpath = [ "${project.buildDir}/intermediates/javac/release/classes", // 若有第三方依赖jar,可追加路径: // "${project.rootDir}/app/libs/your-dependency.jar" ].join(System.getProperty('path.separator')) commandLine 'java', '-cp', classpath, 'com.yourpackage.MyClass' }
需要让MyClass包含main方法,示例如下:
public class MyClass { public static void main(String[] args) { postBuild(); } public static void postBuild() { // 你的APK后处理逻辑 } }
方案3:将Java逻辑迁移到Gradle脚本(Groovy/Kotlin)
如果处理逻辑不复杂,可直接把Java代码转换成Groovy(Gradle默认支持)代码,写在任务的doLast块中,无需额外Java类:
task postApkProcess { doLast { println "开始处理构建后的APK..." def apkFile = file("${project.buildDir}/outputs/apk/release/app-release.apk") if (apkFile.exists()) { // 示例:复制APK到指定目录 copy { from apkFile into "${project.rootDir}/release-apks" } } } }
内容的提问来源于stack exchange,提问作者The_Cuber7
相关产品推荐
相关产品推荐

