Написание исключений для посылки в подписанном приложении

Я экспериментирую с довольно странным поведением в своем приложении для 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 не «поймал» приложение работает правильно. Более того, приложение работает так, как Parcelable восстанавливается без проблем, потому что он использует данные, содержащиеся в этом объекте.

Поэтому у меня есть пара вопросов:

  1. Почему я даю мне отказ в разрешении в моем подписанном приложении, но нет проблем в неподписанном?

  2. Почему не сбой моего приложения после ClassNotFound …?

  3. Почему работает правильно, но объявляя эту ошибку?

  4. Как я могу это решить и заставить proguard сделать мой класс видимым?

Спасибо за вашу помощь, я думаю, что это вопрос для Android Ninjas …

Solutions Collecting From Web of "Написание исключений для посылки в подписанном приложении"

У меня была эта проблема 6 месяцев назад, поэтому мне пришлось искать в битбакете, чтобы посмотреть, что я изменил, чтобы заставить его работать.

То, что я сделал, это изменить мой скрипт 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 & @OneWay

Android.permission.INTERACT_ACROSS_USERS_FULL – это разрешение уровня подписей. Ваше приложение не сможет использовать его до тех пор, пока оно не будет иметь такую ​​же подпись, что и система.

Класс не найден, может быть из-за проблемы с пакетом, убедитесь, что вы указали то же имя пакета запускающей активности, что и имя пакета.

Надеюсь, это поможет

Вы пропустили еще один шаг, заботясь при использовании Parceble с progaurd. Вы можете это проверить.

И для вас случай добавьте эту строку в текстовый файл progaurd

  -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }