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

java– 询问有关AndroidManifest.xml读取问题的帮助,第1张

概述1.有问题的情况:我们的产品基于aosp4.4.当我通过向我们的产品添加ar_EG语言环境来构建整个系统时,在第一个引导过程中会出现错误日志,另外如果我构建没有ar_EG语言环境的系统,则问题不会出现.01-0108:01:38.711W/PackageParser(529):/system/app/Email.apk(atBinaryXMLf

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读取问题的帮助所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1117233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存