"Missing name attribute" 将权限名称指定为 resValue 时出错。

"Missing name attribute" error when specifying permission name as resValue.

我有几个不同的 Gradle 构建类型,我正在尝试为每个构建类型单独指定 Google C2D_MESSAGE 权限名称,因为我不能拥有不同的应用程序安装在我的 phone 上,因为它们共享一个权限名称。但是我 运行 遇到 "Missing name attribute" 错误。

所以我在 build.gradle 中做这样的事情:

    buildType2 {
        applicationIdSuffix '.suffix1'
        ...
        resValue 'string', 'gcmPermission', "com.mypackage.suffix1.permission.C2D_MESSAGE"
    }

在我的 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>.

我通过用占位符替换权限和使用权限元素中的包名称解决了这个问题,该占位符会自动替换为 gradle buildtypes and/or productFlavors:

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

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

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

You can use resources to specify a label, but not the name.

The name must be unique, so it should use Java-style scoping — for example, "com.example.project.PERMITTED_ACTION".

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

您还可以在 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