在gradle中设置可以在清单文件中使用的全局变量

时间:2015-10-23 04:55:07

标签: android android-gradle build.gradle

我想创建一个与applicationId类似的全局变量。 它是build.gradle中的设置值,将在清单中使用。可能吗?

4 个答案:

答案 0 :(得分:18)

您可以设置它们,例如我将其设置为不同的产品口味

productFlavors {
        production {
            applicationId = "com.myapp.app"
            resValue "string", "authority", "com.facebook.app.FacebookContentProvider5435651423234"
        }
        development {
            applicationId = "com.myapp.development"
            resValue "string", "authority", "com.facebook.app.FacebookContentProvider2134564533421"
        }
        qa {
            applicationId = "com.myapp.qa"
            resValue "string", "authority", "com.facebook.app.FacebookContentProvider29831237981287319"
        }
}

并像这样使用

<provider
    android:name="com.facebook.FacebookContentProvider"
    android:authorities="@string/authority"
    android:exported="true" />

答案 1 :(得分:14)

如果您只想在清单中使用gradle中设置的应用程序ID,则只需使用:

  

$ {的applicationID}

例如:

<provider
    android:authorities="${applicationId}.ShareFileProvider" ... >
    ...
</provider>

如果您希望自定义变量具有相同的行为,则可以使用manifestPlaceholders,如下所示:

android {
    defaultConfig {
        manifestPlaceholders = [hostName:"www.example.com"]
    }
}

在你的清单中:

<intent-filter ... >
    <data android:scheme="http" android:host="${hostName}" ... />
    ...
</intent-filter>

有关详细信息,请参阅https://developer.android.com/studio/build/manifest-build-variables.html

答案 2 :(得分:12)

虽然Marko的答案似乎有效,但目前有一个更好的解决方案,不需要在字符串资源文件中添加变量。

manifest merger accepts placeholders

  

对于自定义占位符替换,请使用以下DSL   配置占位符值:

 android {
     defaultConfig {
         manifestPlaceholders = [ activityLabel:"defaultName"]
     }
     productFlavors {
         free {
         }
         pro {
             manifestPlaceholders = [ activityLabel:"proName" ]
         }
     }
  

将在以下声明中替换占位符:

<activity android:name=".MainActivity" android:label="${activityLabel}" >

您还可以使用常规函数操作这些字符串。

答案 3 :(得分:0)

要使用Manifest中的字符串,您可以直接在strings.xml中创建该字符串。 像这样,

<string name="variable_name">value</string>