署名したAPKでgsonによるパースが行なえない
環境:kotlin 1.2.51 / gson 2.4 / okhttp 3.10 retrofit 2.4
RetrofitとokhttpでWebAPIからjsonデータを取得しconverterでdata classに格納しています。
debug/releaseモードではdata classのメンバに正常に格納されるのですが、Android StudioのGenerate Signed APKで署名したAPKだと正常に格納されません。
以下、コードを記載します。
class ServiceGenerator {
companion object {
fun create(auth: Boolean = false) : Router {
val client = httpClientBuilder(auth)
val gson = GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
val adapter = RxJava2CallAdapterFactory.createAsync()
val baseUrl = LocalConfigManager.getProperty(ConfigConstants.KEY_BASE_URL)
return Retrofit.Builder()
.baseUrl(baseUrl!!)
.addCallAdapterFactory(adapter)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build()
.create(Router::class.java)
}
private fun httpClientBuilder(auth: Boolean): OkHttpClient {
val client = OkHttpClient.Builder()
client.addNetworkInterceptor(HeaderInterceptor())
if (auth)
client.addNetworkInterceptor(AuthorizationHeaderInterceptor())
client.protocols(Arrays.asList(Protocol.HTTP_1_1))
if (BuildConfig.DEBUG) {
val logger = HttpLoggingInterceptor()
//logger.level = HttpLoggingInterceptor.Level.HEADERS
logger.level = HttpLoggingInterceptor.Level.BODY
client.addNetworkInterceptor(logger)
}
return client.build()
}
}
interface Router {
@GET("/api/v2/settings")
fun settings() : Observable<Response<Foo>>
}
data class Settings(val version: Int, @SerializedName("settings") val details: Setting)
data class Setting(
val categories: List<Category> = listOf(),
val personalEntries: List<PersonalEntry>)
呼び出し元
ServiceGenerator
.create()
.beaconContents()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.isSuccessful){
it.body()?.let { data ->
Log.d(TAG, Integer.toString(data.version)) <= 署名APKでは0になる。debug/releaseモードでは2になる。
if (data.beaconContents == null) <=署名APKではnullになる。署名APKではデータが配列で格納される。
Log.e(TAG, "beacon contents is null.")
contentModel?.save(data.beaconContents)
}
}else{
when(it.code()){
404 -> Log.e(TAG, "not found.")
}
}
},
{
Log.e(TAG, it.localizedMessage)
})
APIで取得されたjsonデータ
{"version":2,"settings":{"categories":[{"id":1,"disp_no":1," ..... }
上記のコード中、呼び出し元のsubscribe内でログを出すと署名APKではversion==0にcategories==nullになります。
同じような経験された方で、解決方法をご存知の方いらっしゃいますか?