Dam*_*wal 19 eclipse obfuscation android jar proguard
我已经看过很多关于如何在Eclipse中使用ProGuard来混淆Android应用程序(.apk文件)的帖子.另请参阅http://developer.android.com/guide/developing/tools/proguard.html:
"当您在发布模式下构建应用程序时,无论是通过运行ant发布还是使用Eclipse中的导出向导,构建系统会自动检查是否设置了proguard.config属性.如果是,ProGuard会自动处理应用程序的字节码在将所有内容打包成.apk文件之前."
但是如果使用Eclipse导出向导在.jar文件中导出Android项目,请按照上述步骤(创建文件proguard.cfg,在文件default.properties中将proguard.config属性配置为proguard.cfg,使用导出向导)似乎没有用 - 我在生成的jar文件中看不到类名等的混淆.我的proguard.cfg文件中也有以下设置,但是我在项目目录或proguard目录中看不到任何输出文件(甚至没有创建该目录).
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
Run Code Online (Sandbox Code Playgroud)
我甚至在我的项目目录中使用以下行创建了一个文件project.properties,但这似乎并没有引起ProGuard的采取行动:
proguard.config=proguard.cfg
Run Code Online (Sandbox Code Playgroud)
此项目中未定义任何活动.我在Windows上使用Android 2.3.1和Eclipse Galileo 3.5.2.与Android 3.0相同的结果.似乎混淆步骤必须以某种方式在Eclipse导出向导中明确插入.我将不胜感激任何帮助或见解.谢谢.
joh*_*doe 18
正如上述答案之一的评论中所建议的那样(但我最初没有注意到,因为它被埋在其中一个"附加评论"中)......
我们只是在eclipse 之外的库上运行progruard(参见下面的第一个块),我们的proguard.cfg文件中的第二个块中的参数(绝对不使用-dontpreverify,或者将项目用作android库的项目)由于您的project.jar中的StackMapTable问题,将无法正确混淆.
命令行:
$ java -jar $ANDROID_SDK/tools/proguard/lib/proguard.jar \
-libraryjars $ANDROID_SDK/platforms/android-18/android.jar @proguard.cfg
-outjars /tmp/project.jar -verbose
Run Code Online (Sandbox Code Playgroud)
proguard.cfg:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn our.company.project.R*
-injars bin/project.jar
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep class org.apache.3rdparty.stuff.**
-keep public class our.company.project.ProjectAPI
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keepclassmembers public class our.company.project.ProjectAPI {
public static <fields>;
}
-keepclasseswithmembernames class * {
native <methods>;
}
-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.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
Run Code Online (Sandbox Code Playgroud)
可能不是所有的参数和-keep项都是严格必要的(除了没有-dontpreverify像前面提到的那样使用),但是如果你在库中有一个Activity类扩展,那么大多数这些对我来说都是有意义的.出口.
小智 11
我使用间接方式生成导出的android混淆jar,我的方法是:
导出签名的apk使用eclipse
解压缩apk,找到classes.dex
使用dex2jar.bat,将classes.dex更改为jar
解压缩jar并删除不需要的类,然后压缩它并将文件名更改为XXX.jar
然后你在其他项目中使用这个jar,或者把它交给客户,它是混淆的!
我相信这会对你有所帮助!好好享受!
java -jar proguard.jar @yourconfig.pro
Run Code Online (Sandbox Code Playgroud)
yourconfig.pro(从http://proguard.sourceforge.net/index.html#manual/examples.html扩展):
-injars yourjar.jar
-outjars yourjar_out.jar
-libraryjars 'C:\android\sdk\platforms\android-10\android.jar'
-printmapping mapping.txt
-verbose
-dontoptimize
-dontpreverify
-dontshrink
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class * {
public protected *;
}
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
Run Code Online (Sandbox Code Playgroud)
结果可以用jd-gui验证
调用 ProGuard 的方法相当简单:
proguard.config=proguard.cfg到project.properties默认的 proguard.cfg 文件应该已由新项目向导自动创建。
| 归档时间: |
|
| 查看次数: |
26034 次 |
| 最近记录: |