Set a global variable in gradle that can use in manifest file

前端 未结 4 1508
旧时难觅i
旧时难觅i 2020-12-14 03:41

I want to create a global variable similar with applicationId. It is set value in build.gradle and will be used in manifest. Is it possible?

相关标签:
4条回答
  • 2020-12-14 04:05

    If you just want to use the application id set in gradle in your manifest, you can simply use:

    ${applicationId}

    For instance:

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

    If you want the same behavior with custom variables, you can use manifestPlaceholders, like this:

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

    And in your manifest:

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

    See https://developer.android.com/studio/build/manifest-build-variables.html for more information.

    0 讨论(0)
  • 2020-12-14 04:10

    While Marko's answer seems to work, there's currently a better solution that doesn't require adding variables to the string resource files.

    The manifest merger accepts placeholders:

    For custom placeholders replacements, use the following DSL to configure the placeholders values :

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

    will substitute the placeholder in the following declaration :

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

    You can also manipulate those strings with groovy functions.

    0 讨论(0)
  • 2020-12-14 04:12

    To use the string in Manifest, you can directly make it in strings.xml. Like this,

    <string name="variable_name">value</string>
    
    0 讨论(0)
  • 2020-12-14 04:25

    You can set them, for instance I'm setting it for different product flavors

    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"
            }
    }
    

    And use it like this

    <provider
        android:name="com.facebook.FacebookContentProvider"
        android:authorities="@string/authority"
        android:exported="true" />
    
    0 讨论(0)
提交回复
热议问题