我在我的Android应用程序中遇到了一些奇怪的行为,并且无法在Stackoverflow或其他任何地方找到解决方案。
当我将Android应用程序从Eclipse加载到手机上时,它可以正常工作,没有错误。但是当进行签名后,我在Logcat中看到了以下错误:
E/DatabaseUtils(2360): Writing exception to parcel
E/DatabaseUtils(2360): java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
E/DatabaseUtils(2360): at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13140)
E/DatabaseUtils(2360): at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2038)
E/DatabaseUtils(2360): at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:607)
E/DatabaseUtils(2360): at android.content.ContentProvider$Transport.call(ContentProvider.java:279)
E/DatabaseUtils(2360): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273)
E/DatabaseUtils(2360): at android.os.Binder.execTransact(Binder.java:388)
E/DatabaseUtils(2360): at dalvik.system.NativeStart.run(Native Method)
并且在此之后:
E/Parcel(2360): Class not found when unmarshalling: com.meapp.utilites.Anuncio
E/Parcel(2360): java.lang.ClassNotFoundException: com.meapp.utilites.Anuncio
E/Parcel(2360): at java.lang.Class.classForName(Native Method)
E/Parcel(2360): at java.lang.Class.forName(Class.java:204)
E/Parcel(2360): at java.lang.Class.forName(Class.java:169)
E/Parcel(2360): at android.os.Parcel.readParcelableCreator(Parcel.java:2091)
E/Parcel(2360): at android.os.Parcel.readParcelable(Parcel.java:2055)
E/Parcel(2360): at android.os.Parcel.readValue(Parcel.java:1971)
E/Parcel(2360): at android.os.Parcel.readMapInternal(Parcel.java:2255)
E/Parcel(2360): at android.os.Bundle.unparcel(Bundle.java:223)
E/Parcel(2360): at android.os.Bundle.getString(Bundle.java:1082)
E/Parcel(2360): at android.content.Intent.getStringExtra(Intent.java:4961)
E/Parcel(2360): at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:3761)
E/Parcel(2360): at com.android.server.am.ActivityStack.startActivityMayWait(ActivityStack.java:4977)
E/Parcel(2360): at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3173)
E/Parcel(2360): at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3129)
E/Parcel(2360): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:157)
E/Parcel(2360): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2125)
E/Parcel(2360): at android.os.Binder.execTransact(Binder.java:388)
E/Parcel(2360): at dalvik.system.NativeStart.run(Native Method)
E/Parcel(2360): Caused by: java.lang.NoClassDefFoundError: com/meapp/utilites/Anuncio
E/Parcel(2360): ... 18 more
E/Parcel(2360): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.meapp.utilites.Anuncio" on path: .
E/Parcel(2360): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:64)
E/Parcel(2360): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/Parcel(2360): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/Parcel(2360): ... 18 more
我正在使用proguard来保护我的应用程序,我添加了以下几行代码以确保com.meapp.utilites.Anuncio可见:
-keep class com.meapp.utilites.** { *; }
-keep class * implements android.os.Parcelable { *; }
-keep public class com.meapp.utilites.Anuncio
com.meapp.utilites.Anuncio 实现了 Parcelable 接口。
但是最奇怪的是,即使出现 ClassNotFoundException,应用程序仍然可以正常工作。更重要的是,应用程序像没有问题一样工作,因为它使用了该对象中包含的数据。
所以我有几个问题:
为什么我的已签名应用程序会给我一个 Permission denial 的错误,而未签名的应用程序则没有问题?
为什么在出现 ClassNotFound 后我的应用程序没有崩溃...?
为什么它能正常工作却报错?
如何解决这个问题并让 proguard 使我的类可见?
感谢您的帮助,我认为这是一个 Android Ninja 的问题...