2016-09-20 64 views
0

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

要obfusicate我使用命令行和命令

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>; 
} 

任何帮助,将不胜感激

回答

1

ProGuard本身不生成清单。 您必须手动创建一个,并且包括像这样在您的配置:

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

的资源目录应使用如下的目录结构包括清单:

META-INF/Manifest.MF 

如果您还混淆罐子的主要类,您将需要添加以下配置:

-adaptresourcefilecontents **.MF 
+0

嗨,感谢您的帮助,我试过这个,但我仍然得到相同的结果。我尝试了,但没有模糊主类,但它确实产生了不同的结果。 在我混淆我的manifest.mf文件之前,看起来像 Manifest-Version:1.0 Class-Path:。 主类:com.app.main 后,我模糊,我用winrar解压JAR并打开MANIFEST.MF文件现在看起来 清单-版本:1.0 创建-者:1.7.0_95(甲骨文公司) –

+0

啊,我刚刚发现我的Manifest.MF在提取JAR的顶层,而不是在META-INF文件夹 - 这可能是一个问题吗? –

+0

是的,这必须在META-INF目录中,否则它不会被识别为有效的清单。我忘了提及这一点,因此您需要一个-injars path/to/your/resource目录,它包含预期目录结构中的META-INF/Manifest.MF文件。 –