2011-10-04 140 views
0

我正在使用LayoutInflater.inflate(int resourceId,ViewGroup组)来夸大我的应用程序中的一些视图。但是,当我困惑后运行的应用程序使用ProGuard我得到这个错误:混淆错误 - NoSuchMethodError:android.view.LayoutInflater.inflate

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

问题消失。但我需要第一个案例。你能帮我找到解决这个问题的办法吗?

+0

您是否使用android工具自动生成的cfg文件? –

+0

是的。我正在使用自动生成的cfg文件,对我的库和一些类进行了一些更改,以便公开他们的字段和方法 – MistaGreen

+0

您可以发布整个事情吗? –

回答

0

最有可能的是,问题是由选项-ignorewarnings造成的。你应该看看警告并尝试解决它们。如有必要,您仍然可以为特定类别指定-dontwarn,这些类别您确定在执行程序期间从未实际使用过它们。

0

该proguard配置生成与旧版本的android SDK。更新到构建工具的最新版本,并通过命令行导航到你的项目(有AndroidManifest.xml中在它的目录)的根目录,然后键入以下内容:

android update project -p .

应该产生一个新的你可以检查并确保“keepclasseswithmembernames”的实例更改为“keepclasseswithmembers”(我认为还有其他更改,但不确定)。看看是否修复它。

+0

我尝试了,但没有帮助。我反编译的应用程序,发现mLayoutInflator.inflate(mUiResources.getLayout(mUiResources.getIdentifier(“main”,“layout”,mUiPackage)),null)变成l1.inflate(XmlRecourceParser,null)。我不明白为什么Android会看到这种方法。方法可从1 api级别:[LayoutInflator](http://developer.android.com/reference/android/view/LayoutInflater.html) – MistaGreen

+0

我正在使用您的proguard配置运行您的代码,并且只是没有看到此问题。您是否尝试过*没有* proguard?可能值得验证的是,问题实际上是在混淆步骤。 –

+0

没有proguard所有的工作完美。 – MistaGreen

0

升级到最新的ProGuard 4.6。当我使用ProGuard(即使是最新的)Android SDK时,也出现了类似的错误,但它不是最新的ProGuard版本。使用[ANDROID_SDK]/tool/proguard下的proguard文件夹下载并替换它。这解决了我的问题。不知道它是否也适用于你的情况,我的与充气器无关,但是,我发现一个错误,它没有任何意义(使用旧的ProGuard版本)。