如何在 Eclipse 中混淆我的代码? (安卓)

Posted

技术标签:

【中文标题】如何在 Eclipse 中混淆我的代码? (安卓)【英文标题】:How can I obfuscate my code in Eclipse? (Android) 【发布时间】:2014-04-14 20:21:59 【问题描述】:

我是 android 应用程序的新手。我编写了一个应用程序,需要在 Eclipse 中对其进行混淆。我尝试使用以下教程:

http://developer.android.com/tools/help/proguard.html

但是当我创建我的项目时,eclipse 没有生成任何“proguard.cfg”文件。我只有一个“project.properties”,它取消了以下行的注释。

proguard.config=$sdk.dir/tools/proguard/proguard-android.txt:proguard-project.txt

我把 sdk.dir 路径改为 sdk。我也没有 progurd-android.txt。对于初学者如何在android中混淆代码有什么明确的步骤吗? 或者您可以为我解释一下吗? 感谢您的帮助。

【问题讨论】:

【参考方案1】:

首先,您应该在 project.poperties 上注释掉这一行:

proguard.config=$sdk.dir/tools/proguard/proguard-android.txt:proguard-project.txt

那么你应该把你的规则写到 proguard-project.txt 这是来自http://proguard.sourceforge.net/#manual/examples.html的一个例子:

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar

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

-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.view.View 
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);


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

然后您应该签名并导出您的 apk。如果你不签名混淆是行不通的。

【讨论】:

谢谢,你是什么意思,当我把规则写在proguard-project.txt文件上的时候?最后一个问题,我只是取消注释您在 project.ptoperties 上提到的那一行?不需要其他改动吗? @user3266062 首先在 project.properties 文件中注释掉这个“proguard.config=$sdk.dir/tools/proguard/proguard-android.txt:proguard-project.txt”。然后将规则写入 proguard-roject.txt。你不能使用完全相同的代码。您应该根据您的课程对其进行修改。您应该签名并导出 apk 以进行混淆。您看不到项目中的混淆代码。它在 apk 中。 大家知道如何使用 proguard 重命名包名,以便在 APK 反编译时显示一些无意义的内容吗?【参考方案2】:

教程不是最新的。 proguard-project.txt 是正确的 proguard 配置文件(以前是 "proguard.cfg" )。

我不知道 proguard-android.txt 应该是什么... 在我的 project.properties 中它只说:

“proguard.config=proguard-project.txt”(proguard.project.txt 与属性文件位于同一文件夹中)并且可以正常工作...

【讨论】:

【参考方案3】:

要启用 ProGuard 使其作为 Ant 或 Eclipse 构建的一部分运行,请在 project.properties 文件中设置 proguard.config 属性。

proguard.config=proguard.cfg

将此添加到名为proguard.cfg 的文件中,并添加到您的项目根文件夹中。这是示例中的基本配置 (proguard-android.txt)。

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-dontoptimize
-dontpreverify

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * 
    native <methods>;


-keepclassmembers public class * extends android.view.View 
   void set*(***);
   *** get*();


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


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


-dontwarn android.support.**

然后运行您的应用程序。

Proguard 配置并不容易,尤其是当您有多个库时。

请参阅此处Proguard 和Android 开发者页面Android Proguard Description 上的文档。

【讨论】:

谢谢,但我的项目文件夹中没有任何 proguard.cfg 文件 你必须自己创建它!

以上是关于如何在 Eclipse 中混淆我的代码? (安卓)的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse IDE 中的混淆选项

如何用 Eclipse 混淆 Android 库项目?

如何通过 Eclipse 使用 Proguard 混淆 apk?

您如何从 Eclipse 内部制作签名和混淆的 android 版本?

如何在 Eclipse 中使用 Proguard 混淆 Android 库(.jar 文件)

如何编写安卓软件