Proguard: Исключение JobIntentService IllegalArgumentException при включении запутывания

#android #obfuscation #android-proguard

#Android #запутывание #android-proguard

Вопрос:

Когда я включаю Proguard для одного из моих пакетов библиотеки Android, это приводит к ошибке времени выполнения в коде JobIntentService. Службы в моем пакете расширяют JobIntentService и завершаются сбоем во время постановки в очередь, поскольку они запутываются под другим именем. Ниже приведена ошибка, где r — это служба

 java.lang.IllegalArgumentException: No such service ComponentInfo{com.example.package/com.example.foo.r}
    at android.os.Parcel.readException(Parcel.java:2008)
    at android.os.Parcel.readException(Parcel.java:1950)
    at android.app.job.IJobScheduler$Stub$Proxy.enqueue(IJobScheduler.java:211)
    at android.app.JobSchedulerImpl.enqueue(JobSchedulerImpl.java:53)
 

Почему возникает это исключение? Существует ли общий способ сохранения имен классов, расширяющих JobIntentService?

Пробовал -класс keepnames * расширяет JobIntentService, но не работает

Ответ №1:

Вы должны сохранить все классы, на которые ссылаются Manifest.xml , например, в:

 -keep public class * extends android.app.Service
 

… в противном случае он может пожаловаться no such service , указывая при этом на пакет R .

Это также сохраняет экземпляры JobIntentService , что здесь не является реальной проблемой (которая заключается в том, что имя класса некоторого Service экземпляра, на который ссылается ссылка, Manifest.xml было запутано). Дело в том, что JobIntentService extends Service и любые Service другие должны быть перечислены в Manifest.xml и, следовательно, использование общих правил имеет больше смысла, чем использование конкретного правила.

Ответ №2:

Вам необходимо указать полный путь к JobIntentService, файлы proguard не поддерживают импорт: -keepnames class * extends android.support.v4.app.JobIntentService

Исключение, по-видимому, генерируется из-за того, что класс запутан.

Комментарии:

1. Спасибо, это сработало. Не могли бы вы также объяснить, почему возникает исключение?

2. Только что обновил его. Почему голосование против, если оно правильное и решило проблему, с которой вы столкнулись?

3. Но как работает загрузка класса, если он запутан? Отрицательный результат не от меня.

4. Мне нужно было бы изучить это подробнее, но мое первое предположение заключается в том, что запутанный путь к классу не соответствует тому, что вы объявили в манифесте. Не могли бы вы отметить ответ как правильный?