Android多渠道打包

每当app发布新版本时,需要发布到不同的应用市场,比如百度、豌豆荚等,为了统计app在每个市场的下载量、安装量等,需要给app打上唯一标识,美团的解决方案,以下是用Android Studio实现这一功能。

一、在AndroidManifest.xml里设置动态渠道变量

meta-data放在application下,上面的value值就是区分每个市场的标识。

private String getManifestChannel(Context context) {
        try {
            PackageManager pm = context.getPackageManager();
            ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
            return appInfo.metaData.getString("channel");
        } catch (PackageManager.NameNotFoundException ignored) {
        }
        return "";
    }

通过上面的代码即可获取渠道标识。

二、在build.gradle文件中配置productFlavors

productFlavors {
        xiaomi {
            manifestPlaceholders = [channel: "xiaomi"]
        }
        baidu {
            manifestPlaceholders = [channel: "baidu"]
        }
        wandoujia {
            manifestPlaceholders = [channel: "wandoujia"]
        }
    }

或者

productFlavors {
        xiaomi {}
        baidu {}
        wandoujia {}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [channel: name]
    }

三、执行Build->Generate Signed APK

到下图操作的时候,全选渠道,然后点击finish

Android多渠道打包_第1张图片
选择渠道
运行结果

如果要自定义apk名称,可以在build.gradle中配置如下代码

buildTypes {
        //正式apk
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // 自定义输出配置
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为app_v1.0_baidu.apk
                        def fileName = "app_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
        //测试apk
        debugConfig {
            // 自定义输出配置
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为app_v1.0_baidu.apk
                        def fileName = "app_debug_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }
运行结果

如果需要为不同渠道定制不同的资源,如图片、文字信息等

右击项目->新建Android resource directory,选择资源保存的文件夹,如下图所示:

Android多渠道打包_第2张图片
选择资源文件夹

把工程的查看文件模式切换为Project(一般我们是使用Android文件模式的)

Android多渠道打包_第3张图片
切换Android文件模式为Project
Android多渠道打包_第4张图片
把资源文件复制到对应渠道

重新打包即可。

如果App内部有优先跳转到所发渠道的应用市场评价这个功能,那么就需要给不同的渠道配置不同的渠道信息,比如配置不同渠道的包名,则可以在build.gradle中自定义渠道包名属性。

productFlavors {
        xiaomi {
            buildConfigField "String", "CHANNEL_PACKAGE", "\"" + "com.xiaomi.market" + "\""
        }
        baidu {
            buildConfigField "String", "CHANNEL_PACKAGE", "\"" + "com.baidu.appsearch" + "\""
        }
        wandoujia {
            buildConfigField "String", "CHANNEL_PACKAGE", "\"" + "com.wandoujia.phoenix2" + "\""
        }
    }

通过Java代码BuildConfig.CHANNEL_PACKAGE获取。

你可能感兴趣的:(Android多渠道打包)