0

我正在使用 Eclipse 和最新的 Android 版本中包含的 ProGuard,试图混淆我的 android 应用程序,但它不断删除重要的方法。我尝试通过键入各种排除项来编辑 proguard.cfg 文件以保留方法,例如以下内容

  • 保持公共无效我的方法(字符串我的字符串)

  • 保持公共类 myInterface

  • 保持公共类 com.help.app.myInterface.**

但这些都不起作用。当我查看 usage.txt 文件时,方法仍然存在,我的应用程序无法运行。我不明白我做错了什么。我会很感激一些帮助。

这是我的班级的样子

package com.whoiam.whatido;

public class MainClass extends Activity {
    ......
    public void onCreate(Bundle savedInstanceState) {
        ....

    }

    ....
    ....

    final class myInterface {

        myInterface() {}    

        public void dontDeleteMePlease(String message) {
            ....

        }
        public void leaveMeBe(String message) {
            ...

        }


        .....

    }
    final class MyWebChromeClient extends WebChromeClient {
        @Override 
        public boolean onJsAlert(WebView view) {
            ....
        }
}

这是我的 proguard.cfg 文件的示例(除了靠近中间的三个“保持”之外,它是默认设置):

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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 com.android.vending.licensing.ILicensingService

-keep public class com.whoiam.whatido.myInterface.**

-keep public class com.whoiam.whatido.myInterface.** {
    <methods>;}

-keep public void leaveMeBe(String message);

-keepclasseswithmembernames class * {
    native <methods>; }

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

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

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String); }

-keep class * implements android.os.Parcelable {   public
static final
android.os.Parcelable$Creator *; }

我也试过 -dontshrink 因为我真的不希望我的代码被削减......但无论如何它都会缩小。我也连续几个小时尝试了尽可能多的变化,但没有什么能挽救我的方法。

如何从 ProGuard 的愤怒中拯救我的“donDontDeleteMePlease”?我需要在 proguard.cfg 文件中输入什么才能让它像我一样?

4

1 回答 1

1

这应该有效:

-keep class com.whoiam.whatido.MainClass$myInterface {
  public void dontDeleteMePlease(java.lang.String);
  public void leaveMeBe(java.lang.String);
}

请注意,内部类是用 a 指定的,$并且它不是公共的。

您可以在ProGuard 手册中找到更多信息和示例。

于 2011-06-09T22:30:47.467 回答