(浅谈)AndroidStudio中关于多渠道打包相关处理

来源:互联网 发布:江苏省软件检测中心 编辑:程序博客网 时间:2024/06/05 11:10

(好记性,不如烂笔头)


    在新的安卓IDE下,multi-channel(多渠道)进行多市场分发时,经常遇到“好美的风景,无法直看”的尴尬场景,这里先列举一下关于我在build.gradle中及AndroidManifest.xml进行multi-channel的相关浓缩配置:

AndroidManifest.xml下

<meta-data android:name="TD_CHANNEL_ID" android:value="${ONEAPM_TEST_CHANNEL}" />


    有的骚年可能拜读UMENG_CHANNEL,然后放了大招“COPY一下,马上解决”,这里先看下UMENG_CHANNEL在AndroidManifest.xml下的PlaceHolder配置

<meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" />

 这里的meta-data的name,在特殊需求下我们需要据此获取渠道Name,用以针对性的进行渠道需求(name值随意发挥)。meta-data下的value值用于我们在build.gradle下进行多渠道分发时,生成的渠道包所要变换的特定Channel值,可能有点难以理解,下面展示build.gradle下的配置,可能有助于吸收:

build.geadle下

android {    ...    defaultConfig {        ...        manifestPlaceholders = [ ONEAPM_TEST_CHANNEL:"default_channel" ]   }       productFlavors {        default_channel{}        wandoujia{}        _360{}//这里可进行Channel定义    }    productFlavors.all {        flavor ->flavor.manifestPlaceholders = [ ONEAPM_TEST_CHANNEL:name ]   }}

    到此,可能稍微理解了一下上面带有下划线的一句话(meta-data下的value值用于我们在build.gradle下进行多渠道分发时,生成的渠道包所要变换的特定Channel值),manifestPlaceholders中的default_channel值可随意定,主要用于默认的渠道名。更为重要的是实践是理解万物原理的唯一标准,下面列举multi_channel的命令:

Command :gradlew assembleRelease
注:值得一提的是,AndroidStudio底部Tab可以找到一个Terminal,点击可看到类似CMD窗口的内容,把命令直接放大招到此,即可进行multi_channel的编译。

    骚年们,到此还不是成功的最后一步,最后一步谁呢?当然是QA的鉴定,这里所指不是让公司的QA进行测验,而是我们需要进行反编译查看AndroidManifest.xml下的meta-data的value内容是否变成我们所编译完成的多渠道Name值。我是用的apktool进行的反编译,此类文章网上已经很多了,重要的是我们反编译后,meta-data的value内容会变成包名所对应的渠道名。如:wandoujia{}名称对应:

manifestPlaceholders = [ ONEAPM_TEST_CHANNEL:"wandoujia" ]

    有时,需求可能让我们在APP中获取multi-channel的Name用以针对性的处理一些逻辑,下面举例获取APP渠道名的程序:

/ * 获取渠道名      * @param activity      * @return String      */      public static String getChannelName(Activity activity) {          if (activity == null) {              return "";          }          String channelName = "";          try {              PackageManager packageManager = activity.getPackageManager();              if (packageManager != null) {                  ApplicationInfo applicationInfo = packageManager.getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);                  if (applicationInfo != null) {                      if (applicationInfo.metaData != null) {                          channelName = applicationInfo.metaData.getString("TD_CHANNEL_ID");                      }                  }                }          } catch (PackageManager.NameNotFoundException e) {              e.printStackTrace();          }          return channelName;    } 

    获取渠道名主要是针对一些统计等相关需求时可能会用到第三方平台,这时如果渠道没有配置成功,在反编译后是看不到meta-data这条配置的,相反,配置成功后可查看到我们的渠道名已经征服了AndroidManifest下的meta-data。





0 0
原创粉丝点击