не могу найти ссылочный класс с Proguard и Kotlin

У меня странная проблема с прогардом и котлином. Я постепенно конвертирую защищенный проект в kotlin - до сих пор все шло хорошо, но при преобразовании определенных классов я получаю ошибки proguard. Я еще не мог выделить, в чем особенное свойство этих классов, поэтому оно ломается - кажется, они ничем не отличаются от других. В качестве примера InputStreamWithSource просто:

package org.ligi.passandroid.model

import java.io.InputStream

class InputStreamWithSource(val source: String, val inputStream: InputStream)

и он полностью работает в среде IDE - я могу развернуть его на устройстве - также все тесты пользовательского интерфейса работают нормально. Просто при попытке собрать проект я получаю непонятные ошибки proguard:

Warning: org.ligi.passandroid.ui.FileUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.FileUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassViewActivityBase$UpdateAsync: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassViewActivityBase$UpdateAsync: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.PassViewActivityBase$UpdateAsync: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.SearchPassesIntentService: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassController: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassController: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassDialog: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassDialog: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassDialog$1AlertDialogUpdater: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource
Warning: org.ligi.passandroid.ui.UnzipPassDialog$1AlertDialogUpdater: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource

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

Я могу обойти эту проблему, добавив keep class / enum для этих классов в proguard-config, но вопрос в том, почему это необходимо для этих классов - IMHO это не должно быть нужно

У кого-нибудь есть идея, что может вызвать это или как лучше всего исследовать эту проблему? Полный исходный код находится здесь: https://github.com/ligi/PassAndroid


person ligi    schedule 25.05.2016    source источник


Ответы (1)


Я бы удостоверился, что у меня есть собственный пакет, определенный в proguard - примерно так:

-dontwarn org.ligi.passandroid.**
-keep class org.ligi.passandroid.** { *; }
person Ray Hunter    schedule 20.02.2017
comment
Если так сделаешь, то прогард вообще нет смысла запускать - person Greg Ennis; 17.02.2018
comment
@GregEnnis для вас собственный код, который подойдет, так как любой неиспользуемый код следует удалить из проекта. Сторонний код - это другая история. - person Ray Hunter; 18.02.2018
comment
@GregEnnis прав. Если вы хотите использовать proguard не только для оптимизации (о чем вы, вероятно, имеете в виду), но и для обфускации, вам не следует этого делать, поскольку он оставит весь ваш собственный код как есть, понятный для чтения для всех, кто получит ваш APK. - person ubuntudroid; 15.05.2019
comment
@ubuntudroid -keep означает, что вы сохраняете классы в пакете и не можете удалить их с помощью программы proguard. Specifies classes and class members (fields and methods) to be preserved as entry points to your code. guardsquare.com/en/products/proguard/manual/usage не имеет ничего общего с запутыванием вашего кода. Параметры запутывания guardsquare.com/en/products/proguard/manual/ - person Ray Hunter; 15.05.2019
comment
@RayHunter Я поправляюсь - моя плохая. Спасибо за ссылки! :) - person ubuntudroid; 16.05.2019