繁体   English   中英

intellij插件开发中的proguard问题

[英]proguard issue in intellij plugin development

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

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

到目前为止一切顺利,除了...

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

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

我曾经以为 proguard 更改了我的资源文件,但我不认为根据此链接更改了任何资源文件,因为我的 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();
    }

哦,我终于找到了解决方案。 所以最后proguard并没有改变我的资源文件,但它确实改变了我的资源文件夹

解决方案:

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

这是官方网站的报价

MissingResourceException 或 NullPointerException

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

这是-keepdirectories链接

引用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM