现象:
Debug 环境一切正常,APPID 获取正常,getToken 回调正常。 Release 环境 APPID 获取正常,getToken 回调 null,报错:
error 06-06 11:27:43.944 Appender LOG HwPushManagercom.huawei.hms.common.ApiException: 907135000: arguments invalid
at com.huawei.hms.aaid.constant.ErrorEnum.toApiException(Unknown Source:15)
at com.huawei.hms.opendevice.g.a(SourceFile:23)
at com.huawei.hms.opendevice.g.a(SourceFile:4)
at com.huawei.hms.opendevice.g.doExecute(Unknown Source:2)
at com.huawei.hms.common.internal.TaskApiCall.onResponse(Unknown Source:43)
at com.huawei.hms.common.HuaweiApi$RequestHandler$1.onCallback(Unknown Source:118)
at com.huawei.hms.common.HuaweiApi$RequestHandler$2.onCallback(Unknown Source:8)
at com.huawei.hms.common.internal.HmsClient$a.a(SourceFile:7)
at com.huawei.hms.common.internal.HmsClient$a.onComplete(Unknown Source:2)
at com.huawei.hms.adapter.BaseAdapter.a(SourceFile:15)
at com.huawei.hms.adapter.BaseAdapter.a(SourceFile:6)
at com.huawei.hms.adapter.BaseAdapter$BaseRequestResultCallback.a(SourceFile:21)
at com.huawei.hms.adapter.BaseAdapter$BaseRequestResultCallback.onResult(SourceFile:18)
at com.huawei.hms.adapter.BaseAdapter$BaseRequestResultCallback.onResult(SourceFile:1)
at com.huawei.hms.support.api.PendingResultImpl$d.b(Unknown Source:0)
at com.huawei.hms.support.api.PendingResultImpl$d.handleMessage(Unknown Source:18)
at android.os.Handler.dispatchMessage(Handler.java:117)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:293)
at android.app.ActivityThread.loopProcess(ActivityThread.java:9934)
at android.app.ActivityThread.main(ActivityThread.java:9923)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240)
解决思路:
一般 907135000 按照官方说法都是开发者没有配置正确,不是文件位置放错了就是 APPID 不对。 但我们 APP 在 Debug 没有问题(使用与 Release 相同的签名),Release 有问题,首先肯定是怀疑 R8 代码优化、资源压缩、开启严格模式导致的。
AGCP 源码中可以看见,其实它拿到agconnect-services.json文件之后,解析其中的数据并将其写入到了一个values.xml中,格式与 Android 中定义 strings 字符串时是一致的。
查看具体生成文件:
在 resources.txt 中搜索字符串,发现其被标记为unreachable,执行 shrinkReleaseRes 任务时会将其移除:
解决方法:
由于我们项目开启了资源压缩严格模式,在 raw/keep.xml 中添加 @string/agc_*的规则就可以了。
以下是我们项目中的 keep.xml 文件。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="
@integer/iv_one_login_return_id,
@drawable/one_login_checked,
@drawable/one_login_uncheck,
@string/agc_*,
"
tools:shrinkMode="strict" />
<!--one_login_* 中国移动一键登录 需要-->
<!--agc_* HMSCore 需要-->