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

tha*_*hnd 10 android build.gradle android-gradle-plugin

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

Mar*_*rko 19

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

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"
        }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它

<provider
    android:name="com.facebook.FacebookContentProvider"
    android:authorities="@string/authority"
    android:exported="true" />
Run Code Online (Sandbox Code Playgroud)


Tim*_*tin 14

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

$ {}的applicationID

例如:

<provider
    android:authorities="${applicationId}.ShareFileProvider" ... >
    ...
</provider>
Run Code Online (Sandbox Code Playgroud)

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

android {
    defaultConfig {
        manifestPlaceholders = [hostName:"www.example.com"]
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的清单中:

<intent-filter ... >
    <data android:scheme="http" android:host="${hostName}" ... />
    ...
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

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


Pin*_*Pin 12

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

清单合并接受占位符:

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

 android {
     defaultConfig {
         manifestPlaceholders = [ activityLabel:"defaultName"]
     }
     productFlavors {
         free {
         }
         pro {
             manifestPlaceholders = [ activityLabel:"proName" ]
         }
     }
Run Code Online (Sandbox Code Playgroud)

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

<activity android:name=".MainActivity" android:label="${activityLabel}" >
Run Code Online (Sandbox Code Playgroud)

您还可以使用groovy函数操作这些字符串.