gpt4 book ai didi

android - Proguard 和 Google SDK/Facebook SDK 缺少方法

转载 作者:行者123 更新时间:2023-11-30 00:22:07 26 4
gpt4 key购买 nike

我很难让我的客户的应用程序在启用混淆器的情况下进行编译(我在正确的文件夹中安装了最新版本的混淆器)。 --edit--:我没有使用最新版本,因为安装了多个副本并且构建脚本没有使用正确的版本。

我创建了一个 proguard.cfg解决大部分编译错误的文件。该应用程序针对最新的 android SDK (8) 并将 minSdk 设置为 21。

还有2个编译错误:

#1>PROGUARD : warning : com.google.android.gms.internal.zzx: can't find referenced method 'void addHeader(java.lang.String,java.lang.String)' in program class com.google.android.gms.internal.zzx$zza
#1>PROGUARD : warning : com.google.android.gms.internal.zzx$zza: can't find referenced method 'void setURI(java.net.URI)' in program class com.google.android.gms.internal.zzx$zza

在 stackoverflow 上,在 java 上,他们通过向 Graddle 添加一些东西来解决问题。在 Xamarin 上……你不能。

通过在 proguard 文件中添加一条 dontwarn 指令,我能够忽略这 2 条警告。然后它编译、部署和运行几乎正常。几乎所有应用程序都运行良好。
除了:
- Google 身份验证,崩溃
- facebook 身份验证,崩溃
- Google 位置( fuse )崩溃。

崩溃是由缺少方法引起的。 proguard 已删除的方法。

对于 Facebook :

NoSuchMethodError: no non-static method"Lcom/facebook/internal/CallbackManagerImpl;.onActivityResult(IILandroid/content/Intent;)Z"
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <e3048811891c45499b4d89daf4d10667>:0
at Java.Interop.JniEnvironment+InstanceMethods.GetMethodID (Java.Interop.JniObjectReference type, System.String name, System.String signature) [0x0005b] in <48117e3895d549baa70c8cbd8592b31c>:0
at Android.Runtime.JNIEnv.GetMethodID (System.IntPtr kls, System.String name, System.String signature) [0x00007] in <758a804725c84b16bcab28b784c87cae>:0
at Xamarin.Facebook.ICallbackManagerInvoker.OnActivityResult (System.Int32 requestCode, System.Int32 resultCode, Android.Content.Intent data) [0x00015] in <53b39e4821ad43cba06dc6bebd7ae5f1>:0
at Appname.Droid.Views.Signup.SignInActivity.OnActivityResult

对于谷歌验证:

NoSuchMethodError: no non-static method "Lcom/google/android/gms/auth/api/signin/internal/zzc;.silentSignIn(Lcom/google/android/gms/common/api/GoogleApiClient;)Lcom/google/android/gms/common/api/OptionalPendingResult;"

对于谷歌位置( fuse ):

NoSuchMethodError: no non-static method "Lcom/google/android/gms/internal/zzary;.requestLocationUpdates(Lcom/google/android/gms/common/api/GoogleApiClient;Lcom/google/android/gms/location/LocationRequest;Lcom/google/android/gms/location/LocationListener;Landroid/os/Looper;)Lcom/google/android/gms/common/api/PendingResult;"

我也尝试过使用 google play 服务的预览 nugets。没有运气。知道如何解决这些错误吗?

** 编辑 1 **使用评论中来自 John Douglas 的链接,以及来自 eugen 的答案中的链接,以及详细的诊断构建,在修复错误 2 小时后,proguard 文件终于可以在 Facebook 和 Google SDK 上正常工作了!

太多了!

最佳答案

这是来自 Android 4.23 的 Facebook SDK 的混淆器配置:

-keepclassmembers class * implements java.io.Serializable {
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

来源:facebook-android-sdk on Github

这是来自 Google Play 服务 11.2 的混淆器配置:

# Keep SafeParcelable value, needed for reflection. This is required to support backwards
# compatibility of some classes.
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
public static final *** NULL;
}

# Needed for Parcelable/SafeParcelable classes & their creators to not get renamed, as they are
# found via reflection.
-keep class com.google.android.gms.common.internal.ReflectedParcelable
-keepnames class * implements com.google.android.gms.common.internal.ReflectedParcelable
-keepclassmembers class * implements android.os.Parcelable {
public static final *** CREATOR;
}

# Keep the classes/members we need for client functionality.
-keep @interface android.support.annotation.Keep
-keep @android.support.annotation.Keep class *
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}

# Keep the names of classes/members we need for client functionality.
-keep @interface com.google.android.gms.common.annotation.KeepName
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
@com.google.android.gms.common.annotation.KeepName *;
}

# Keep Dynamite API entry points
-keep @interface com.google.android.gms.common.util.DynamiteApi
-keep @com.google.android.gms.common.util.DynamiteApi public class * {
public <fields>;
public <methods>;
}

# Needed when building against pre-Marshmallow SDK.
-dontwarn android.security.NetworkSecurityPolicy

# Needed when building against Marshmallow SDK.
-dontwarn android.app.Notification

# Protobuf has references not on the Android boot classpath
-dontwarn sun.misc.Unsafe
-dontwarn libcore.io.Memory

# Internal Google annotations for generating Proguard keep rules.
-dontwarn com.google.android.apps.common.proguard.UsedBy*

来源:com.google.android.gms:play-services-basement:11.2.0 来自 Google 存储库的 Artifact

Google Play 服务的 Proguard 设置也在 Set Up Google Play Services 中描述。 > 将 Google Play 服务添加到您的项目 > 其他。该配置看起来与库 .aar 中的有所不同,请先尝试这个。

关于android - Proguard 和 Google SDK/Facebook SDK 缺少方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46084657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com