请求有关AndroidManifest.xml阅读问题

时间:2015-10-27 08:47:18

标签: java android xml email

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,我认为阅读过程与语言环境有关。我希望你能给我一些提示。非常感谢!

1 个答案:

答案 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中的其余组件都将无效。