Ошибка запутывания - NoSuchMethodError: android.view.LayoutInflater.inflate - PullRequest
0 голосов
/ 05 октября 2011

Я использую LayoutInflater.inflate (int resourceId, группа ViewGroup), чтобы раздуть некоторые представления в моем приложении. Но когда я запускаю приложение после обфускации с помощью proguard, я получаю эту ошибку:

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

Это мой конфиг proguard:

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

Проблема исчезла. Но мне нужен первый случай. Не могли бы вы помочь мне найти решение этой проблемы?

Ответы [ 3 ]

0 голосов
/ 12 октября 2011

Этот конфиг proguard был сгенерирован с более старой версией Android SDK. обновите до последней версии инструментов сборки, и из командной строки перейдите в корневой каталог вашего проекта (каталог с AndroidManifest.xml в нем) и введите следующее:

Проект обновления Android -p.

Он должен сгенерировать новый файл конфигурации proguard для вас - вы можете проверить и убедиться, что экземпляры "keepclasseswithmembernames" изменяются на "keepclasseswithmembers" (я думаю, что есть и другие изменения, но не уверен). Посмотри, исправит ли это.

0 голосов
/ 06 ноября 2011

Обновление до последней версии ProGuard 4.6.У меня была похожая ошибка, когда я использовал ProGuard, который пришел (даже с самой последней) Android SDK, но это была не последняя версия ProGuard.Загрузите и замените его папкой proguard в папке [ANDROID_SDK] / tool / proguard.Это решило проблему для меня.Не уверен, что это также работает в вашем случае, мой не был связан с инфляторами, однако, я получил ошибку, где это просто не имело никакого смысла (со старой версией ProGuard).

0 голосов
/ 07 октября 2011

Скорее всего, проблема вызвана опцией -ignorewarnings.Вы должны посмотреть на предупреждения и попытаться их решить.При необходимости вы все равно можете указать -dontwarn для определенных классов, в которых вы уверены, что они никогда не использовались во время выполнения программы.

...