Gradle多渠道打包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/emdd2016/article/details/53292415

Gradle多渠道打包

  • 多渠道打包基本实现
  • 不同的渠道包显示不同的APP_NAME
  • 不同的渠道包显示的res资源不一样

简单的多渠道打包

1.在AndroidMainfest.xml的application中配置自定义项

    <meta-data
            android:name="channel_key"
            android:value="${CHANNEL_VALUE}" />

2.在主工程的build.gradle中添加下面的代码

productFlavors {
        xiaomi {
            manifestPlaceholders = [CHANNEL_VALUE: name]
            // 可以通过下面的代码配置不同的包名【这样不同渠道的包可以同时安装】,正常情况下不需要 
            // applicationId "com.xx.xiaomi"  
            // packageName = "com.xx.xiaomi"
        }
        huawei {
            manifestPlaceholders = [CHANNEL_VALUE: name]
            // 可以通过下面的代码配置不同的包名【这样不同渠道的包可以同时安装】,正常情况下不需要 
            // applicationId "com.xx.huawei"  
            // packageName = "com.xx.huawei"
        }
        yingyongbao {
            manifestPlaceholders = [CHANNEL_VALUE: name]
            // 可以通过下面的代码配置不同的包名【这样不同渠道的包可以同时安装】,正常情况下不需要 
            // applicationId "com.xx.yingyongbao"  
            // packageName = "com.xx.yingyongbao"
        }
    }

    //上面的可以简写成如下的形式(遍历获取channel_value)
     productFlavors {
        xiaomi {
        }
        huawei {
        }
        yingyongbao {
        }
        productFlavors.all {
            flavor ->
                flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
        }

不同的渠道包显示不同的APP_NAME

  1. 修改AndroidMainfest.xml中application的label标签
    android:label="${NNE_NAME}" 
    tools:replace="android:label" // 声明android:label是可以修改的。【这一句是非常关键的,如果没有在编译的时候会出错。】

2.配置build.gradle中的productFlavors不同的渠道设置不同的APP_NAME

   productFlavors {
            xiaomi {
                manifestPlaceholders = [APP_NAME     : "测试app-xiaomi",
                                        CHANNEL_VALUE: "xiaomi"]
            }
            huawei {
                manifestPlaceholders = [APP_NAME     : "测试app-huawei",
                                        CHANNEL_VALUE: "huawei"]
            }
            yingyongbao {
                manifestPlaceholders = [APP_NAME     : "测试app-yingyongbao",
                                        CHANNEL_VALUE: "yingyongbao"]
            }
        }

扩展:配置不同包名需要的不同key可以如上在AndroidManifest.xml中先定义一个自定义的项,然后在productFlavors中对此做具体的配置来实现。


不同的渠道包使用不同的资源文件res

在main目录创建和渠道对应的文件夹,文件夹里边的目录结构和res下面的一直【细想一下,它是用来替换res下边的资源文件的,当然得一致】。 然后把需要替换的资源文件放到对应的目录就行。

注意: 文件名和要替换的资源文件名要一样!!!

  1. 切换到Project结构, 正常是 Android结构的目录
    正常的目录为:
    —app
    ——build
    ——gradle
    ——src
    ———main
    ————assets
    ————java
    ————res
    —————drawable
    —————drawable-xhdpi
    ————AndroidMainfest.xml

在main下面创建和productFlavors渠道对应的文件夹,如xiaomi, huawei, yingyongbao 等
—app
——build
——gradle
——src
———main
————assets
————java
————res
————xiaomi // 下面的资源文件夹和res下边的一样
————huawei // 下面的资源文件夹和res下边的一样
————yingyongbao // 下面的资源文件夹和res下边的一样
—————drawable
—————drawable-xhdpi
————AndroidMainfest.xml


用java代码判断渠道

    try {
            ApplicationInfo info = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            String value = info.metaData.getString("channel_key");
            // 在下面的代码里写各个渠道不同的逻辑
            switch (value) {
                case "xiaomi":
                    //  todo 小米 
                    break;
                case "huawei":
                    //  todo 华为
                    break;
                case "yingyongbao":
                    // todo 应用包
                    break;
                default:
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
>> 错误的或不严谨的地方多多指教!

猜你喜欢

转载自blog.csdn.net/emdd2016/article/details/53292415