Proguard — не запутывать классы данных Kotlin

В моем проекте я использую AutoValue для своих старых классов моделей. Я начал использовать Kotlin и хочу использовать классы данных вместо AutoValue. Я хочу отключить запутывание для всех классов данных в моем слое данных, но продолжать запутывать другие классы в пакете.

Есть ли способ сделать это?

Я ожидаю, что в моем файле Proguard будет что-то подобное:

-keepclassmembers data class example.data_layer.** { *; }

person Mario Kutlev    schedule 07.09.2017    source источник


Ответы (4)


Чтобы решить эту проблему, я переместил классы моделей в пакет моделей и добавил новые ProGuard для пакета.

-keep class com.company.myfeature.model.** { *; }

Другим решением может быть использование @Keep annotation из библиотеки поддержки, чтобы отключить обфускацию для класс:

@Keep
data class MyRequestBody(val value: String)

Использование @Keep может вызвать проблемы, поскольку легко забыть добавить его для новых классов. .

Надеемся, что в будущем с помощью одного правила ProGuard появится способ отключить обфускацию для всех классов данных в пакете без необходимости иметь подпакет для классы моделей.

person Mario Kutlev    schedule 11.09.2017
comment
Я бы не хотел запутывания всех data classes - person Tobias; 05.02.2018
comment
Если вы используете @Keep и имеете вложенные классы данных, не забудьте добавить @Keep к каждому из них. - person Esdras Lopez; 17.04.2018
comment
как вы упомянули, напишите сохранить пакет [-keep class com.company.myfeature.model.** { *; } ] работает только на Java, не работает на Котлине. не могли бы вы помочь мне, спасибо - person Mahesh Kavathiya; 15.11.2018
comment
Я не понимаю, почему это не сработает. Proguard работает одинаково для Java и Kotlin. Вам нужна помощь Proguard — ищите другие вопросы по вашей проблеме. - person Mario Kutlev; 15.11.2018

Хотя аннотация @Keep работает, другой вариант — добавить @SerializedName к свойствам:

data class SomeDataClass(
    @SerializedName("prop1") val PropertyOne: String, 
    @SerializedName("prop2") val PropertyTwo: Boolean
)
person Suleyman    schedule 07.11.2019
comment
Не могли бы вы объяснить, что делает @SerializedName и как он решает проблему? - person user1114; 21.09.2020
comment
Так не пойдет. либо @Keep будет работать, либо необходимо добавить правило proguard, чтобы указать proguard не запутывать класс данных - person silwar; 25.02.2021

Я не уверен, что хранить весь класс данных хорошо или нет. но если это требование, нижеприведенное правило proguard будет работать. но это всего лишь обходной путь. Я предлагаю без уверенности. Пожалуйста, внимательно рассмотрите.

-keepclasseswithmembers class example.data_layer.** {
    public ** component1();
    <fields>;
}

У меня есть статья с более подробным объяснением: Как сделать Proguard сохранить класс данных Kotlin

person jeonghyeon kim    schedule 09.02.2020

я решаю свою проблему с помощью аннотации @Keep для всех классов моделей, которые анализируют данные ответа API

@Хранить

класс данных MyClass()

person Afif Alfahmi    schedule 25.06.2021