代码之家  ›  专栏  ›  技术社区  ›  Ankhwatcher

Gradle从组合的flavor维度动态构建模式

  •  3
  • Ankhwatcher  · 技术社区  · 7 年前

    我们有两个不同的风格维度,如本例中所示,我们希望动态生成applicationId

    通用域名格式。公司苹果

    相反,此脚本将生成一个applicationId

    无效的公司苹果

    我认为这是因为底部的函数迭代整个productFlavor列表,而不是组合列表。

    flavorDimensions "product", "license"
    
    productFlavors.all {
        ext.scheme = null
        ext.scheme_tail = ""
        ext.kind = null
        ext.license = null
    }
    
    productFlavors {
        apple {
            dimension "product"
            kind = "apple"
            scheme = "companyapple"
        }
    
        orange {
            dimension "product"
            scheme = "companyorange"
            kind = "orange"
        }
    
        kiwi {
            dimension "product"
            scheme = "companykiwi"
            kind = "kiwi"
        }
    
        com {
            dimension "license"
            license = "com"
            scheme_tail = ''
        }
    
        eu {
            dimension "license"
            license = "eu"
            scheme_tail = "eu"
        }
    
        uk {
            dimension "license"
            license = "uk"
            scheme_tail = "uk"
        }
    
    }
    
    productFlavors.all {
        applicationId license + ".company." + kind
        ext.fileProvider = applicationId + ".fileprovider"
        manifestPlaceholders = [scheme: "$scheme$scheme_tail", fileProvider: "$fileProvider"]
        buildConfigField("String", "FILE_PROVIDER", "\"$fileProvider\"")
        buildConfigField("String", "SCHEME", "\"$scheme$scheme_tail\"")
        buildConfigField("String", "KIND", "\"$kind\"")
        buildConfigField("String", "LICENSE", "\"$license\"")
    }
    

    如何迭代组合列表以构建buildConfig字段和ApplicationID?

    ManifestPlaceholder的使用方式如下:

        <activity android:name=".FruitViewerActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
    
                <data android:scheme="${scheme}" />
    
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>
        </activity>
    
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${fileProvider}"
            android:grantUriPermissions="true">
    
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
    
        </provider>
    

    谢谢 罗里

    2 回复  |  直到 7 年前
        1
  •  3
  •   Ankhwatcher    7 年前

    我找到了一个实现目标的解决方案,然后利用 this post by David Medenjak .

    首先使用applicationId和applicationIdSuffix构建applicationId。 分别为BuildConfig和AndroidManifest构建文件提供程序。 分别为AndroidManifest发布scheme\u前缀和scheme\u后缀,并稍后将它们连接起来。 从ApplicationVariant中的组件构建方案。

    flavorDimensions "product", "license"
    
    productFlavors.all {
        ext.scheme_prefix = null
        ext.scheme_suffix = ""
        ext.license = null
    }
    
    productFlavors {
        apple {
            applicationId = "apple.company"
            dimension "product"
            scheme_prefix = "companyapple"
            manifestPlaceholders = [scheme_prefix: "$scheme_prefix"]
    
            buildConfigField("String", "KIND", "\"apple\"")
        }
    
        orange {
            applicationId = 'orange.company'
            dimension "product"
            scheme_prefix = "companyorange"
            manifestPlaceholders = [scheme_prefix: "$scheme_prefix"]
    
            buildConfigField("String", "KIND", "\"orange\"")
        }
    
        kiwi {
            applicationId = "kiwi.company"
            dimension "product"
            scheme_prefix = "companykiwi"
            manifestPlaceholders = [scheme_prefix: "$scheme_prefix"]
    
            buildConfigField("String", "KIND", "\"kiwi\"")
        }
    
        com {
            dimension "license"
            license = "com"
            applicationIdSuffix = "$license"
    
            scheme_suffix = ''
            manifestPlaceholders = [scheme_suffix: "$scheme_suffix"]
        }
    
        eu {
            dimension "license"
            license = "eu"
            applicationIdSuffix = "$license"
    
            scheme_suffix = "eu"
            manifestPlaceholders = [scheme_suffix: "$scheme_suffix"]
        }
    
        uk {
            dimension "license"
            license = "uk"
            applicationIdSuffix = "$license"
    
            scheme_suffix = "uk"
            manifestPlaceholders = [scheme_suffix: "$scheme_suffix"]
        }
    
    }
    
    android.applicationVariants.all {
        variant ->
            ext.fileProvider = variant.applicationId + ".fileprovider"
            buildConfigField("String", "FILE_PROVIDER", "\"$fileProvider\"")
    
            def product = variant.productFlavors[0]
            def license = variant.productFlavors[1]
            variant.buildConfigField("String", "LICENSE", "\"${license.license}\"")
            variant.buildConfigField "String", "SCHEME", "\"${product.scheme_prefix}${license.scheme_suffix}\""
    }
    

    以下是相应的清单更改:

        <activity android:name=".FruitViewerActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
    
                <data android:scheme="${scheme_prefix}${scheme_suffix}" />
    
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>
        </activity>
    
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:grantUriPermissions="true">
    
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
    
        </provider>
    
        2
  •  0
  •   Emortal    7 年前
    apple {
        dimension "product"
        kind = "apple"
        licence = "apple"
        scheme = "companyapple"
    }
    

    you Flavor中缺少许可证,因此默认为 null

    推荐文章