使用 android.support.v4.app 蜂窝兼容包导出签名应用时出现 Proguard 错误

Posted

技术标签:

【中文标题】使用 android.support.v4.app 蜂窝兼容包导出签名应用时出现 Proguard 错误【英文标题】:Proguard error when exporting signed app using android.support.v4.app honeycomb compatibility package 【发布时间】:2011-09-27 11:07:32 【问题描述】:

我在我的项目中使用 v4 兼容包,但是当我尝试导出已签名的应用程序时,我从 Proguard 收到以下消息。我整个晚上都在谷歌上搜索,但我没有找到解决这个问题的答案。

[2011-07-03 01:46:29 - worldscopeApp] Proguard returned with error code 1. See console
[2011-07-03 01:46:29 - worldscopeApp] Warning: android.support.v4.app.ActivityCompatHoneycomb: can't find referenced method 'void invalidateOptionsMenu()' in class android.app.Activity
[2011-07-03 01:46:29 - worldscopeApp] Warning: android.support.v4.app.ActivityCompatHoneycomb: can't find referenced method 'void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[])' in class android.app.Activity
[2011-07-03 01:46:29 - worldscopeApp] Warning: android.support.v4.view.MenuCompatHoneycomb: can't find referenced method 'void setShowAsAction(int)' in class android.view.MenuItem
[2011-07-03 01:46:29 - worldscopeApp]       You should check if you need to specify additional program jars.
[2011-07-03 01:46:29 - worldscopeApp] Warning: there were 3 unresolved references to program class members.
[2011-07-03 01:46:29 - worldscopeApp]          Your input classes appear to be inconsistent.
[2011-07-03 01:46:29 - worldscopeApp]          You may need to recompile them and try again.
[2011-07-03 01:46:29 - worldscopeApp]          Alternatively, you may have to specify the options 
[2011-07-03 01:46:29 - worldscopeApp]          '-dontskipnonpubliclibraryclasses' and/or
[2011-07-03 01:46:29 - worldscopeApp]          '-dontskipnonpubliclibraryclassmembers'.
[2011-07-03 01:46:29 - worldscopeApp] java.io.IOException: Please correct the above warnings first.
[2011-07-03 01:46:29 - worldscopeApp]   at proguard.Initializer.execute(Initializer.java:308)
[2011-07-03 01:46:29 - worldscopeApp]   at proguard.ProGuard.initialize(ProGuard.java:210)
[2011-07-03 01:46:29 - worldscopeApp]   at proguard.ProGuard.execute(ProGuard.java:85)
[2011-07-03 01:46:29 - worldscopeApp]   at proguard.ProGuard.main(ProGuard.java:499)

【问题讨论】:

***.com/a/17988163/1318946 【参考方案1】:

看起来 android.support.v4 中的某些类与 android 中的某些类不太兼容。如果您确定这不是问题,您可以指定

-dontwarn android.support.v4.**

ProGuard 将忽略这些问题并继续处理代码。

请参阅 ProGuard 手册 > 疑难解答 > 警告:找不到引用的字段/方法

【讨论】:

这对我也有效,而使用 **CompatHoneycomb 却没有。 Dianne Hackborn 在这里也提到了这个解决方案:plus.google.com/105051985738280261832/posts/K1tGvKG1NYv) 太棒了。现在添加到 Android SDK 附带的 proguard-android.txt 和 proguard-android-optimize.txt 中。【参考方案2】:

这是我在 proguard.cfg 中使用的:

-dontwarn **CompatHoneycomb
-keep public class * extends android.support.v4.app.Fragment

更笼统的是:

-dontwarn **CompatHoneycomb
-keep class android.support.v4.**  *; 

但它会导致更大的 APK 大小,所以只有在第一个不起作用时才使用。

【讨论】:

非常感谢!第二个解决方案完成了这项工作。顺便说一句,第三个选项是将项目构建目标更改为 API 级别 11 或更高。 我也需要这个:-dontwarn android.support.**【参考方案3】:

您应该将 android:targetSdkVersion 设置为 SDK >= honeycomb。

关于我正在使用这个的信息

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="13"/>

【讨论】:

以上是关于使用 android.support.v4.app 蜂窝兼容包导出签名应用时出现 Proguard 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 android.support.v4.app 蜂窝兼容包导出签名应用时出现 Proguard 错误

Android Studio 和 android.support.v4.app.Fragment:无法解析符号

android.support.v4.app.FragmentManager 还是 android.app.FragmentManager?

typeanumber 中的错误 - 无法解析 android.support.v4.app.fragment

无法将类型“Android.Support.V4.App.Fragment”转换为“Android.Gms.Maps.MapFragment”

android.support.v4.app.FragmentPagerAdapter 不能应用于 android.app.FragmentManager