0

Eclipseと最新のAndroidリリースに含まれているProGuardのビルドを使用して、Androidアプリを難読化しようとしていますが、重要なメソッドが削除され続けています。次のようなさまざまな除外を入力して、メソッドを保持するようにproguard.cfgファイルを編集してみました。

  • public 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ファイルの例です(中央近くの3つの「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を試しました...しかし、残念ながら、とにかく縮小します。私はまた、何時間も考えられる限り多くのバリエーションを試しましたが、私の方法を救うものは何もありません。

「donDontDeleteMePlease」をProGuardの怒りから救うにはどうすればよいですか?私のようにするには、その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 に答える