多风格设置中的 Android Gradle 1.0 计算版本代码

2024-01-02

计算不同产品风格的版本代码的代码不再在 Android Gradle 1.0 系统中运行。我之前成功地使用了下面的示例代码。

http://tools.android.com/tech-docs/new-build-system/tips#TOC-Computing-Version-code-in-multi-flavor-setup http://tools.android.com/tech-docs/new-build-system/tips#TOC-Computing-Version-code-in-multi-flavor-setup.

ProductFlavors.get(0).versionCode 现在计算为 null。

梯度代码..

android {

  buildscript {
    repositories {
      mavenCentral()
    }
    dependencies {
      classpath 'com.android.tools.build:gradle:1.0.0'
    }
  }

  // This actual the app version code. Our given range is [0, 99999]
  defaultConfig.versionCode = 123

  // 2 dimensions of flavors. API is more important than ABI.
  flavorGroups "api", "abi"

  productFlavors {
    gingerbread {
      flavorGroup "api"
      minSdkVersion 10
      versionCode = 1
    }
    icecreamSandwich {
      flavorGroup "api"
      minSdkVersion 14
      // this must be higher than the gingerbread version to ensure update of the
      // app when the device gets a system update from GB to ICS
      versionCode = 2
    }
    x86 {
      flavorGroup "abi"
      ndk.abiFilter "x86"
      // this is the flavor part of the version code.
      // It must be higher than the arm one for devices supporting
      // both, as x86 is preferred.
      versionCode = 3
    }
    arm {
      flavorGroup "abi"
      ndk.abiFilter "armeabi-v7a"
      versionCode = 1
    }
    mips {
      flavorGroup "abi"
      // It must be higher than the arm one for devices supporting
      // both, as mips is preferred.
      ndk.abiFilter "mips"
      versionCode = 2
    }
    fat {
      flavorGroup "abi"
      // fat binary, lowest version code to be
      // the last option
      versionCode = 0
    }
  }

  // make per-variant version code
  applicationVariants.all { variant ->
    // get the version code of each flavor
    def apiVersion = variant.productFlavors.get(0).versionCode
    def abiVersion = variant.productFlavors.get(1).versionCode

    // set the composite code
     variant.mergedFlavor.versionCode = apiVersion * 1000000 + abiVersion * 100000 + defaultConfig.versionCode
  }
}

From 谷歌用户指南 http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors

多种口味

在某些情况下,人们可能想要创建同一应用程序的多个版本 基于多个标准。例如,多 apk 支持 Google Play 支持 4 种不同的过滤器。创建不同的APK 对每个过滤器进行拆分需要能够使用多个过滤器 产品口味的维度。

考虑一个具有演示版和付费版的游戏示例, 想要在多 apk 支持中使用 ABI 过滤器。具有 3 个 ABI 和 两个版本的应用程序,需要生成6个APK(不是 计算不同构建类型引入的变体)。 但是,付费版本的代码对于所有三个 ABI 都是相同的, 因此,仅仅创造 6 种口味并不是正确的选择。相反,有 口味和变体的二维维度应该自动构建所有 可能的组合。

此功能是使用 Flavor Dimensions 实现的。口味有 分配给特定维度 android { ...

flavorDimensions "abi", "version"

productFlavors {
    freeapp {
        flavorDimension "version"
        ...
    }

    x86 {
        flavorDimension "abi"
        ...
    }
} }

flavorGroups被替换为flavorDimensions,所以你需要使用下一个代码build.gradle

   // 2 dimensions of flavors. API is more important than ABI.
flavorDimensions "api", "abi"

productFlavors {
    gingerbread {
        flavorDimension "api"
        minSdkVersion 10
        versionCode = 1
    }
    icecreamSandwich {
        flavorDimension "api"
        minSdkVersion 14
        // this must be higher than the gingerbread version to ensure update of the
        // app when the device gets a system update from GB to ICS
        versionCode = 2
    }
    x86 {
        flavorDimension "abi"
        ndk.abiFilter "x86"
        // this is the flavor part of the version code.
        // It must be higher than the arm one for devices supporting
        // both, as x86 is preferred.
        versionCode = 3
    }
    arm {
        flavorDimension "abi"
        ndk.abiFilter "armeabi-v7a"
        versionCode = 1
    }
    mips {
        flavorDimension "abi"
        // It must be higher than the arm one for devices supporting
        // both, as mips is preferred.
        ndk.abiFilter "mips"
        versionCode = 2
    }
    fat {
        flavorDimension "abi"
        // fat binary, lowest version code to be
        // the last option
        versionCode = 0
    }
}

// make per-variant version code
applicationVariants.all { variant ->
    // get the version code of each flavor
    def apiVersion = variant.productFlavors.get(0).versionCode
    def abiVersion = variant.productFlavors.get(1).versionCode

    // set the composite code
    variant.mergedFlavor.versionCode = apiVersion * 1000000 + abiVersion * 100000 + defaultConfig.versionCode
}

Update:

添加这些行就可以看到versionCode在生成的 apk 名称中

    applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def apk = output.outputFile;
        def newName =  "${output.name}-${variant.mergedFlavor.versionCode}"
        if (variant.buildType.versionNameSuffix) {
            newName += "-${variant.buildType.versionNameSuffix}"
        }
        if (output.zipAlign) {
            output.zipAlign.outputFile = new File((File) apk.parentFile, newName + '-aligned.apk');
        }
        output.packageApplication.outputFile = new File((File) apk.parentFile, newName + ".apk")
    }
}

请参阅以下构建结果:

    gingerbreadArmDebug-1100123.apk
    gingerbreadArmDebug-1100123-aligned.apk
    gingerbreadFatDebug-1000123.apk
    gingerbreadFatDebug-1000123-aligned.apk
    gingerbreadMipsDebug-1200123.apk
    gingerbreadMipsDebug-1200123-aligned.apk
    gingerbreadX86Debug-1300123.apk
    gingerbreadX86Debug-1300123-aligned.apk
    icecreamSandwichArmDebug-2100123.apk
    icecreamSandwichArmDebug-2100123-aligned.apk
    icecreamSandwichFatDebug-2000123.apk
    icecreamSandwichFatDebug-2000123-aligned.apk
    icecreamSandwichMipsDebug-2200123.apk
    icecreamSandwichMipsDebug-2200123-aligned.apk
    icecreamSandwichX86Debug-2300123.apk
    icecreamSandwichX86Debug-2300123-aligned.apk
    gingerbreadArmRelease-1100123.apk
    gingerbreadFatRelease-1000123.apk
    gingerbreadMipsRelease-1200123.apk
    gingerbreadX86Release-1300123.apk
    icecreamSandwichArmRelease-2100123.apk
    icecreamSandwichFatRelease-2000123.apk
    icecreamSandwichMipsRelease-2200123.apk
    icecreamSandwichX86Release-2300123.apk

其中之一的信息,提取自apktool https://code.google.com/p/android-apktool/:

version: 2.0.0-RC3
apkFileName: gingerbreadArmDebug-1100123.apk
isFrameworkApk: false
usesFramework:
  ids:
  - 1
sdkInfo:
  minSdkVersion: '10'
  targetSdkVersion: '21'
packageInfo:
  forced-package-id: '127'
versionInfo:
  versionCode: '1100123'
  versionName: '1.0'
compressionType: false

更新2:

我的测试项目发布于GitHub https://github.com/igozhenko/gradle-27508708

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多风格设置中的 Android Gradle 1.0 计算版本代码 的相关文章

  • Android 12:如何防止更改手机壁纸时重新启动活动?

    在 Android 12 上 如果我们开启一个活动 进入手机主屏幕更换壁纸 切换回我们的 Activity 该 Activity 重新启动 看起来它与 Material You 主题有关 我想在我的应用程序进入前台时禁用活动的重新启动 有办
  • Espresso - 检查使用按钮按下意图打开哪个活动?

    是否可以跟踪按下某个按钮后打开了哪个 Activity 我有一个测试 其中当单击 按下按钮时 it 向服务器发送请求 直到发送请求时 它打开一个活动 验证是否执行成功在测试中 我需要检查打开的 Activity 是什么 我的测试示例 检查
  • 合并两个位图图像(并排)

    任何人都可以帮助将两个位图图像合并为单个位图 在android中 并排 谢谢 尤瓦拉吉 您可以使用Canvas 查看这篇文章 http www jondev net articles Combining 2 Images in Androi
  • 在 Android 中的活动、服务和应用程序之间传递变量

    有人可以给我提供以下活动 服务 应用程序组合的示例吗 我拥有这三个 但我已经把我的应用程序弄得一团糟 试图在这个地方传递一堆变量 现在我不知道发生了什么 请注意 我是 Android 新手 最近我一直在努力解决这个问题 因为有很多方法可以实
  • android 谷歌+登录定制

    我正在创建一个 Android 应用程序 现在我正在实现社交网络登录 Facebook 按钮很好 但 google 按钮的语言与 Facebook 不同 另外 它只说 登录 我想让它说 用谷歌登录 我是 android 编程的新手 看到我需
  • 无法解析符号 FlutterActivity

    我使用 VCS gt Checkout from Version Control 将 flutter 项目从 github 导入到 Android Studio 中 现在我面临的问题是 Cannot resolve symbol Flutt
  • 无法合并 Dex - Android Studio 3.0

    当我在稳定频道中将 Android Studio 更新到 3 0 并运行该项目时 我开始收到以下错误 Error Execution failed for task app transformDexArchiveWithExternalLi
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Android SDK 中可用的所有“android.intent.action”操作的详尽列表是什么?

    大家好 我想知道标准 Android SDK 中定义的所有 Intent 操作是否有详尽的参考 我正在考虑完整的 android intent action someaction 名称 而不是 Intent 类中定义的方便别名操作的限制列表
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • 无法将 Tesseract OCR 模块添加到 Android Studio

    我按照此处找到的分步指南进行操作 https www codeproject com Articles 840623 Android Character Recognition https www codeproject com Artic
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 6:需要显示BuyFlow UI

    There is a problem when i am click on payWithGoogle Button I am implementing Google Pay in my Android Application and wh
  • 如何覆盖日期选择器的高度和宽度以填充父布局

    我有一个活动包含一个日期选择器 我想设置DatePicker适合屏幕 我试过这个答案 https stackoverflow com questions 6674667 how to customize date pickers width
  • Facebook LoginActivity 未正确显示

    我有一个使用 Facebook 登录的应用程序 我有 FacebookSDK 并且使用 com facebook LoginActivity 问题是 在 10 英寸平板电脑上 当显示软键盘时 活动无法正确显示 我使用的是 Samsung G
  • 更改android中禁用按钮的颜色

    有没有办法通过样式或其他形式更改 android 中禁用按钮的颜色 我目前有以下内容 可绘制 button default xml
  • Android:单一活动,多个视图

    我不是 Android 专业人士 尽管我开发了一个包含 50 多个活动的应用程序 这使得该应用程序非常庞大 经过8周的开发 现在出现了一些问题 导致应用程序难以维护和升级 我正在处理的主要问题是 我无法将对象引用传递给活动的构造函数 事实上
  • 如何更改锁屏自定义文本(所有者信息)?

    我写了程序代码 String message This is test Settings System putString context getContentResolver Settings Secure LOCK PATTERN EN
  • 修改 ADW Android 启动器?

    我想更改和修改开源 ADW 启动器 启动器可在此处获取 https github com AnderWeb android packages apps Launcher https github com AnderWeb android p

随机推荐

  • 使用动态规划查找三项式系数

    我正在尝试使用动态编程在Java中实现一个计算三项式系数的函数 我正在使用以下公式 T n k 1 if n 0 and k 0 T n k 0 if k lt n or k gt n T n k T n 1 k 1 T n 1 k T n
  • 是否可以在虾文件中渲染斑点图像?

    我愿意使用Gruff https github com topfunky gruff在虾文件中渲染一些图形 我想避免将图像写入磁盘的延迟 仅让 Prawn 读取它们 格鲁夫提供to blob方法 http www rubydoc info
  • 如何在 PySimple GUI 中根据按钮点击显示不同的布局? (持续窗口循环)

    我想知道是否有一种方法可以根据 PySimple GUI 中的按钮单击来管理不同的布局 我刚刚开始使用这个框架 我想找到导航菜单的最佳方式 不一定要使用不同的布局 但这让我想到了最直观的方法 我在想 当选择某个子菜单按钮时 可能会有一个布局
  • 如何计算质心

    我正在处理地理空间形状并在这里查看质心算法 http en wikipedia org wiki Centroid Centroid of polygon http en wikipedia org wiki Centroid Centro
  • 在 C++ 中格式化整数

    我有一个 8 位整数 我想按如下格式打印 XXX XX XXX 我想使用一个接受 int 并返回字符串的函数 有什么好的方法可以做到这一点 就我个人而言 我就是这样做的 可能不是解决问题的最快方法 也绝对不像egrunin 的函数那样可重用
  • scss模块(css module):从其他scss文件导入

    我目前正在转换我的 sass 样式以使用CSS 模块 https github com css modules css modules以避免风格冲突 我的理解是 它会生成唯一的类名 这使得如果我想定位在不同文件中定义的另一个组件 例如子组件
  • Chrome 无法连接到 websocket 服务器(操作码 -1)“握手已取消”

    我有一个使用自签名证书的安全 websocket 服务器 我无法从 chrome v44 0 2403 107 客户端连接到该服务器 它是我的测试服务器 它使用与我的应用程序服务器几乎相同的代码创建 我的应用程序服务器can连接到 我试过重
  • Android 8.1.0 中移动屏幕关闭时 BLE 扫描停止

    我将此权限放入清单文件中
  • Delphi XE3 及更高版本在退出时不保存打开的 IDE 选项卡

    我正在运行 win 7 64Bit Delphi XE3 当我在旧的 Delphi XE 中打开一个项目时 它会打开我上次保存该项目时打开的所有表单 如何让XE3有同样的动作 显然是一个简单的问题 但我找不到XE3中保存布局的设置 你必须将
  • .NET API 的 PayPal 异常:流不可读

    正在尝试处理付款 但我的客户遇到了例外情况 当我逐步执行付款流程时 当我尝试使用 OAuthTokenCredential 方法获取访问令牌时 我看到此异常 HttpConnection 执行中出现异常 流不可读 这在几天前才起作用 我确实
  • 警告:格式“%d”需要“int”类型的参数,但参数 2 的类型为“long int”[-Wformat=]

    这段代码是关于 比赛条件 调度和编译器行为在进程或线程同步中起着重要作用 演示同步需求的最简单场景来自尝试修改共享变量值的两个线程 进程之间创建的竞争条件 这通常会导致数据不一致和错误结果 下面的例子演示了这种情况 我是 C 语言新手 对这
  • 为什么读取镶木地板数据集需要比数据集大小更多的内存?

    我正在尝试使用 pyarrow 从 Python 中的 S3 读取镶木地板数据集 S3 UI 显示该路径的大小为 14 3 GB 总共 836 个对象 我在具有 64GB RAM 的 c4 8xlarge EC2 实例上运行代码 尽管 RA
  • Windows UI 自动化无法识别按钮控件

    我在尝试通过以下方式识别时遇到问题Windows 用户界面自动化里面的按钮控件通知区窗口 类名 工具栏Window32 我通过验证Windows 用户界面自动化部署在的工具视窗软件开发工具包这些 图标 是类型控件ControlType Bu
  • Cocoa Pods 错误 ld:找不到 -lPods 的库

    我从可可豆荚中收到了以前从未见过的错误 我已经让它与几个依赖项一起工作得很好 我最近通过 pod 添加了 TestFlightSDK 作为依赖项 但无法存档该项目 它可以很好地适应设备 但拒绝存档 还有其他人遇到过这个问题吗 ld libr
  • 将 Jersey JUL 日志记录重定向到 Log4j2

    我需要将 Jersey 请求 响应日志重定向到我的 log4j2 我通过在我的设备上使用此代码启用了 Jersey 日志记录ApplicationJAXRS extends Application Override public Set
  • 为什么使用 Atlassian Crowd [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想了解 Atlassian 人群通过 LDAP 服务器做什么 看起来大多数 Atlassian 产品都允许您指向 Atlassian 服务器进行授权
  • 停止quartz调试日志记录log4j

    我一直试图关闭令人讨厌的石英调试日志记录 我正在使用 log4j 作为日志记录框架 并且我已经尝试将此行添加到 lg4j 属性文件中 log4j logger org quartz ERROR 我仍然收到大量这些调试日志消息 13 35 4
  • Android 联系人 RAW_CONTACT_ID 与 CONTACT_ID

    我正在使用联系人选择器 如下所示 Intent contactPickerIntent new Intent Intent ACTION PICK Contacts CONTENT URI startActivityForResult co
  • 将多个 PNG 制作成一个 ICO 文件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用 Windows ICO 文件 您可以将多个不同大小的图像打包到同一个 ICO 文件中 然后 Win
  • 多风格设置中的 Android Gradle 1.0 计算版本代码

    计算不同产品风格的版本代码的代码不再在 Android Gradle 1 0 系统中运行 我之前成功地使用了下面的示例代码 http tools android com tech docs new build system tips TOC