Java 将Proguard与可运行的JAR文件一起使用
我正在尝试使用proguard创建一个可运行的JAR文件。当我使用Eclipse导出JAR时,一切都很好,我有一个很好的JAR文件 要进行obfuscate,我使用命令行和Java 将Proguard与可运行的JAR文件一起使用,java,eclipse,jar,proguard,Java,Eclipse,Jar,Proguard,我正在尝试使用proguard创建一个可运行的JAR文件。当我使用Eclipse导出JAR时,一切都很好,我有一个很好的JAR文件 要进行obfuscate,我使用命令行和 java -jar ${ANDROID_SDK}/lib/proguard.jar @proguard-project.txt 但是当我尝试运行创建的JAR时,我得到了响应 no main manifest attribute 我的proguard-project.txt如下 -injars bin/class
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>;
}
-injars箱/类
-injars libs
-outjars bin/classes\u processed.jar
-libraryjars proguard/android.jar
-顿瓦恩爪哇**
-保持类java**
-DontwarnJavax**
-保持类javax**
-dontwarn安卓**
-保持课堂秩序**
-dontwarn com.sun**
-保持类com.sun**
-dontwarn java.awt**
-dontwarn java.beans.beans
-dontwarn javax.security**
-保留类javamail.*{*;}
-保持类javax.mail.*{*;}
-保持类javax.activation.*{*;}
-保持类com.sun.mail.dsn.*{*;}
-保持类com.sun.mail.handlers.*{*;}
-保持类com.sun.mail.smtp.*{*;}
-保持类com.sun.mail.util.*{*;}
-保留类mailcap.*{*;}
-保留类mimetypes.*{*;}
-保持类myjava.awt.datatransfer.*{*;}
-保持类org.apache.harmony.awt.*{*;}
-保持类org.apache.harmony.misc.*{*;}
-dontnote
-不要翻转
-重新打包类“”
-允许访问修改
-优化!代码/简化/算术
-keepattributes*注释*
-保持公共类com.app.main{
公共静态void main(java.lang.String[]);
}
-keepclassswithmembers类*{
public(android.content.Context、android.util.AttributeSet);
}
-keepclassswithmembers类*{
public(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers类*扩展了android.content.Context{
public void*(android.view.view);
public void*(android.view.MenuItem);
}
-keepclassmembers类*实现android.os.Parcelable{
静态**创建者;
}
-keepclassmembers类**.R$*{
公共静态;
}
-keepclassmembers类*{
@android.webkit.JavascriptInterface;
}
任何帮助都将不胜感激ProGuard本身不会生成清单。 您必须手动创建一个,并将其包括在配置中,如下所示:
-injars path/to/your/resources-dir
-injars ...
-adaptresourcefilecontents **.MF
资源目录应包括使用以下目录结构的清单:
META-INF/Manifest.MF
如果还混淆了jar的主类,则需要添加以下配置:
-injars path/to/your/resources-dir
-injars ...
-adaptresourcefilecontents **.MF
嗨,谢谢你的帮助,我试过了,但还是得到了同样的结果。我尝试了它并没有混淆主类,但它确实产生了不同的结果。在混淆之前,manifest.mf文件看起来像清单版本:1.0类路径:。Main Class:com.app.Main在我混淆并使用winrar提取JAR并打开manifest.mf文件后,它现在看起来像是manifest版本:1.0由: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 main manifest attributed您是否添加了main Class属性(请参见此处)?