【问题标题】:Control Proguard slimming of methods in AndroidAndroid中方法的Control Proguard瘦身
【发布时间】:2011-09-11 16:03:09
【问题描述】:

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

  • 保持公共 void myMethod(String myString)

  • 保留公共类 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 文件的示例(它是默认的,除了靠近中间的三个 'keep'):

-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 文件中输入什么才能让它像我一样?

【问题讨论】:

    标签: android function methods proguard slim


    【解决方案1】:

    这应该可行:

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

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

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

    【讨论】:

    • 一时间我认为它有效。但它仍然没有保留这些功能。我想停止一起减肥,但这似乎不起作用。我已经阅读了他们的手册并提出了简短的建议。在我看来,它正在删除谷歌告诉它保留的 com.android.vending.licensing.ILicensingService。非常固执,应该这么难:) 感谢您的帮助,如果您有任何其他想法,请告诉我。
    猜你喜欢
    • 2017-01-16
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多