AWSMobileClient から on a null object reference… デバッグログが出力される

Androidアプリ開発で AWS Pinpoint を組み込もうとした際に、
Cognito を仕込んだ awsconfiguration.json が読み込まれないことがあったのでメモ。

前提として aws-android-sdk-mobile-client の 2.13.2 を gradle に設定するところから。

この状態でアプリ起動すると、下記のデバッグログが logcat に出力される。

2019-05-20 13:20:18.418 24381-24408/jp.co.pinpoint.test D/AWSMobileClient: getHostedUIJSON: Failed to read config
    java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject com.amazonaws.mobile.config.AWSConfiguration.optJsonObject(java.lang.String)' on a null object reference
        at com.amazonaws.mobile.client.AWSMobileClient.getHostedUIJSONFromJSON(AWSMobileClient.java:636)
        at com.amazonaws.mobile.client.AWSMobileClient.getHostedUIJSON(AWSMobileClient.java:655)
        at com.amazonaws.mobile.client.AWSMobileClient$2.run(AWSMobileClient.java:569)
        at com.amazonaws.mobile.client.internal.InternalCallback$1.run(InternalCallback.java:101)
        at java.lang.Thread.run(Thread.java:764)

とりあえず AWSMobileClient.java の実装を確認。
すると、、

JSONObject getHostedUIJSONFromJSON(final AWSConfiguration awsConfig) {
    final JSONObject mobileClientJSON = awsConfiguration.optJsonObject("Auth");
    if (mobileClientJSON != null && mobileClientJSON.has("OAuth")) {
        try {
            JSONObject hostedUIJSONFromJSON = mobileClientJSON.getJSONObject("OAuth");

            return hostedUIJSONFromJSON;
        } catch (Exception e) {
            Log.w(TAG, "getHostedUIJSONFromJSON: Failed to read config", e);
        }
    }
    return null;
}

ヌルポが throw されているのは json から “Auth” ノードを参照している部分。
というか、引数の awsConfig が無視されている?

と思ったら、

[MobileClient] Expose network failures during API calls · Issue #922 · aws-amplify/aws-sdk-android · GitHub
JSONObject getHostedUIJSONFromJSON(final AWSConfiguration awsConfig) {
    final JSONObject mobileClientJSON = awsConfig.optJsonObject("Auth");
    if (mobileClientJSON != null && mobileClientJSON.has("OAuth")) {
        try {
            JSONObject hostedUIJSONFromJSON = mobileClientJSON.getJSONObject("OAuth");

            return hostedUIJSONFromJSON;
        } catch (Exception e) {
            Log.w(TAG, "getHostedUIJSONFromJSON: Failed to read config", e);
        }
    }
    return null;
}

うん、2.13.4 で修正されていました。。
ちゃんと引数で受け取った awsConfig を見てくれている。

ということで build.gradle を修正

implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.13.4@aar') {
    transitive = true
}

これで logcat に問題のデバッグログが表示されなくなりました。

以上です!

コメント

タイトルとURLをコピーしました