【发布时间】: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