Android &引用;缺少名称属性";将权限名称指定为resValue时出错。

Android &引用;缺少名称属性";将权限名称指定为resValue时出错。,android,gradle,manifest,Android,Gradle,Manifest,我有几个不同的Gradle BuildType,我正试图为每一个这些BuildType分别指定Google C2D_消息权限名称,因为我无法在手机上安装不同的应用程序,因为它们共享一个权限名称。但我遇到了“缺少名称属性”错误 所以我在我的身体里做了类似的事情。格雷德尔: buildType2 { applicationIdSuffix '.suffix1' ... resValue 'string', 'gcmPermission', "c

我有几个不同的Gradle BuildType,我正试图为每一个这些BuildType分别指定Google C2D_消息权限名称,因为我无法在手机上安装不同的应用程序,因为它们共享一个权限名称。但我遇到了“缺少名称属性”错误

所以我在我的身体里做了类似的事情。格雷德尔:

    buildType2 {
        applicationIdSuffix '.suffix1'
        ...
        resValue 'string', 'gcmPermission', "com.mypackage.suffix1.permission.C2D_MESSAGE"
    }
在my AndroidManifest.xml中:

<permission
    android:name="@string/gcmPermission"
    android:protectionLevel="signature" />

<uses-permission android:name="@string/gcmPermission" />

但是,我在构建时遇到以下错误:

AndroidManifest.xml:19: missing name attribute in element <permission>.
AndroidManifest.xml:19:元素中缺少name属性。

我通过替换权限中的包名解决了这个问题,并使用带有占位符的权限元素,该占位符会自动被gradle替换为BuildType和/或productFlavors:

    <permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>

我通过替换权限中的包名解决了这个问题,并使用带有占位符的权限元素,该占位符会自动被gradle替换为BuildType和/或productFlavors:

    <permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>

根据,问题只是“name”属性不能引用字符串资源,它必须是原始字符串

可以使用资源指定标签,但不能指定名称

名称必须是唯一的,因此它应该使用Java风格的作用域-例如,“com.example.project.allowed\u ACTION”

这就是为什么arne.jans提供的解决方案有效。Gradle变量在编译前被替换,在清单中显示为原始字符串。

根据,问题只是“name”属性不能引用字符串资源,它必须是原始字符串

可以使用资源指定标签,但不能指定名称

名称必须是唯一的,因此它应该使用Java风格的作用域-例如,“com.example.project.allowed\u ACTION”


这就是为什么arne.jans提供的解决方案有效。Gradle变量在编译前被替换,作为原始字符串显示在清单中。

您还可以在
构建中定义自己的清单占位符。Gradle

buildType2 {
    manifestPlaceholders = [permissionName: 'com.example.my_perm']

    #You can define it also as a string resource here
    resValue 'string', 'permissionName',  'com.example.my_perm'
}

然后,您可以在Android清单中使用
${permissionName}
,或者在代码中使用
R.string.permissionName

您还可以在
build.gradle
中定义自己的清单占位符:

buildType2 {
    manifestPlaceholders = [permissionName: 'com.example.my_perm']

    #You can define it also as a string resource here
    resValue 'string', 'permissionName',  'com.example.my_perm'
}

然后你可以在Android清单中使用
${permissionName}
,或者在代码中使用
R.string.permissionName

你解决了你的问题吗?你解决了你的问题吗?很有魅力!!很有魅力!!