0

LayoutInflater.inflate(int resourceId, ViewGroup group) を使用して、アプリの一部のビューを膨張させています。しかし、proguard で難読化した後にアプリを実行すると、次のエラーが発生します。

ERROR/AndroidRuntime(30511): java.lang.NoSuchMethodError: android.view.LayoutInflater.inflate

これは私のプロガード構成です:

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

-ignorewarnings

-libraryjars ...
-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 ...

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

アプリが次の行でクラッシュすることに気付きました。

setContentView(mLayoutInflator.inflate(mUiResources.getLayout(mUiResources.getIdentifier("main", "layout", mUiPackage)), null));

全体像:

String mUiPackage = mSettings.getString(mResources.getString(R.string.ui_package), getPackageName());
try {
    mUiResources = getPackageManager().getResourcesForApplication(mUiPackage);
} catch (NameNotFoundException e) {}

try {
    mUiContext = getApplicationContext().createPackageContext(mUiPackage, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
    mLayoutInflator = (LayoutInflater) mUiContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} catch (NameNotFoundException e) {}
setContentView(mLayoutInflator.inflate(mUiResources.getLayout(mUiResources.getIdentifier("main", "layout", mUiPackage)), null));

問題の文字列を変更した場合

setContentView(R.layout.main);

問題が消えました。しかし、私は最初のケースが必要です。この問題の解決策を見つけるのを手伝ってくれませんか?

4

3 に答える 3

0

そのproguard構成は、古いバージョンのandroidSDKで生成されました。ビルドツールの最新バージョンに更新し、コマンドラインからプロジェクトのルートディレクトリ(AndroidManifest.xmlが含まれるディレクトリ)に移動して、次のように入力します。

android updateproject-p。

新しいproguard構成ファイルが生成されます。「keepclasseswithmembernames」のインスタンスが「keepclasseswithmembers」に変更されていることを確認できます(他にも変更があると思いますが、確かではありません)。それで問題が解決するかどうかを確認してください。

于 2011-10-11T22:31:09.703 に答える
0

最新の ProGuard 4.6 にアップグレードします。付属の ProGuard (最新の Android SDK であっても) を使用したときに同様のエラーが発生しましたが、最新の ProGuard バージョンではありませんでした。ダウンロードして、[ANDROID_SDK]/tool/proguard の下の proguard フォルダーに置き換えます。これで問題は解決しました。あなたのケースでも機能するかどうかはわかりませんが、私のものはインフレータとは関係ありませんでしたが、(古い ProGuard バージョンでは) 意味をなさないというエラーが発生しました。

于 2011-11-06T14:56:36.300 に答える
0

ほとんどの場合、問題はオプションが原因-ignorewarningsです。警告を見て、それらを解決するようにしてください。必要に応じ-dontwarnて、プログラムの実行中に実際には使用されないことが確実な特定のクラスを指定することもできます。

于 2011-10-06T20:24:44.223 に答える