问题背景

最近在使用华为的AppGallery Connect(简称AGC)服务开发移动应用,发现在接入远程配置和认证服务的时候都遇到了code: 2 message: ONLY ONE String Field can be annotated as Url的错误。

远程配置的场景是在调用​​fetch​​​接口的时候,而认证服务是在调用​​signin​​接口的时候都会遇到此错误。

问题原因与分析

通过观察错误信息,我们发现一定是请求的时候url参数生成了多条,导致请求参数不合法。但是我们观察两个请求,fetch接口没有任何参数,而signin接口只需要传入之前生成的credential凭证,并没有url参数。根据之前接入AGC服务的经验,在接入服务之前需要在AGC的官网下载agconnect-services.json文件,文件中包含了应用和项目的基本信息,包括project id,appid, clientid等信息,其中就有url参数。

我的agconnect-services.json文件如下:

[华为SDK]ONLY ONE String Field can be annotated as Url问题处理办法AppGallery Connect_开发者

这个参数的作用就是指定了sdk的请求路径url。所以报错中的url应该指的就是这里的url。

但是文件是从官方下载的,为何会报错呢?我们要看下这个参数是如何使用的。AGC提供了一个叫AGCP的插件,在应用中集成这个插件就可以去读取文件中的各种参数,配合SDK中的方法,自动用于SDK的运行中。后来求助了华为的技术专家后,从他们那里得知AGCP的的工作原理就是将json文件中的键值对加密写在了应用的资源文件中,然后通过annotation去读取相应的内容。所以如果应用被混淆了,那就有可能读取错误获取读取不到相应的参数。这里就提醒我了,我使用了dexguard进行了应用的混淆。所以解决办法就是在混淆脚本中添加AGC相关的例外,语句如下:


-keep class com.huawei.agconnect.** {*;} -keepresourcexmlelements ** -keepresources */*


新版sdk下后两个可能已经不需要了,只需要第一行

-keep class com.huawei.agconnect.** {*;}

添加了这个例外后所有的请求就都成功了。

总结

接入AGC服务遇到报错:ONLY ONE String Field can be annotated as Url,而无相关url参数传递的,可以优先排查是否有.json文件中的参数混淆问题。

参考文档:

1. AGC认证服务开发指南:

​文档中心 | 华为开发者联盟​

2. AGC远程配置服务开发指南:

​https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-remoteconfig-introduction-0000001055149778​