当我为我的一个Android库软件包启用Proguard时,它会在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但不起作用
答案 0 :(得分:0)
您必须保留Manifest.xml
中引用的所有类,例如:
-keep public class * extends android.app.Service
...否则,在指向软件包no such service
时,它可能会抱怨R
。
这还会保留JobIntentService
的实例,这不是这里的实际问题(这是因为Service
中引用的某些Manifest.xml
实例的类名已被混淆) 。关键是,JobIntentService extends Service
和任何Service
需要在Manifest.xml
中列出,因此使用通用规则比使用特定规则更有意义。
答案 1 :(得分:-1)
您需要指定JobIntentService的完整路径,proguard文件不支持导入:
-keepnames class * extends android.support.v4.app.JobIntentService
由于类被混淆,似乎引发了异常。