Pregunta la ayuda sobre el problema de lectura de AndroidManifest.xml

1.El escenario problemático:

Nuestro producto se basa en losp 4.4. Cuando construyo todo el sistema con la adición de locale ar_EG a nuestro producto, habrá un registro de errores durante el primer procedimiento de arranque, además, si construyo el sistema sin la configuración regional ar_EG, el problema no saldrá.

01-01 08:01:38.711 W/PackageParser( 529): /system/app/Email.apk (at Binary XML file line #357): <provider> does not include authorities attribute 

Y este error llevará a la disfunción de la aplicación de correo electrónico, por último, el mensaje de diálogo de bloqueo de Exchange se mostrará. El registro de fallos está abajo:

 01-01 09:18:53.475 E/AndroidRuntime( 982): FATAL EXCEPTION: main 01-01 09:18:53.475 E/AndroidRuntime( 982): Process: com.android.exchange, PID: 982 01-01 09:18:53.475 E/AndroidRuntime( 982): java.lang.RuntimeException: Unable to create application com.android.exchange.Exchange: java.lang.IllegalArgumentException: Unknown URI content://com.android.email.provider 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4331) 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.app.ActivityThread.access$1500(ActivityThread.java:135) 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.os.Handler.dispatchMessage(Handler.java:102) 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.os.Looper.loop(Looper.java:136) 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.app.ActivityThread.main(ActivityThread.java:5008) 01-01 09:18:53.475 E/AndroidRuntime( 982): at java.lang.reflect.Method.invokeNative(Native Method) 01-01 09:18:53.475 E/AndroidRuntime( 982): at java.lang.reflect.Method.invoke(Method.java:515) 01-01 09:18:53.475 E/AndroidRuntime( 982): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 01-01 09:18:53.475 E/AndroidRuntime( 982): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 01-01 09:18:53.475 E/AndroidRuntime( 982): at dalvik.system.NativeStart.main(Native Method) 01-01 09:18:53.475 E/AndroidRuntime( 982): Caused by: java.lang.IllegalArgumentException: Unknown URI content://com.android.email.provider 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.content.ContentResolver.call(ContentResolver.java:1352) 01-01 09:18:53.475 E/AndroidRuntime( 982): at com.android.exchange.Exchange.onCreate(Exchange.java:34) 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007) 01-01 09:18:53.475 E/AndroidRuntime( 982): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4328) 01-01 09:18:53.475 E/AndroidRuntime( 982): ... 10 more 

2. Mis investigaciones

En primer lugar, debo decir AndroidManifest.xml del correo electrónico no se toca, sólo añadir algunas cadenas de árabe en correo electrónico.

Seguí el código fuente relacionado en $ (aosp_dir) / frameworks / base / core / java / android / content / pm / PackageParser.java , dentro de la función llamada:

 private Provider parseProvider(Package owner, Resources res, XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 

Después de leer las autoridades del proveedor actual definidas en Androidmanifest.xml de Email:

 String cpname = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0); 

Siempre devuelve NULL, por lo tanto, la excepción de error se mostrará.

Entonces noté que la razón por la que getNonConfigurationString devuelve null es que el TypedArray tiene desde el principio de parseProvider es problemático:

 TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifestProvider); 

"TypedArray sa" es un arreglo largo con el que los seis elementos son el elemento más grande, y las autoridades com.android.internal.R.styleable.AndroidManifestProvider_autorities indican que las autoridades son el 10mo elemento más grande, así que imprimí el contenido de sa bajo el Ambos escenarios: el caso correcto sin la configuración regional AR_EG y el caso fallido con la configuración regional AR_EG. Así que acabo de mostrar los elementos de las autoridades:

 The successful case: 3, 188, -1, 0, 0, 0, The failed case: 3, 1127, 2, 2131362092, 4, 0 

Desde el código fuente, he sabido que el quinto elemento de un elemento más grande es un tipo de configuración llamada STYLE_CHANGING_CONFIGURATIONS, podemos ver que el valor de esta configuración bajo el caso fallido es 4, esto puede llevar a que sa.getNonConfigurationString devuelva null.

Por lo tanto, continúo rastreando los códigos fuente para identificar el origen del valor problemático:

  android_content_AssetManager_retrieveAttributes in frameworks\base\core\jni\android_util_AssetManager.cpp || || \/ ResTable::resolveReference in frameworks\base\libs\androidfw\ResourceTypes.cpp || || \/ ResTable::getResource in frameworks\base\libs\androidfw\ResourceTypes.cpp 

El código fuente me muestra que el valor de configuración es de typeSpecFlags en struct ResTable :: Type finalmente.

3. Mis dudas

Actualmente estoy confuso en estos códigos, por lo que los escribo en stackoverflow para pedir la ayuda, tal vez ustedes están muy familiarizados con los códigos fuente relacionados o cumplieron con el escenario similar. Todavía no sé cómo obtener el tipoSpecFlags en struct ResTable :: Type, y creo que el proceso de lectura está relacionado con locale. Espero que me puedas dar algunos consejos. ¡Muchas gracias!

Finalmente, he encontrado la ubicación problemática. Si la imagen final de Android incluye AR locales, el administrador de recursos de Android no puede obtener la cadena válida desde el AndroidManifest.xml a través del método de referencia de cadena. Por ejemplo:

 android:authorities="@string/eml_attachment_provider" 

Una vez que el procedimiento de analizar el proveedor de onr falla, se anulará todo el proceso de análisis de AndroidManifest.xml. Por lo tanto, los componentes de resto en AndroidManifest.xml serán todos inválidos.

  • Cómo configurar el valor predeterminado del widget switch en android
  • Creación de hashmap / map desde recursos XML
  • ¿Por qué esta línea xmlns: android = "http://schemas.android.com/apk/res/android" debe ser la primera en el archivo xml de diseño?
  • Android - Botón de radio - el botón dibujable no se muestra en Lollipop
  • Appcompat res values-v21 Los errores de themes_base en eclipse no desaparecen
  • No se puede crear un ToggleButton en Eclipse IDE para android
  • Fondo transparente en ImageButton con efecto de ondulación?
  • Adición de forma a LinearLayout Android
  • ¿Es posible crear un VectorDrawable desde el sistema de archivos (archivo * .xml)
  • Android: Pie de página en un ListView
  • Widget de conexión de Android facebook: org.json.JSONException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.