美文网首页
Android 多渠道打包两种方式

Android 多渠道打包两种方式

作者: Luke_单车 | 来源:发表于2023-04-20 13:18 被阅读0次

Android 多渠道打包 productFlavors

    1. 配置productFlavors
      修改AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.cuiwei.voice">

    <application
        android:theme="@style/AppTheme">

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

    </application>

</manifest>
  1. 修改build.gradle
android {
    defaultConfig {
    ...
        //必须要保证所有的flavor 都属于同一个维度
        flavorDimensions "default"
    }
    ...
    productFlavors {
        guanwang {
            manifestPlaceholders = [CHANNEL_VALUE: "guanwang"]
        }
        google {
            manifestPlaceholders = [CHANNEL_VALUE: "google"]
        }
    }

}
  • Android 多渠道打包 packer-ng-plugin

packer-ng-plugin 是下一代Android渠道打包工具Gradle插件,支持极速打包,100个渠道包只需要10秒钟,速度是 gradle-packer-plugin300倍以上,可方便的用于CI系统集成,同时提供命令行打包脚本,渠道读取提供Python和C语言的实现。

  1. 修改项目配置
// build.gradle
buildscript {
    dependencies{
        classpath 'com.mcxiaoke.packer-ng:plugin:2.0.1'
    }
}

  1. 修改模块配置
apply plugin: 'packer'
// build.gradle
dependencies {
    compile 'com.mcxiaoke.packer-ng:helper:2.0.1'
}

pluginhelper 的版本号需要保持一致

  1. 渠道列表格式

渠道名列表文件是纯文本文件,按行读取,每行一个渠道,行首和行尾的空白会被忽略,如果有注释,渠道名和注释之间用 # 分割。

渠道名建议尽量使用规范的中英文和数字,不要使用特殊字符和不可见字符。示例:channels.txt

  1. 集成打包
  • 项目中没有使用 productFlavors
    ./gradlew clean apkRelease
  • 项目中使用了 productFlavors
    如果项目中指定了多个 flavor ,需要指定需要打渠道包的 flavor 名字,假设你有 Paid Free 两个 flavor ,打包的时候命令如下:
./gradlew clean apkPaidRelease
./gradlew clean apkFreeRelease

直接使用 ./gradlew clean apkRelease 会输出所有 flavor 的渠道包。

  • 通过参数直接指定渠道列表(会覆盖build.gradle中的属性):

./gradlew clean apkRelease -Pchannels=ch1,ch2,douban,google
渠道数目很少时可以使用此种方式。

  • 通过参数指定渠道列表文件的位置(会覆盖build.gradle中的属性):

./gradlew clean apkRelease -Pchannels=@channels.txt
使用@符号指定渠道列表文件的位置,使用相对于项目根目录的相对路径。

  • 还可以指定输出目录和文件名格式模版:
./gradlew clean apkRelease -Poutput=build/apks
./gradlew clean apkRelease -Pformat=${versionName}-${channel}

这些参数 channels output format 可以组合使用,命令行参数会覆盖 build.gradle 对应的属性。

  • Gradle打包命令说明

    渠道打包的Task名字是 apk{flavor}{buildType} buildType一般是release,也可以是你自己指定的beta或者someOtherType,如果没有 flavor 可以忽略,使用时首字母需要大写,假设 flavor 是 Paid,release类型对应的任务名是 apkPaidRelease,beta类型对应的任务名是 apkPaidBetaBeta,其它的以此类推。

特别提示
如果你同时使用其它的资源压缩工具或应用加固功能,请使用命令行脚本打包增加渠道信息,增加渠道信息需要放在APK处理过程的最后一步

  • 代码中读取渠道
  1. 如果没有找到渠道信息或遇到错误,默认返回的是""
com.mcxiaoke.packer.helper.PackerNg
String channel = PackerNg.getChannel(Context)
  1. 文件名格式模版

格式模版使用Groovy字符串模版引擎,默认文件名格式是:

${appPkg}-${channel}-${buildType}-v${versionName}-${versionCode} 。

假如你的App包名是com.your.company ,渠道名是 Google_Play , buildTypereleaseversionName是 2.1.15 ,versionCode是 200115 ,那么生成的默认APK的文件名是 com.your.company-Google_Player-release-2.1.15-20015.apk

  1. 可使用以下变量:
projectName - 项目名字
appName - App模块名字
appPkg - applicationId (App包名packageName)
channel - 打包时指定的渠道名
buildType - buildType (release/debug/beta等)
flavor - flavor (flavor名字,如paid/free等)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1  (最终APK文件的SHA1哈希值)

相关文章

网友评论

      本文标题:Android 多渠道打包两种方式

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