构建Android项目时跳过dex流程 获取标准class类与依赖包
Gradle 7.3.3 适配方案:生成含全量class的标准Jar用于运行main方法
不需要调整现有Android构建的dex流程,直接在app模块添加独立自定义构建任务,在Java编译完成后、dex任务启动前收集所有业务class、依赖class,打包为标准JVM可识别的fat jar即可。
配置步骤
1. 添加自定义Gradle任务
打开app模块下的build.gradle文件,在文件末尾追加以下配置:
task fullClasspathJar(type: Jar) { archiveBaseName.set("main-runtime-classpath") archiveClassifier.set("all") // 收集debug变体编译产出的业务class文件(未经过dex转换) from android.applicationVariants.debug.javaCompileProvider.get().outputs.files // 收集所有debug运行时依赖的class、资源文件 from configurations.debugRuntimeClasspath.collect { entry -> entry.isDirectory() ? entry : zipTree(entry) } // 排除jar签名、校验类文件,避免运行main方法时触发安全校验报错 exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/MANIFEST.MF' // 声明任务依赖,确保编译完成、依赖解析完成后再执行打包 dependsOn configurations.debugRuntimeClasspath.buildDependencies dependsOn android.applicationVariants.debug.javaCompileProvider.get() }
2. 执行任务生成产物
在项目根目录执行以下Gradle命令:./gradlew :app:fullClasspathJar
任务执行完成后,产物存放在app/build/libs/main-runtime-classpath-all.jar路径下,该jar为标准Java字节码格式,未经过任何dex转换,包含:
- 所有业务代码的.class文件
- 全部第三方依赖(含ORMLite、androidx等)的.class文件
- 依赖包内合法的META-INF资源文件
3. 运行main方法
调用标准java命令时,直接将上述jar作为classpath传入即可,示例:java -cp app/build/libs/main-runtime-classpath-all.jar <你的main方法所在类的全限定名>
针对ORMLite生成表配置的场景,直接在main方法中调用官方TableConfig工具类即可,不需要额外补充依赖,所有类路径要求已经满足。
补充说明
- 该自定义任务和原有APK构建流程完全独立,不会修改assembleDebug/assembleRelease的原有产物,不会影响正常打包
- 如果需要基于release变体构建,将配置中所有
debug字段替换为release即可,注意需要临时关闭release的混淆配置,避免类名、注解被混淆导致ORMLite映射失败 - 该逻辑完全复刻旧版Android Studio自动生成Java运行配置的classpath拼接逻辑,避开了新版Android Studio使用废弃Gradle属性导致的运行崩溃问题
内容的提问来源于stack exchange,提问作者Kenny Wyland
相关产品推荐
相关产品推荐

