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: main01-01 09:18:53.475 E/AndroIDRuntime( 982): Process: com.androID.exchange, PID: 98201-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.provIDer01-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.access00(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.provIDer01-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中的其余组件都将无效.
总结以上是内存溢出为你收集整理的java – 询问有关AndroidManifest.xml读取问题的帮助全部内容,希望文章能够帮你解决java – 询问有关AndroidManifest.xml读取问题的帮助所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)