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
2。我的调查
首先,我必须说电子邮件的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);
&#34; TypedArray sa&#34;是一个长数组,六个元素是更大的元素,com.android.internal.R.styleable.AndroidManifestProvider_authorities表明权限是第10个更大的元素,所以我在两个场景下打印了sa的内容:没有AR_EG语言环境的成功案例和具有AR_EG语言环境的失败案例。所以我只是向当局展示&#39;元素:
The successful case: 3, 188, -1, 0, 0, 0,
The failed case: 3, 1127, 2, 2131362092, 4, 0
从源代码中,我已经知道更大元素的第五个元素是一种名为STYLE_CHANGING_CONFIGURATIONS的配置,我们可以看到在失败的情况下这个配置的值是4,这可以导致sa.getNonConfigurationString return 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。
第3。我的怀疑
目前我对这些代码感到困惑,所以我在stackoverflow上写它们来寻求帮助,也许你们对相关的源代码非常熟悉或遇到类似的情况。我仍然不知道如何在struct ResTable :: Type中获取typeSpecFlags,我认为阅读过程与语言环境有关。我希望你能给我一些提示。非常感谢!
答案 0 :(得分:1)
最后,我找到了有问题的位置。如果最终的android映像包含AR语言环境,则android的资源管理器无法通过字符串引用方法从AndroidManifest.xml获取有效字符串。例如:
canvas.drawText(hourText, getPx(TEXT_SIZE, activity), getPx(TEXT_SIZE / 3, activity), nPaint);
public static int getPx(int dp, Activity activity) {
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
float logicalDensity = metrics.density;
return (int) Math.ceil(dp * logicalDensity);
}
解析onr提供程序失败后,AndroidManifest.xml的整个解析过程将终止。因此,AndroidManifest.xml中的其余组件都将无效。