【问题标题】:Using Proguard with a runnable JAR file将 Proguard 与可运行的 JAR 文件一起使用
【发布时间】:2016-09-20 12:25:39
【问题描述】:

我正在尝试使用 proguard 创建一个可运行的 JAR 文件。当我使用 Eclipse 导出 JAR 时,一切正常,并且我有一个不错的 JAR 文件。

为了混淆我使用命令行和命令

java -jar ${ANDROID_SDK}/lib/proguard.jar @proguard-project.txt

但是当我尝试运行创建的 JAR 时,我得到了响应

no main manifest attribute

我的proguard-project.txt如下

-injars      bin/classes
-injars      libs
-outjars     bin/classes_processed.jar
-libraryjars proguard/android.jar

-dontwarn java.**
-keep class java.**

-dontwarn javax.**
-keep class javax.**

-dontwarn android.**
-keep class android.**

-dontwarn com.sun.**
-keep class com.sun.**

-dontwarn java.awt.**
-dontwarn java.beans.Beans
-dontwarn javax.security.**
-keep class javamail.** {*;}
-keep class javax.mail.** {*;}
-keep class javax.activation.** {*;}
-keep class com.sun.mail.dsn.** {*;}
-keep class com.sun.mail.handlers.** {*;}
-keep class com.sun.mail.smtp.** {*;}
-keep class com.sun.mail.util.** {*;}
-keep class mailcap.** {*;}
-keep class mimetypes.** {*;}
-keep class myjava.awt.datatransfer.** {*;}
-keep class org.apache.harmony.awt.** {*;}
-keep class org.apache.harmony.misc.** {*;}

-dontnote


-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-keep public class com.app.main {
    public static void main(java.lang.String[]);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

任何帮助将不胜感激

【问题讨论】:

    标签: java eclipse jar proguard


    【解决方案1】:

    ProGuard 本身不会生成清单。 您必须手动创建一个,并将其包含在您的配置中:

    -injars path/to/your/resources-dir
    -injars ...
    

    resource-dir 应包含使用以下目录结构的清单:

    META-INF/Manifest.MF
    

    如果还混淆了jar的主类,则需要添加如下配置:

    -adaptresourcefilecontents **.MF
    

    【讨论】:

    • 您好,感谢您的帮助,我试过了,但仍然得到相同的结果。我尝试了混淆和不混淆主类,但它确实产生了不同的结果。在我混淆我的 manifest.mf 文件之前,它看起来像 Manifest-Version: 1.0 Class-Path: 。 Main-Class: com.app.main 在我混淆并使用 winrar 提取 JAR 并打开 manifest.mf 文件后,它现在看起来像 Manifest-Version: 1.0 Created-By: 1.7.0_95 (Oracle Corporation)
    • 啊,我刚刚在提取 JAR 的顶层找到了我的 Manifest.MF,而不是在 META-INF 文件夹中 - 这可能是个问题吗?
    • 是的,这必须在 META-INF 目录中,否则它不会被识别为有效清单。我忘了提及这一点,因此您需要一个 -injars path/to/your/resource 目录,其中包含预期目录结构中的 META-INF/Manifest.MF 文件。
    • 您好,感谢您的快速回复,我现在可以在提取 jar 时看到 META-INF 文件夹中的 Manifest.MF 文件,但是我仍然收到错误 no i> 主要 清单 属性
    • 您是否添加了 Main-Class 属性(参见此处docs.oracle.com/javase/tutorial/deployment/jar/appman.html)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多