Idea插件開發中使用ProGuard混淆代碼

配置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 就可以看到混淆後的執行效果了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章