【问题标题】:Xamarin Amazon IAP error using D8+R8 with Proguard in Release Failing but working DebugXamarin Amazon IAP 错误使用 D8+R8 和 Proguard 在 Release Failing but working Debug
【发布时间】:2021-01-03 21:37:18
【问题描述】:

我正在使用 Amazon 团队为 Xamarin.Android 项目提供的 AmazonIapV2Android.dll。我去年已经实现了它,并且已经成功地使用了 Dx+proguard,并使用了如下的 proguard 规则。亚马逊文档也建议了这些行。见link

-dontwarn com.amazon.**
-keep class com.amazon.** {*;} 
-keepattributes *Annotation*

最近我使用 d8+r8 使用相同的 proguard 文件更改了我的 xamarin.android 项目。一切,谷歌 iap 实现也很好,但亚马逊 IAP 开始抛出异常。

Jsonable.CheckForErrors (System.Collections.Generic.Dictionary`2[TKey,TValue] jsonMap) com.amazon.device.iap.cpt.AmazonException:java.lang.RuntimeException: 缺少类型参数。

在 com.amazon.device.iap.cpt.RequestOutput.CreateFromJson (System.String jsonMessage) [0x0002d] 在 :0 \n 在 com.amazon.device.iap.cpt.AmazonIapV2Impl+AmazonIapV2Base.GetProductData (com.amazon.device.iap.cpt.SkusInput skusInput) [0x00013] 在

我还将链接器用作用户和 sdk 程序集,这显然会触发混淆,并且链接器删除了一些方法,因为仅使用 Sdk 程序集或不使用链接,一切正常。 我已将 AmazonIapV2Android 添加为要跳过的链接器,但它没有帮助。

当我查看 RequestOutput.CreateFromJson 函数实现的代码实现时,如下所示。

using com.amazon.device.iap.cpt.json;

    namespace com.amazon.device.iap.cpt
    {
        public sealed class RequestOutput : Jsonable
        {
            public string RequestId{get;set;}        
           
            public static RequestOutput CreateFromJson(string jsonMessage)
            {
                try 
                {
                    Dictionary<string, object> jsonMap = Json.Deserialize(jsonMessage) as Dictionary<string, object>;
                    Jsonable.CheckForErrors(jsonMap);
                    return CreateFromDictionary(jsonMap);
                }
                catch(System.ApplicationException ex)
                {
                    throw new AmazonException("Error encountered while UnJsoning", ex);
                }
            }

Jsonable 在 dll 中的实现如下所示

namespace com.amazon.device.iap.cpt 
{
    public abstract class Jsonable 
    {
        public static Dictionary<string, object> unrollObjectIntoMap<T>(Dictionary<string, T> obj) where T:Jsonable  
        {
            Dictionary<string, object> jsonableDict = new Dictionary<string, object>();
            foreach (var entry in obj) 
            {
                jsonableDict.Add (entry.Key, ((Jsonable)entry.Value).GetObjectDictionary());
            }
            return jsonableDict;
        }

        public static List<object> unrollObjectIntoList<T>(List<T> obj) where T:Jsonable
        {
            List<object> jsonableList = new List<object>();
            foreach (Jsonable entry in obj) 
            {
                jsonableList.Add(entry.GetObjectDictionary());
            }
            return jsonableList;
        }

        public abstract Dictionary<string, object> GetObjectDictionary();
        
        public static void CheckForErrors(Dictionary<string, object> jsonMap)
        {
            object error;
            if (jsonMap.TryGetValue("error", out error))
            {
                throw new AmazonException(error as string);
            }
        }   
    }
}

我也尝试过使用带有以下设置的 linker.xml,但它也没有帮助。

<assembly fullname="AmazonIapV2Android">
    <namespace fullname="com.amazon.device.iap.cpt" />
    <namespace fullname="com.amazon.device.iap.cpt.log" />
    <namespace fullname="com.amazon.device.iap.cpt.json" />
</assembly>

当我为命名空间下以com.amazon 前缀开头的所有方法和成员定义keepclass 时,我无法弄清楚为什么要抛出异常。 知道这可能是什么原因吗?

编辑:刚刚进行了几次测试,我的初始评论略有错误。奇怪的方式应用程序正在使用链接器集“仅 SDK 程序集”进行调试,但在发布时它甚至无法使用“仅 SDK 程序集”

【问题讨论】:

    标签: xamarin.forms xamarin.android proguard


    【解决方案1】:

    显然,这是使用 R8 和 Amazon IAP 的一个已知问题。典型的亚马逊不关心和更新他们的包裹。特别是自 2016 年以来,Xamarin IAP 没有更新。 这是问题的链接 https://forums.developer.amazon.com/questions/205480/in-app-billing-not-working-since-android-studio-de.html

    https://issuetracker.google.com/issues/134766810

    目前有 3 种解决方法,

    1. 禁用 r8。不好的是没有混淆,没有优化。
    2. 使用 dx+proguard+multi dex 代替 d8+r8。这里有个问题,如果你用androidx,androidx库不能用dx+proguard,只能用d8+r8,你需要回去支持库。
    3. 我不确定,但亚马逊 website 声称它声称,它适用于 r8 但这可能适用于 android java 库而不适用于 xamarin。因为正如我所检查的那样,作为 jar 有更新的版本。理论上,您可以使用 Binding 库来获取新的 dll 并尝试,但我什至阅读了 Android Studio 项目,这不起作用。所以我尝试创建一个绑定库,它有很多错误,而且 api 似乎与 xamarin 不同。对于非盈利的应用商店来说,这是一个很大的努力。 这里也是 xamarin.android 上 github issue 的链接。

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2018-09-08
      • 1970-01-01
      • 2012-06-19
      • 2020-11-16
      • 2013-03-24
      • 2020-05-16
      • 1970-01-01
      • 2023-01-01
      相关资源
      最近更新 更多