intellij插件开发中的proguard问题

时间:2020-08-15 10:00:45

标签: java intellij-idea proguard

我正在尝试使用ProGuard混淆我的intellij插件。

我正在向IntelliJ添加一些内部fileTemplates以创建新文件。 <RelatedTemplateName>是我添加到resources/fileTemplates/internal/<RelatedTemplateName>.ft

的文件名

到目前为止很好,除了...

在混淆插件中: IntelliJ代码在我的插件中找不到某些资源文件。

在未混淆的插件中: 一切正常。

我曾经以为proguard更改了我的资源文件,但我不认为根据此link更改了任何资源文件 ,因为我没有在proguard.pro文件中添加此类选项

有人会帮助我找出此问题的根本原因吗?谢谢

是因为proguard更改了与此相关的其他一些类吗?

下面的其他相关信息

例外

java.lang.Throwable: Template not found: <RelatedTemplateName>
    at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
    at com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl.getTemplateFromManager(FileTemplateManagerImpl.java:294)
    at com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl.getJ2eeTemplate(FileTemplateManagerImpl.java:279)
    at com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl.getInternalTemplate(FileTemplateManagerImpl.java:242)
    at XXX.XXX.XXX.createNewFile(MyNewFileAction.java:104)

我的proguard配置:

build.gradle文件的相关部分:

def getIDEAPath(){
    if(intellij.localPath!=null && !intellij.localPath.isEmpty()){
        return intellij.localPath
    }
    def ideTempPath = file("$gradle.gradleUserHomeDir/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIC/$intellij.version")
    def ideBasePath = ideTempPath;
    ideTempPath.traverse([maxDepth: 2, type: groovy.io.FileType.DIRECTORIES]) {
        it ->
            if (it.absolutePath.contains("lib")) {
                ideBasePath = file(it.absolutePath);
            };
    }
    return ideBasePath.parent
}


task myProguardTask(type: proguard.gradle.ProGuardTask, dependsOn: jar) {
    printmapping "build/mapping.txt"
    configuration 'proguard.pro'
    // Automatically handle the Java version of this build.
    if (System.getProperty('java.version').startsWith('1.')) {
        // Before Java 9, the runtime classes were packaged in a single jar file.
        libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
    } else {
        // As of Java 9, the runtime classes are packaged in modular jmod files.
        libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
        libraryjars "${System.getProperty('java.home')}/jmods/java.sql.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
        //libraryjars "${System.getProperty('java.home')}/jmods/....."
    }
    def ideaPath = getIDEAPath()
    libraryjars fileTree("$ideaPath/plugins/java/lib").filter { !it.name.startsWith("debugger") }.collect()
    libraryjars files("$ideaPath/lib")
    libraryjars files(configurations.compile.collect())

    def original = jar.archiveFile.get().asFile
    def obfuscated = new File(original.parent, "obfuscated.jar")

    injars original
    outjars file(obfuscated.path)
}

prepareSandbox.dependsOn(myProguardTask)

prepareSandbox.doFirst {
    def original = jar.archiveFile.get().asFile
    def obfuscated = new File(original.parent, "obfuscated.jar")
    if (original.exists() && obfuscated.exists()) {
        original.delete()
        obfuscated.renameTo(original)
    } else {
        println "error: some file does not exist, plugin file not obfuscated"
    }
}

我的proguard.pro文件的相关部分:

-adaptresourcefilecontents已被注释掉

-target 1.8
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
##-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-verbose

-keepclassmember class * {
    public <init>(***);
}

# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,
# along with the special 'createUI' method.
-keep class * extends javax.swing.plaf.ComponentUI {
public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}

-keepclassmembers class * implements java.io.Serializable {
        static final long serialVersionUID;
        private static final java.io.ObjectStreamField[] serialPersistentFields;
        !static !transient <fields>;
        !private <fields>;
        !private <methods>;
        private void writeObject(java.io.ObjectOutputStream);
        private void readObject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }

1 个答案:

答案 0 :(得分:0)

哦,我终于找到解决方案。因此,最后,proguard并未更改我的资源文件,但它确实更改了我的资源文件夹

解决方案:

我在proguard.pro文件中添加了-keepdirectories,以将所有目录保留在jar文件中。

这是official website

的引号

MissingResourceException或NullPointerException

您处理后的代码可能找不到某些资源文件。 ProGuard只需将资源文件从输入jar复制到 输出罐子。它们的名称和内容保持不变,除非您 指定options-adaptresourcefilenames 和/或-adaptresourcefile内容。此外,目录条目在 除非指定选项,否则不会复制jar文件 -keepdirectories。请注意,Sun建议不要为目录调用Class.getResource()(Sun Bug) #4761949](http://bugs.sun.com/view_bug.do?bug_id=4761949))。

这是-keepdirectories的{​​{3}}

报价

默认情况下,目录条目被删除。

相关问题