java – 询问有关AndroidManifest.xml读取问题的帮助

1.有问题的情况:

我们的产品基于aosp 4.4.当我通过向我们的产品添加ar_EG语言环境来构建整个系统时,在第一个引导过程中会出现错误日志,另外如果我构建没有ar_EG语言环境的系统,则问题不会出现.

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

而这个错误将导致电子邮件应用程序的功能失常,最终将显示Exchange的崩溃对话框消息.崩溃日志如下:

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

我的调查

首先,我必须说电子邮件的AndroidManifest.xml没有被触及,我只是在电子邮件中添加了一些阿拉伯字符串.

我在$(aosp_dir)/ frameworks / base / core / java / android / content / pm / PackageParser.java中跟踪了相关的源代码,在函数内部调用:

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

阅读Email的Androidmanifest.xml中定义的当前提供者的权限后:

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

它总是返回NULL,因此将显示错误异常.

然后我注意到getNonConfigurationString返回null的原因是从parseProvider的开头得到的TypedArray是有问题的:

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

“TypedArray sa”是一个长数组,六个元素是更大的元素,而com.android.internal.R.styleable.AndroidManifestProvider_authorities表示权限是第10个更大的元素,所以我打印了sa下的内容两种情况:没有AR_EG语言环境的成功案例和AR_EG语言环境的失败案例.所以我只是展示当局的要素:

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

从源代码中,我已经知道更大元素的第五个元素是一种名为STYLE_CHANGING_CONFIGURATIONS的配置,我们可以看到在失败的情况下该配置的值是4,这可以导致sa.getNonConfigurationString返回null.

因此,我继续跟踪源代码以确定问题值的来源:

     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

源代码显示配置值来自struct ResTable :: Type finally中的typeSpecFlags.

我的疑惑

目前我对这些代码感到困惑,所以我在stackoverflow上写它们来寻求帮助,也许你们对相关的源代码非常熟悉或遇到类似的情况.我仍然不知道如何在struct ResTable :: Type中获取typeSpecFlags,我认为阅读过程与locale有关.我希望你能给我一些提示.非常感谢!

最佳答案 最后,我找到了有问题的位置.如果最终的android映像包含AR语言环境,则android的资源管理器无法通过字符串引用方法从AndroidManifest.xml获取有效字符串.例如:

android:authorities="@string/eml_attachment_provider"

解析onr提供程序失败后,AndroidManifest.xml的整个解析过程将终止.因此,AndroidManifest.xml中的其余组件都将无效.

点赞