#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. Мне нужно было бы изучить это подробнее, но мое первое предположение заключается в том, что запутанный путь к классу не соответствует тому, что вы объявили в манифесте. Не могли бы вы отметить ответ как правильный?