Proguard:关于启用混淆的JobIntentService IllegalArgumentException

时间:2019-04-13 14:28:50

标签: android obfuscation android-proguard

当我为我的一个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但不起作用

2 个答案:

答案 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

由于类被混淆,似乎引发了异常。