启用 Proguard 时,Xamarin Android 应用程序因缺少 google play 服务类而崩溃
Posted
技术标签:
【中文标题】启用 Proguard 时,Xamarin Android 应用程序因缺少 google play 服务类而崩溃【英文标题】:Xamarin Android app crashes with missing google play service classes when Proguard enabled 【发布时间】:2018-06-28 22:42:09 【问题描述】:在没有对我们的 Xamarin android 应用进行任何重大更改的情况下,昨天我们的发布版本开始在应用启动时崩溃:
没有找到类“com.google.android.gms.R$string”
我怀疑这是由于达到了某种班级人数限制。我在项目设置中检查了多 dex 选项,我还在 AndroidManifest.xml 的应用程序节点上设置了 android:name="android.support.multidex.MultiDexApplication",所以我不希望遇到任何类型限制。
无论如何,由于多 dex 支持不起作用,我的下一个尝试是让 Proguard 能够优化捆绑在应用程序中的类。我下载了最新的 proguard 文件(5.3.3)并将它们部署到 /android/sdk/tools/proguard。我更新了 proguard-android.txt 文件以包含以下几行:
-dontwarn sun.misc.Unsafe
-keep public class com.google.android.gms.* public *;
-dontwarn com.google.android.gms.**
但是,当应用启动并尝试使用谷歌位置服务时,应用会崩溃:
Xamarin 引起:java.lang.NoSuchMethodError: no non-static method “Lcom/google/android/gms/internal/zzbym;.getLastLocation(Lcom/google/android/gms/common/api/GoogleApiClient;)Landroid/location/Location;” 在 md5ecd6d76dd0054fab042915172720bf10.LocationService.n_onConnected(Native 方法)在 md5ecd6d76dd0054fab042915172720bf10.LocationService.onConnected(LocationService.java:35) 在 com.google.android.gms.common.internal.zzad.zzk(未知 来源:108)
我不确定我错过了什么,我认为上面的 keep 命令可以确保这些类仍然包含在内。我错过了什么?
【问题讨论】:
【参考方案1】:开始工作了...我在 Xamarin 项目的根目录中创建了一个 proguard.cfg 文件,将其构建操作更改为 ProguardConfiguration,然后将其内容设置为:
-keep class com.google.android.gms.** *;
-dontwarn com.google.android.gms.**
我必须用UTF8编码保存在TextEdit中,否则无法解析。
它仍然没有解释为什么多 dex 支持不起作用,但至少我们现在已经畅通无阻了......
【讨论】:
但是我相信这种用法会让你的应用变得更大,因为你保留了所有的类和成员 除此之外,您不能简单地在 Visual Studio 中更改它吗?一定要用notepad++之类的吗?以上是关于启用 Proguard 时,Xamarin Android 应用程序因缺少 google play 服务类而崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 Xamarin Studio 中启用 MultiDex 或 ProGuard 时出错
启用 Proguard 时,Xamarin Android 应用程序因缺少 google play 服务类而崩溃
为啥我的 Xamarin.Android 项目不能在启用 Proguard 的情况下构建:“java.exe”退出代码 1
Xamarin Java.exe 以代码 1 退出(Proguard 问题)
Xamarin proguard.ParseException:文件“Properties/proguard.cfg”的第 1 行中的未知选项“”