Фатальное исключение: java.lang.NullPointerException в сборке выпуска - PullRequest
4 голосов
/ 15 мая 2019

Я столкнулся со странной проблемой при сборке релиза приложения.Вот мое исключение

Fatal Exception: java.lang.NullPointerException`
throw with null exception
in.hopq.hopq.authentication.models.AppUpdateSourceDO$AppUpdate.getMinAllowedVersion (AppUpdateSourceDO.java:3)
in.hopq.hopq.authentication.activities.SplashActivity$onCreate$1.onChanged (SplashActivity.java:48)
in.hopq.hopq.authentication.activities.SplashActivity$onCreate$1.onChanged (SplashActivity.java:31)

Файл Pojo

data class AppUpdateSourceDO(
    @SerializedName("app_update")
    val appUpdate: AppUpdate,
    @SerializedName("message")
    val message: String,
    @SerializedName("success")
    val success: Boolean
) {
data class AppUpdate(
        @SerializedName("excluded_versions")
        val excludedVersions: List<ExcludedVersion>,
        @SerializedName("min_allowed_version")
        val minAllowedVersion: Int,
        @SerializedName("min_allowed_version_ios")
        val minAllowedVersionIos: String,
        @SerializedName("recommended_version")
        val recommendedVersion: Int?
) {
    data class ExcludedVersion(
            @SerializedName("version")
            val version: String
    )
}
}

Вот мой файл proguard

##OKHTTP3
-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-dontnote okhttp3.**
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*

Ответы [ 4 ]

8 голосов
/ 15 мая 2019

Наконец-то решили эту проблему.Это из-за новой обфускации кода R8.Просто отключите его в своем проекте, добавив его в файл gradle.properties

android.enableR8=false

Кроме того, вы добавите его в файл правил Proguard.

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

Однакодобавление этого в proguard действительно не сработало.

1 голос
/ 15 мая 2019

Полагаю, что вы получаете null в поле json min_allowed_version, потому что исключение четко набрано:

Fatal Exception: java.lang.NullPointerException throw with null 
exceptionin.hopq.hopq.authentication.models.AppUpdateSourceDO$AppUpdate.getMinAllowedVersion (AppUpdateSourceDO.java:3)

Это означает, что когда вы вызываете метод get для поля minAllowedVersion и он возвращает null - вы поймали NPE. Попробуйте использовать нуль-безопасность, и, возможно, все будет работать нормально.

data class AppUpdate(
        @SerializedName("excluded_versions")
        val excludedVersions: List<ExcludedVersion> = listOf(),
        @SerializedName("min_allowed_version")
        val minAllowedVersion: Int? = null,
        @SerializedName("min_allowed_version_ios")
        val minAllowedVersionIos: String? = null,
        @SerializedName("recommended_version")
        val recommendedVersion: Int? = null
)
0 голосов
/ 25 июля 2019

Если аннотация @SerializedName используется последовательно для классов данных, можно использовать следующее правило хранения

-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
 }

Если аннотация @SerializedName не используется, для каждого класса данных можно использовать следующее консервативное правило:

-keepclassmembers class MyDataClass {
  !transient <fields>;
 }

Для получения дополнительной информации, вы можете проверить ниже ссылку: -

https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md

0 голосов
/ 03 июля 2019

Кажется, GSON и R8 не очень хорошо работают вместе, и здесь написано о здесь :

На самом деле, следующее также должно работать:

-kemeclassmembers, allowobfuscation class * {@ com.google.gson.annotations.SerializedName;} -keep, allowobfuscation @interface com.google.gson.annotations.SerializedName

Это также сократит (запутает) имена полей и атрибута для дальнейшего уменьшения размера окончательного APK.

Кроме того, вы можете увидеть следующие правила в образце Gson :

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }

# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

##---------------End: proguard configuration for Gson  ----------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...