Android配置build.gradle的productFlavors多渠道打包

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/83302184

Android配置build.gradle的productFlavors多渠道打包

Android在分发不同市场的release包时候,在中国经常会遇到各个不同市场需要编译打出一个不同apk包,这些不同的包在一些统计分析SDK中又是必需的,比如友盟统计分析,它需要根据写在Androidmanifest.xml的字段,如果针对每一个渠道都要去修改Androidmanifest.xml的值并重新打包,实在繁琐,最好的办法是在build.gradle里面配置productFlavors,一次性编译生成不同渠道的包,同时完成修改Androidmanifest.xml里面像友盟等第三方要求定义和需要修改的字段。
还有一种需求,比如,如果针对不同的应用市场,需要编译生成不同的App应用名等,这也需要build.gradle里面配置productFlavors实现一次编译,生成不同应用名的apk。
比如productFlavors这么定义:

    flavorDimensions "zhangphil_demo"
    productFlavors {
        qq {
            dimension "zhangphil_demo"
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq", app_name: "AppForQQ"]
        }

        huawei {
            dimension "zhangphil_demo"
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei", app_name: "AppForHUAWEI"]
        }

        xiaomi {
            dimension "zhangphil_demo"
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi", app_name: "AppForXIAOMI"]
        }
    }

同时,Androidmanifest.xml这样定义:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="zhangphil.demo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="${app_name}"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

    </application>

</manifest>


meta-data里面定义了诸如像友盟一类统计SDK需要的UMENG_CHANNEL渠道名,${UMENG_CHANNEL_VALUE}即是在编译阶段由productFlavors定义的UMENG_CHANNEL_VALUE值来替换的。
同时,android:label定义决定了App的名字,这里写成${app_name},表示android:label的值由定义在productFlavors里面的app_name替换。
这就实现了,针对每一个渠道编译生成对应的App名,对应的渠道名。
在编译阶段,按住Ctrl键,鼠标左键点击选中全部,即可一次性编译出全部渠道的包:

然后一次编译生成全部的包:


用代码验证生成的包的正确性:

package zhangphil.demo;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = findViewById(R.id.sample_text);

        ApplicationInfo appInfo;
        try {
            appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            String appName = appInfo.loadLabel(getPackageManager()) + "";
            String appChannel = appInfo.metaData.getString("UMENG_CHANNEL");
            textView.setText(appName + "\n" + appChannel);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


运行其中一个release包的输出:

《Android配置build.gradle的productFlavors编译不同配置的apk包》
链接:https://blog.csdn.net/zhangphil/article/details/83275860
 

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/83302184