欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Idea插件开发中如何合理运用ProGuard混淆代码

最编程 2024-08-14 07:36:49
...

配置gradle插件

gradle配置ProGuard插件

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'net.sf.proguard:proguard-gradle:6.2.2'
    }
}

添加混淆task

// idea 依赖所在目录
def ideaPath = "xxx"

task proguard(type: proguard.gradle.ProGuardTask, dependsOn: jar) {
    // 输出混淆前->混淆后的映射
    printmapping "$buildDir/mapping.txt"
    // 混淆规则文件
    configuration 'proguard-rules.pro'
    
    // 项目依赖jar
    libraryjars configurations.runtimeClasspath.collect()
    // jdk 依赖,区分jdk8 前后版本
    if (System.getProperty('java.version').startsWith('1.')) {
        libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
    } else {
        libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
        libraryjars "${System.getProperty('java.home')}/jmods/java.desktop.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
    }
    // 如果使用了插件,附加插件jar
    libraryjars fileTree("$ideaPath/plugins/java/lib").filter { !it.name.startsWith("debugger") }.collect()
    // idea 依赖的jar
    libraryjars files("$ideaPath/lib")


    def f = jar.archiveFile.get().asFile
    def p = new File(f.parent, "tmp.jar")
    def outPath = f.absolutePath
    if (p.exists()) {
        p.delete()
    }
    if (f.exists()) {
        f.renameTo(p)
    }

    // 混淆输入
    injars p
    // 混淆输出
    outjars file(outPath)
}

配置task依赖关系

prepareSandbox.dependsOn("proguard")

配置混淆文件

保证plugin.xml中使用到的class不会被混淆就可以了

如果有design文件,保证使用class的不被混淆

一般的ui只需要添加下面这个keep就可以了

-keep class * extends javax.swing.JComponent

最后运行 runIde 就可以看到混淆后的执行效果了