【问题标题】:Issues with Proguard using Gradle in a non-Android project在非 Android 项目中使用 Gradle 的 Proguard 问题
【发布时间】:2015-01-21 14:50:30
【问题描述】:

我正在尝试使用 Proguard 混淆我的 Java 项目的代码。该项目是在 Intellij 上创建的,并使用 Gradle 2.2.1 进行了配置。我工作的计算机上有一个代理,因此 Intellij 无法访问 Internet。

我花了几个小时试图找到一个简单的例子来混淆我的代码。

我试过了:

task proguardTask(type: proguard.gradle.ProGuardTask) { println "ha"}
task proguardTask(type: proguard.gradle.ProGuardTask) << { println "ha"}

我每次都遇到异常:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':proguardTask'.
> Index: 0, Size: 0
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at proguard.ClassPath.get(ClassPath.java:77)

这是我的 build.gradle 文件:

// Configuration des library java
project.ext.LIBJava = [
        "project1",

        "project2", "project2",
        "project2_OS", "project2_UI",
        "project3",
        "project3_Windows"
]

//----------------------------------------------------------------------------------------------------------

ext.buildOnline = false
ext.buildOnlineMapsforge = false
ext.buildAndroid = false

//----------------------------------------------------------------------------------------------------------

apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'java'

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
        flatDir dirs: 'C:/Path/To/Proguard/proguard-5.1/lib'
    }
    dependencies {
        classpath ':proguard'
    }
}

def filterProjects(filter) { return subprojects.findAll { project -> filter.contains(project.name) } }


allprojects {
    group = 'org.libWin'
    version = '0.1.1'
}

// Configuration injection for all subprojects
subprojects {
    repositories {
        mavenLocal()
        mavenCentral()
    }
}

//----------------------------------------------------------------------------------------------------------

task proguardTask(type: proguard.gradle.ProGuardTask) {
    println "ha"
}

configure(filterProjects(project.LIBJava)) {
    apply plugin: 'java'

    dependencies {
        if (buildOnline) { // On-line
            testCompile group: 'junit', name: 'junit', version: 4.11           //  "$jUnitVersion"
        }
    }

    [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
}

有谁知道问题出在哪里?如何使用 Gradle 使用 Proguard 轻松混淆我的代码?

谢谢。

【问题讨论】:

    标签: java intellij-idea gradle proguard


    【解决方案1】:

    您必须在 Proguard 任务中指定 injars。

    例子:

    task proguard(type: proguard.gradle.ProGuardTask) {
        injars "build/libs"
    }
    

    【讨论】:

      【解决方案2】:

      我可以使用插件 proguard-gradle 混淆非 Android 项目。

      • 在文件中指定您的 proguard 配置(保留选项)

      • 指定输入和输出 jars

      • 指定项目引用的依赖项(jar)。

        buildscript {
         repositories {
             mavenCentral()
         }
         dependencies {
             classpath 'net.sf.proguard:proguard-gradle:6.0.3'
             classpath 'net.sf.proguard:proguard-base:6.0.3'
         }
        }
        def dependsDir = "${buildDir}/libs/dependencies/"
        def outputJar = "${buildDir}/libs/${rootProject.name}.jar"
        
        task proguard(type: proguard.gradle.ProGuardTask) {
        
         configuration 'proguard.conf'
         injars "${outputJar}"
         outjars "${buildDir}/libs/${rootProject.name}_proguard.jar"
        
         libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
         libraryjars "${dependsDir}"
        }
        
      • 将上述 gradle 任务添加到您的 build.gradle

      • 执行gradle proguard

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-01
        • 2018-04-21
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多