当前位置:   article > 正文

[Gradle] 如何在android项目中对纯Java module使用release/debug build并启用proguard_android 编译 module 在release

android 编译 module 在release
如何在android项目中对纯Java module使用release/debug build并启用proguard?这里提供一种方法,
尽管不是很“好看”,但是可用。

假设app模块依赖lib模块,lib模块是一个纯Java模块(apply plugin: 'java')。整个过程可以分成两步。

引入Proguard

在lib模块的build.gradle里添加以下代码
  1. import proguard.gradle.ProGuardTask
  2. buildscript {
  3. repositories {
  4. mavenCentral()
  5. }
  6. dependencies {
  7. classpath 'net.sf.proguard:proguard-gradle:5.3.3'
  8. }
  9. }
  10. task proguardFiles(type: ProGuardTask, dependsOn: compileJava) {
  11. // 让jar这个task依赖于本task,后文会说明
  12. tasks.jar.dependsOn.add(proguardFiles)
  13. println "proguarding"
  14. // 配置ProGuardTask
  15. printmapping "$buildDir/mapping.txt"
  16. configuration 'proguard-rules.pro'
  17. libraryjars files(configurations.compile.findAll {}.collect())
  18. injars sourceSets.main.output
  19. // 设置输出路径,注意这里输出物为文件(不是默认的jar)
  20. outjars "$buildDir/libs/${project.name}"
  21. // 清除上次的生成物
  22. delete "$buildDir/libs/${project.name}"
  23. // 在本task的execute阶段,将混淆后的class文件替换正常class文件
  24. doLast {
  25. println "copying product:${sourceSets.main.output.classesDir}"
  26. // 删除原有的class文件
  27. delete "${sourceSets.main.output.classesDir}"
  28. // 将混淆class文件复制过去
  29. copy {
  30. from "$buildDir/libs/${project.name}"
  31. into "${sourceSets.main.output.classesDir}"
  32. }
  33. }
  34. }
这里做了几件事情:
  1. 定义proguard task,令jar这个java task依赖于它。即proguard task运行完毕后才运行jar。
  2. 使用文件替换的方式,在jar运行前替换掉class文件。
  3. 通过观察gradle console的输出,得知app在编译时会运行jar task。经过1.2.两步我们可以在正常编译
    流程中插入proguard处理后的class文件。
接下来看怎么样根据debug和release compile关闭或开启proguard

引入debug/release

在lib模块的build.gradle中加入如下代码:
  1. // 定义debug compile的回调函数
  2. void onDebug() {
  3. println " ----- onDebug ----- "
  4. // 在debug模式下,关闭混淆优化等一系列操作
  5. proguardFiles.dontobfuscate()
  6. proguardFiles.dontoptimize()
  7. proguardFiles.dontshrink()
  8. proguardFiles.dontpreverify()
  9. }
  10. // 定义release compile的回调函数
  11. void onRelease() {
  12. println " ----- onRelease -----"
  13. }
然后在app的build.gradl中加入如下代码:
  1. tasks.whenTaskAdded { task ->
  2. if (task.name == 'preReleaseBuild') {
  3. // release build
  4. task.doLast {
  5. def taskProject = rootProject.subprojects.findAll {it.name == "lib"}
  6. taskProject[0].onRelease()
  7. }
  8. } else if (task.name == 'preDebugBuild') {
  9. // debug build
  10. task.doLast {
  11. def taskProject = rootProject.subprojects.findAll {it.name == "lib"}
  12. taskProject[0].onDebug()
  13. }
  14. }
  15. }
这段代码做了两个事情:
  1. 监听了task的添加流程,在'preReleaseBuild'和'preDebugBuild'的execute阶段添加了代码逻辑。
  2. 在'preReleaseBuild'和'preDebugBuild'执行完后,执行lib模块中的onRelease或者onDebug方法。
综上,实现了在android项目中对纯Java module使用release/debug build并启用proguard。 注:本文默认读者具有gradle基础知识。

查看原文:http://legendmohe.net/2017/07/21/gradle-%e5%a6%82%e4%bd%95%e5%9c%a8android%e9%a1%b9%e7%9b%ae%e4%b8%ad%e5%af%b9%e7%ba%afjava-module%e4%bd%bf%e7%94%a8releasedebug-build%e5%b9%b6%e5%90%af%e7%94%a8proguard/
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1015825
推荐阅读
相关标签
  

闽ICP备14008679号