许多清单属性不能作为字符串引用指定,必须指定为明确的字符串值。
解析清单的代码位于:frameworks/base/core/java/android/content/pm/PackageParser.java。该类调用了其他方法,包括getNonConfigurationString()和getNonResourceString()(这些方法在frameworks/base/core/java/android/content/res/TypedArray.java中实现)。
getNonConfigurationString()自述如下:
Retrieve the string value of an attribute that is not allowed to change with the given configurations.
getNonResourceString()的描述如下:
Retrieve the string value for an attribute, but only if that string comes from an immediate value in an XML file. That is, this does not allow references to string resources, string attributes, or conversions from other types. As such, this method will only return strings that come from attributes in an XML file.
以下是PackageParser不允许从资源或不同配置中获取的清单属性列表。
这些属性在
com.android.internal.R.styleable中定义。manifest.xml元素属性名称通常是正式名称中最后一个'_'之后的部分。例如,在manifest.xml中的元素中,android:authorities属性是AndroidManifestProvider_authorities,或者是com.android.internal.R.styleable.AndroidManifestProvider_authorities。(下面属性名称列表中的数字是PackageParser.java版本4.1.1中相关代码的行号)
由getNonConfigurationString读取的属性:
917: AndroidManifest_versionName
922: AndroidManifest_sharedUserId
2057: AndroidManifestActivity_parentActivityName
2071: AndroidManifestActivity_permission
2079: AndroidManifestActivity_taskAffinity
2247: AndroidManifestActivityAlias_targetActivity
2330: AndroidManifestActivityAlias_permission
2336: AndroidManifestActivityAlias_parentActivityName
1672: AndroidManifestApplication_name
1683: AndroidManifestApplication_manageSpaceActivity
1697: AndroidManifestApplication_backupAgent
1795: AndroidManifestApplication_permission
1800: AndroidManifestApplication_taskAffinity
1815: AndroidManifestApplication_process
3005: AndroidManifestData_mimeType
3017: AndroidManifestData_scheme
3023: AndroidManifestData_host
3025: AndroidManifestData_port
3031: AndroidManifestData_path
3037: AndroidManifestData_pathPrefix
3043: AndroidManifestData_pathPattern
2527: AndroidManifestGrantUriPermission_path
2533: AndroidManifestGrantUriPermission_pathPrefix
2539: AndroidManifestGrantUriPermission_pathPattern
2579: AndroidManifestPathPermission_permission
2581: AndroidManifestPathPermission_readPermission
2586: AndroidManifestPathPermission_writePermission
2615: AndroidManifestPathPermission_path
2622: AndroidManifestPathPermission_pathPrefix
2629: AndroidManifestPathPermission_pathPattern
2434: AndroidManifestProvider_authorities
2441: AndroidManifestProvider_permission
2443: AndroidManifestProvider_readPermission
2454: AndroidManifestProvider_writePermission
2713: AndroidManifestService_permission
2832: AndroidManifestMetaData_name
1225: AndroidManifestOriginalPackage_name
1981: (parsePackageItemInfo -- I can't tell list of all names)
3258: (Component constructor args.nameres -- I can't tell list of all names)
通过getNonResourceString读取的属性:
1806: AndroidManifestApplication_taskAffinity
1821: AndroidManifestApplication_process
1632: AndroidManifestInstrumentation_targetPackage
2891: AndroidManifestPackageVerifier_name
2894: AndroidManifestPackageVerifier_publicKey
1512: AndroidManifestPermission_permissionGroup
1200: AndroidManifestProtectedBroadcast_name
1927: AndroidManifestUsesLibrary_name
1054: AndroidManifestUsesFeature_name
1004: AndroidManifestUsesPermission_name
3308: (Component constructor args.processRes -- I can't tell list of all names)
因此,manifest.xml文件中的许多属性必须指定为显式字符串值(即在引号中),而不是对strings.xml中字符串的引用。
provider
属性应该是android:authorities
(另请参阅http://developer.android.com/guide/topics/manifest/provider-element.html#auth)。 - scessor