我正在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之后也没有" catched"该应用程序正常工作。更重要的是,应用程序正在运行,就像Parcelable被没有问题地恢复一样,因为它使用了该对象中包含的数据。
所以我有几个问题:
为什么在我签名的申请表中给我一个拒绝权限,但未签名的申请表中没有问题?
为什么不在ClassNotFound后崩溃我的应用程序......?
为什么工作正常但宣布错误?
如何解决这个问题并使proguard让我的课程可见?
感谢您的帮助,我认为这是针对Android Ninjas的问题......
答案 0 :(得分:5)
我在6个月前遇到过这个问题,所以我不得不在bitbucket中搜索,看看我改变了什么让它发挥作用。
我所做的是使用此模板作为基础更改我的脚本proguard-project.txt:
# Basic Template extracted from http://wiebe-elsinga.com/blog/obfuscating-for-android-with-proguard/
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * implements android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
您可以在http://wiebe-elsinga.com/blog/obfuscating-for-android-with-proguard/
中找到更多信息正如您所看到的,与Parcelable相关,我的原始脚本错过了部分配置:
-keepclassmembers class * implements android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}
我希望这对所有人都有帮助@AtulOHolic&amp; @OneWay
答案 1 :(得分:1)
android.permission.INTERACT_ACROSS_USERS_FULL是签名级别权限。除非它与系统具有相同的签名,否则您的应用将无法使用它。
未找到类可能是由于包问题,请确保您已为包名称提供了相同的启动活动包名称。
希望这会有所帮助
答案 2 :(得分:0)
在使用Parcelable和proguard时,你错过了一步。 你可以查看this。
并为您的情况在progaurd文本文件中添加此行
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}