美文网首页
android多渠道打包

android多渠道打包

作者: knock_knock | 来源:发表于2016-09-21 01:40 被阅读3668次

    基本思路:在AndroidManifest.xml文件中设置一个placeholder,打包的时候动态替换该placeholder。

    1. 通过如下方式在AndroidManifest.xml文件中设置一个placeholder(这里placeholder名为“APP_CHANNEL_VALUE”):
    AndroidManifest.xml:
    
    <meta-data
        android:name="APP_CHANNEL"
        android:value="${APP_CHANNEL_VALUE}" />
    
    1. 在build.gradle文件中动态替换placeholder:
    huild.gradle:
    android{
        ...
        productFlavors {
            yingyongbao {}
            xiaomi {}
            huawei {}
            ...
        }
    
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name]
        }
    }
    

    经过上述两步操作,执行打包命令gradlew assembleRelease,就能获得不同渠道的安装包了。

    注意

    有时,我们在AndroidManifest.xml文件当中配置了多个placeholder,比如我们在上述AndroidManifest.xml中再添加一个placeholder,名字为APP_KEY_VALUE:

    AndroidManifest.xml:
    
    <meta-data
        android:name="APP_CHANNEL"
        android:value="${APP_CHANNEL_VALUE}" />
    <meta-data
        android:name="APP_KEY"
        android:value="${APP_KEY_VALUE}" />
    

    这时会报这样的问题:

    Error:(74, 13) Attribute meta-data#APP_KEY@value at AndroidManifest.xml:74:13 requires a placeholder substitution but no value for <APP_KEY> is provided.

    问题的原因是没有为APP_KEY_VALUE提供值。下面我们尝试修改:

    huild.gradle:
    android{
        defaultConfig {
            manifestPlaceholders = [APP_KEY_VALUE : "appkey"]
        }
        ...
        productFlavors {
            yingyongbao {}
            xiaomi {}
            huawei {}
            ...
        }
    
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name]
        }
    }
    

    这样修改之后问题依然存在。我们看一下这个问题的原因:

    manifestPlaceholders是一个变量,我们在defaultConfig当中赋值,又在productFlavor.all中赋值,前面的赋值就被覆盖掉了。
    进一步讲,manifestPlaceholders是一个数组变量,赋值的时候我们应该把所有placeholder组成一个数组赋值给manifestPlaceholders。

    正确的做法:

    huild.gradle:
    android{
        ...
        productFlavors {
            yingyongbao {}
            xiaomi {}
            huawei {}
            ...
        }
    
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name,
                                                      APP_KEY_VALUE:"appkey"]
        }
    }
    

    进阶->配置文件外移

    在根目录下创建local.properties文件,并添加如下内容:

    local.properties
    
    sdk.dir = /android/sdk/dir
    appkey:"realAppkey"
    

    在build.gradle文件中引用:

    huild.gradle:
    
    apply plugin: 'com.android.application'
    
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    
    android{
        ...
        productFlavors {
            yingyongbao {}
            xiaomi {}
            huawei {}
            ...
        }
    
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name,
                                                      APP_KEY_VALUE:properties.getProperty("appkey")]
        }
    }
    

    相关文章

      网友评论

          本文标题:android多渠道打包

          本文链接:https://www.haomeiwen.com/subject/cyzoettx.html