1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6777b538SAndroid Build Coastguard Worker# Copyright 2019 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker"""Different build variants of Chrome for Android have different version codes. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard WorkerFor targets that have the same package name (e.g. Chrome, Chrome Modern, 8*6777b538SAndroid Build Coastguard WorkerMonochrome, Trichrome), Play Store considers them the same app and will push the 9*6777b538SAndroid Build Coastguard Workersupported app with the highest version code to devices. Note that Play Store 10*6777b538SAndroid Build Coastguard Workerdoes not support hosting two different apps with same version code and package 11*6777b538SAndroid Build Coastguard Workername. 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard WorkerEach version code generated by this script will be used by one or more APKs. 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard WorkerWebview channels must have unique version codes for a couple reasons: 16*6777b538SAndroid Build Coastguard Workera) Play Store does not support having the same version code for different 17*6777b538SAndroid Build Coastguard Worker versions of a package. Without unique codes, promoting a beta apk to stable 18*6777b538SAndroid Build Coastguard Worker would require first removing the beta version. 19*6777b538SAndroid Build Coastguard Workerb) Firebase project support (used by official builders) requires unique 20*6777b538SAndroid Build Coastguard Worker [version code + package name]. 21*6777b538SAndroid Build Coastguard Worker We cannot add new webview package names for new channels because webview 22*6777b538SAndroid Build Coastguard Worker packages are allowlisted by Android as webview providers. 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard WorkerWEBVIEW_STABLE, WEBVIEW_BETA, WEBVIEW_DEV are all used for standalone webview, 25*6777b538SAndroid Build Coastguard Workerwhereas the others are used for various chrome APKs. 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard WorkerTRICHROME_BETA is used for TrichromeChrome, TrichromeWebView, and 28*6777b538SAndroid Build Coastguard WorkerTrichromeLibrary when these are compiled to use the stable package name. Similar 29*6777b538SAndroid Build Coastguard Workerto how WEBVIEW_STABLE/WEBVIEW_BETA work, this allows users to opt into the open 30*6777b538SAndroid Build Coastguard WorkerBeta Track for the stable package. When Trichrome is configured to use a 31*6777b538SAndroid Build Coastguard Workerdistinct package name for the Beta package, the version code will use TRICHROME 32*6777b538SAndroid Build Coastguard Workerinstead of TRICHROME_BETA. 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard WorkerNote that a package digit of '3' for Webview is reserved for Trichrome Webview. 35*6777b538SAndroid Build Coastguard WorkerThe same versionCode is used for both Trichrome Chrome and Trichrome Webview. 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard WorkerVersion code values are constructed like this: 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker {full BUILD number}{3 digits: PATCH}{1 digit: package}{1 digit: ABIs}. 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard WorkerFor example: 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker Build 3721, patch 0, ChromeModern (1), on ARM64 (5): 372100015 44*6777b538SAndroid Build Coastguard Worker Build 3721, patch 9, Monochrome (2), on ARM (0): 372100920 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker""" 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Workerimport argparse 49*6777b538SAndroid Build Coastguard Workerfrom collections import namedtuple 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker# Package name version bits. 52*6777b538SAndroid Build Coastguard Worker_PACKAGE_NAMES = { 53*6777b538SAndroid Build Coastguard Worker 'CHROME': 0, 54*6777b538SAndroid Build Coastguard Worker 'CHROME_MODERN': 10, 55*6777b538SAndroid Build Coastguard Worker 'MONOCHROME': 20, 56*6777b538SAndroid Build Coastguard Worker 'TRICHROME': 30, 57*6777b538SAndroid Build Coastguard Worker 'TRICHROME_BETA': 40, 58*6777b538SAndroid Build Coastguard Worker 'TRICHROME_AUTO': 50, 59*6777b538SAndroid Build Coastguard Worker 'WEBVIEW_STABLE': 0, 60*6777b538SAndroid Build Coastguard Worker 'WEBVIEW_BETA': 10, 61*6777b538SAndroid Build Coastguard Worker 'WEBVIEW_DEV': 20, 62*6777b538SAndroid Build Coastguard Worker} 63*6777b538SAndroid Build Coastguard Worker""" "Next" builds get +500 on their patch number. 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard WorkerThis ensures that they are considered "newer" than any non-next build of the 66*6777b538SAndroid Build Coastguard Workersame branch number; this is a workaround for Android requiring a total ordering 67*6777b538SAndroid Build Coastguard Workerof versions when we only really have a partial ordering. This assumes that the 68*6777b538SAndroid Build Coastguard Workeractual patch number will never reach 500, which has never even come close in 69*6777b538SAndroid Build Coastguard Workerthe past. 70*6777b538SAndroid Build Coastguard Worker""" 71*6777b538SAndroid Build Coastguard Worker_NEXT_BUILD_VERSION_CODE_DIFF = 50000 72*6777b538SAndroid Build Coastguard Worker"""List of version numbers to be created for each build configuration. 73*6777b538SAndroid Build Coastguard WorkerTuple format: 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker (version code name), (package name), (supported ABIs) 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard WorkerHere, (supported ABIs) is referring to the combination of browser ABI and 78*6777b538SAndroid Build Coastguard Workerwebview library ABI present in a particular APK. For example, 64_32 implies a 79*6777b538SAndroid Build Coastguard Worker64-bit browser with an extra 32-bit Webview library. See also 80*6777b538SAndroid Build Coastguard Worker_ABIS_TO_DIGIT_MASK. 81*6777b538SAndroid Build Coastguard Worker""" 82*6777b538SAndroid Build Coastguard Worker_APKS = { 83*6777b538SAndroid Build Coastguard Worker '32': [ 84*6777b538SAndroid Build Coastguard Worker ('CHROME', 'CHROME', '32'), 85*6777b538SAndroid Build Coastguard Worker ('CHROME_MODERN', 'CHROME_MODERN', '32'), 86*6777b538SAndroid Build Coastguard Worker ('MONOCHROME', 'MONOCHROME', '32'), 87*6777b538SAndroid Build Coastguard Worker ('TRICHROME', 'TRICHROME', '32'), 88*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO', 'TRICHROME_AUTO', '32'), 89*6777b538SAndroid Build Coastguard Worker ('TRICHROME_BETA', 'TRICHROME_BETA', '32'), 90*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '32'), 91*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_BETA', 'WEBVIEW_BETA', '32'), 92*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_DEV', 'WEBVIEW_DEV', '32'), 93*6777b538SAndroid Build Coastguard Worker ], 94*6777b538SAndroid Build Coastguard Worker '64': [ 95*6777b538SAndroid Build Coastguard Worker ('CHROME', 'CHROME', '64'), 96*6777b538SAndroid Build Coastguard Worker ('CHROME_MODERN', 'CHROME_MODERN', '64'), 97*6777b538SAndroid Build Coastguard Worker ('MONOCHROME', 'MONOCHROME', '64'), 98*6777b538SAndroid Build Coastguard Worker ('TRICHROME', 'TRICHROME', '64'), 99*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO', 'TRICHROME_AUTO', '64'), 100*6777b538SAndroid Build Coastguard Worker ('TRICHROME_BETA', 'TRICHROME_BETA', '64'), 101*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '64'), 102*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_BETA', 'WEBVIEW_BETA', '64'), 103*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_DEV', 'WEBVIEW_DEV', '64'), 104*6777b538SAndroid Build Coastguard Worker ], 105*6777b538SAndroid Build Coastguard Worker 'hybrid': [ 106*6777b538SAndroid Build Coastguard Worker ('CHROME', 'CHROME', '64'), 107*6777b538SAndroid Build Coastguard Worker ('CHROME_32', 'CHROME', '32'), 108*6777b538SAndroid Build Coastguard Worker ('CHROME_MODERN', 'CHROME_MODERN', '64'), 109*6777b538SAndroid Build Coastguard Worker ('MONOCHROME', 'MONOCHROME', '32_64'), 110*6777b538SAndroid Build Coastguard Worker ('MONOCHROME_32', 'MONOCHROME', '32'), 111*6777b538SAndroid Build Coastguard Worker ('MONOCHROME_32_64', 'MONOCHROME', '32_64'), 112*6777b538SAndroid Build Coastguard Worker ('MONOCHROME_64_32', 'MONOCHROME', '64_32'), 113*6777b538SAndroid Build Coastguard Worker ('MONOCHROME_64', 'MONOCHROME', '64'), 114*6777b538SAndroid Build Coastguard Worker ('TRICHROME', 'TRICHROME', '32_64'), 115*6777b538SAndroid Build Coastguard Worker ('TRICHROME_32', 'TRICHROME', '32'), 116*6777b538SAndroid Build Coastguard Worker ('TRICHROME_32_64', 'TRICHROME', '32_64'), 117*6777b538SAndroid Build Coastguard Worker ('TRICHROME_64_32', 'TRICHROME', '64_32'), 118*6777b538SAndroid Build Coastguard Worker ('TRICHROME_64_32_HIGH', 'TRICHROME', '64_32_high'), 119*6777b538SAndroid Build Coastguard Worker ('TRICHROME_64', 'TRICHROME', '64'), 120*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO', 'TRICHROME_AUTO', '32_64'), 121*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO_32', 'TRICHROME_AUTO', '32'), 122*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO_32_64', 'TRICHROME_AUTO', '32_64'), 123*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO_64', 'TRICHROME_AUTO', '64'), 124*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO_64_32', 'TRICHROME_AUTO', '64_32'), 125*6777b538SAndroid Build Coastguard Worker ('TRICHROME_AUTO_64_32_HIGH', 'TRICHROME_AUTO', '64_32_high'), 126*6777b538SAndroid Build Coastguard Worker ('TRICHROME_BETA', 'TRICHROME_BETA', '32_64'), 127*6777b538SAndroid Build Coastguard Worker ('TRICHROME_32_BETA', 'TRICHROME_BETA', '32'), 128*6777b538SAndroid Build Coastguard Worker ('TRICHROME_32_64_BETA', 'TRICHROME_BETA', '32_64'), 129*6777b538SAndroid Build Coastguard Worker ('TRICHROME_64_32_BETA', 'TRICHROME_BETA', '64_32'), 130*6777b538SAndroid Build Coastguard Worker ('TRICHROME_64_32_HIGH_BETA', 'TRICHROME_BETA', '64_32_high'), 131*6777b538SAndroid Build Coastguard Worker ('TRICHROME_64_BETA', 'TRICHROME_BETA', '64'), 132*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '32_64'), 133*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_BETA', 'WEBVIEW_BETA', '32_64'), 134*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_DEV', 'WEBVIEW_DEV', '32_64'), 135*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_32_STABLE', 'WEBVIEW_STABLE', '32'), 136*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_32_BETA', 'WEBVIEW_BETA', '32'), 137*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_32_DEV', 'WEBVIEW_DEV', '32'), 138*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_64_STABLE', 'WEBVIEW_STABLE', '64'), 139*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_64_BETA', 'WEBVIEW_BETA', '64'), 140*6777b538SAndroid Build Coastguard Worker ('WEBVIEW_64_DEV', 'WEBVIEW_DEV', '64'), 141*6777b538SAndroid Build Coastguard Worker ] 142*6777b538SAndroid Build Coastguard Worker} 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker# Splits input build config architecture to manufacturer and bitness. 145*6777b538SAndroid Build Coastguard Worker_ARCH_TO_MFG_AND_BITNESS = { 146*6777b538SAndroid Build Coastguard Worker 'arm': ('arm', '32'), 147*6777b538SAndroid Build Coastguard Worker 'arm64': ('arm', 'hybrid'), 148*6777b538SAndroid Build Coastguard Worker # Until riscv64 needs a unique version code to ship APKs to the store, 149*6777b538SAndroid Build Coastguard Worker # point to the 'arm' bitmask. 150*6777b538SAndroid Build Coastguard Worker 'riscv64': ('arm', '64'), 151*6777b538SAndroid Build Coastguard Worker 'x86': ('intel', '32'), 152*6777b538SAndroid Build Coastguard Worker 'x64': ('intel', 'hybrid'), 153*6777b538SAndroid Build Coastguard Worker} 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker# Expose the available choices to other scripts. 156*6777b538SAndroid Build Coastguard WorkerARCH_CHOICES = _ARCH_TO_MFG_AND_BITNESS.keys() 157*6777b538SAndroid Build Coastguard Worker""" 158*6777b538SAndroid Build Coastguard WorkerThe architecture preference is encoded into the version_code for devices 159*6777b538SAndroid Build Coastguard Workerthat support multiple architectures. (exploiting play store logic that pushes 160*6777b538SAndroid Build Coastguard Workerapk with highest version code) 161*6777b538SAndroid Build Coastguard Worker 162*6777b538SAndroid Build Coastguard WorkerDetail: 163*6777b538SAndroid Build Coastguard WorkerMany Android devices support multiple architectures, and can run applications 164*6777b538SAndroid Build Coastguard Workerbuilt for any of them; the Play Store considers all of the supported 165*6777b538SAndroid Build Coastguard Workerarchitectures compatible and does not, itself, have any preference for which 166*6777b538SAndroid Build Coastguard Workeris "better". The common cases here: 167*6777b538SAndroid Build Coastguard Worker 168*6777b538SAndroid Build Coastguard Worker- All production arm64 devices can also run arm 169*6777b538SAndroid Build Coastguard Worker- All production x64 devices can also run x86 170*6777b538SAndroid Build Coastguard Worker- Pretty much all production x86/x64 devices can also run arm (via a binary 171*6777b538SAndroid Build Coastguard Worker translator) 172*6777b538SAndroid Build Coastguard Worker 173*6777b538SAndroid Build Coastguard WorkerSince the Play Store has no particular preferences, you have to encode your own 174*6777b538SAndroid Build Coastguard Workerpreferences into the ordering of the version codes. There's a few relevant 175*6777b538SAndroid Build Coastguard Workerthings here: 176*6777b538SAndroid Build Coastguard Worker 177*6777b538SAndroid Build Coastguard Worker- For any android app, it's theoretically preferable to ship a 64-bit version to 178*6777b538SAndroid Build Coastguard Worker 64-bit devices if it exists, because the 64-bit architectures are supposed to 179*6777b538SAndroid Build Coastguard Worker be "better" than their 32-bit predecessors (unfortunately this is not always 180*6777b538SAndroid Build Coastguard Worker true due to the effect on memory usage, but we currently deal with this by 181*6777b538SAndroid Build Coastguard Worker simply not shipping a 64-bit version *at all* on the configurations where we 182*6777b538SAndroid Build Coastguard Worker want the 32-bit version to be used). 183*6777b538SAndroid Build Coastguard Worker- For any android app, it's definitely preferable to ship an x86 version to x86 184*6777b538SAndroid Build Coastguard Worker devices if it exists instead of an arm version, because running things through 185*6777b538SAndroid Build Coastguard Worker the binary translator is a performance hit. 186*6777b538SAndroid Build Coastguard Worker- For WebView, Monochrome, and Trichrome specifically, they are a special class 187*6777b538SAndroid Build Coastguard Worker of APK called "multiarch" which means that they actually need to *use* more 188*6777b538SAndroid Build Coastguard Worker than one architecture at runtime (rather than simply being compatible with 189*6777b538SAndroid Build Coastguard Worker more than one). The 64-bit builds of these multiarch APKs contain both 32-bit 190*6777b538SAndroid Build Coastguard Worker and 64-bit code, so that Webview is available for both ABIs. If you're 191*6777b538SAndroid Build Coastguard Worker multiarch you *must* have a version that supports both 32-bit and 64-bit 192*6777b538SAndroid Build Coastguard Worker version on a 64-bit device, otherwise it won't work properly. So, the 64-bit 193*6777b538SAndroid Build Coastguard Worker version needs to be a higher versionCode, as otherwise a 64-bit device would 194*6777b538SAndroid Build Coastguard Worker prefer the 32-bit version that does not include any 64-bit code, and fail. 195*6777b538SAndroid Build Coastguard Worker""" 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker 198*6777b538SAndroid Build Coastguard Workerdef _GetAbisToDigitMask(build_number, patch_number): 199*6777b538SAndroid Build Coastguard Worker """Return the correct digit mask based on build number. 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker Updated from build 5750: Some intel devices advertise support for arm, 202*6777b538SAndroid Build Coastguard Worker so arm codes must be lower than x86 codes to prevent providing an 203*6777b538SAndroid Build Coastguard Worker arm-optimized build to intel devices. 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker Returns: 206*6777b538SAndroid Build Coastguard Worker A dictionary of architecture mapped to bitness 207*6777b538SAndroid Build Coastguard Worker mapped to version code suffix. 208*6777b538SAndroid Build Coastguard Worker """ 209*6777b538SAndroid Build Coastguard Worker # Scheme change was made directly to M113 and M114 branches. 210*6777b538SAndroid Build Coastguard Worker use_new_scheme = (build_number >= 5750 211*6777b538SAndroid Build Coastguard Worker or (build_number == 5672 and patch_number >= 176) 212*6777b538SAndroid Build Coastguard Worker or (build_number == 5735 and patch_number >= 53)) 213*6777b538SAndroid Build Coastguard Worker if use_new_scheme: 214*6777b538SAndroid Build Coastguard Worker return { 215*6777b538SAndroid Build Coastguard Worker 'arm': { 216*6777b538SAndroid Build Coastguard Worker '32': 0, 217*6777b538SAndroid Build Coastguard Worker '32_64': 1, 218*6777b538SAndroid Build Coastguard Worker '64_32': 2, 219*6777b538SAndroid Build Coastguard Worker '64_32_high': 3, 220*6777b538SAndroid Build Coastguard Worker '64': 4, 221*6777b538SAndroid Build Coastguard Worker }, 222*6777b538SAndroid Build Coastguard Worker 'intel': { 223*6777b538SAndroid Build Coastguard Worker '32': 6, 224*6777b538SAndroid Build Coastguard Worker '32_64': 7, 225*6777b538SAndroid Build Coastguard Worker '64_32': 8, 226*6777b538SAndroid Build Coastguard Worker '64': 9, 227*6777b538SAndroid Build Coastguard Worker }, 228*6777b538SAndroid Build Coastguard Worker } 229*6777b538SAndroid Build Coastguard Worker return { 230*6777b538SAndroid Build Coastguard Worker 'arm': { 231*6777b538SAndroid Build Coastguard Worker '32': 0, 232*6777b538SAndroid Build Coastguard Worker '32_64': 3, 233*6777b538SAndroid Build Coastguard Worker '64_32': 4, 234*6777b538SAndroid Build Coastguard Worker '64': 5, 235*6777b538SAndroid Build Coastguard Worker '64_32_high': 9, 236*6777b538SAndroid Build Coastguard Worker }, 237*6777b538SAndroid Build Coastguard Worker 'intel': { 238*6777b538SAndroid Build Coastguard Worker '32': 1, 239*6777b538SAndroid Build Coastguard Worker '32_64': 6, 240*6777b538SAndroid Build Coastguard Worker '64_32': 7, 241*6777b538SAndroid Build Coastguard Worker '64': 8, 242*6777b538SAndroid Build Coastguard Worker }, 243*6777b538SAndroid Build Coastguard Worker } 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker 246*6777b538SAndroid Build Coastguard WorkerVersionCodeComponents = namedtuple('VersionCodeComponents', [ 247*6777b538SAndroid Build Coastguard Worker 'build_number', 248*6777b538SAndroid Build Coastguard Worker 'patch_number', 249*6777b538SAndroid Build Coastguard Worker 'package_name', 250*6777b538SAndroid Build Coastguard Worker 'abi', 251*6777b538SAndroid Build Coastguard Worker 'is_next_build', 252*6777b538SAndroid Build Coastguard Worker]) 253*6777b538SAndroid Build Coastguard Worker 254*6777b538SAndroid Build Coastguard Worker 255*6777b538SAndroid Build Coastguard Workerdef TranslateVersionCode(version_code, is_webview=False): 256*6777b538SAndroid Build Coastguard Worker """Translates a version code to its component parts. 257*6777b538SAndroid Build Coastguard Worker 258*6777b538SAndroid Build Coastguard Worker Returns: 259*6777b538SAndroid Build Coastguard Worker A 5-tuple (VersionCodeComponents) with the form: 260*6777b538SAndroid Build Coastguard Worker - Build number - integer 261*6777b538SAndroid Build Coastguard Worker - Patch number - integer 262*6777b538SAndroid Build Coastguard Worker - Package name - string 263*6777b538SAndroid Build Coastguard Worker - ABI - string : if the build is 32_64 or 64_32 or 64, that is just 264*6777b538SAndroid Build Coastguard Worker appended to 'arm' or 'x86' with an underscore 265*6777b538SAndroid Build Coastguard Worker - Whether the build is a "next" build - boolean 266*6777b538SAndroid Build Coastguard Worker 267*6777b538SAndroid Build Coastguard Worker So, for build 100.0.5678.99, built for Monochrome on arm 64_32, not a next 268*6777b538SAndroid Build Coastguard Worker build, you should get: 269*6777b538SAndroid Build Coastguard Worker 5678, 99, 'MONOCHROME', 'arm_64_32', False 270*6777b538SAndroid Build Coastguard Worker """ 271*6777b538SAndroid Build Coastguard Worker if len(version_code) == 9: 272*6777b538SAndroid Build Coastguard Worker build_number = int(version_code[:4]) 273*6777b538SAndroid Build Coastguard Worker else: 274*6777b538SAndroid Build Coastguard Worker # At one branch per day, we'll hit 5 digits in the year 2035. 275*6777b538SAndroid Build Coastguard Worker build_number = int(version_code[:5]) 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker is_next_build = False 278*6777b538SAndroid Build Coastguard Worker patch_number_plus_extra = int(version_code[-5:]) 279*6777b538SAndroid Build Coastguard Worker if patch_number_plus_extra >= _NEXT_BUILD_VERSION_CODE_DIFF: 280*6777b538SAndroid Build Coastguard Worker is_next_build = True 281*6777b538SAndroid Build Coastguard Worker patch_number_plus_extra -= _NEXT_BUILD_VERSION_CODE_DIFF 282*6777b538SAndroid Build Coastguard Worker patch_number = patch_number_plus_extra // 100 283*6777b538SAndroid Build Coastguard Worker 284*6777b538SAndroid Build Coastguard Worker # From branch 3992 the name and abi bits in the version code are swapped. 285*6777b538SAndroid Build Coastguard Worker if build_number >= 3992: 286*6777b538SAndroid Build Coastguard Worker abi_digit = int(version_code[-1]) 287*6777b538SAndroid Build Coastguard Worker package_digit = int(version_code[-2]) 288*6777b538SAndroid Build Coastguard Worker else: 289*6777b538SAndroid Build Coastguard Worker abi_digit = int(version_code[-2]) 290*6777b538SAndroid Build Coastguard Worker package_digit = int(version_code[-1]) 291*6777b538SAndroid Build Coastguard Worker 292*6777b538SAndroid Build Coastguard Worker # Before branch 4844 we added 5 to the package digit to indicate a 'next' 293*6777b538SAndroid Build Coastguard Worker # build. 294*6777b538SAndroid Build Coastguard Worker if build_number < 4844 and package_digit >= 5: 295*6777b538SAndroid Build Coastguard Worker is_next_build = True 296*6777b538SAndroid Build Coastguard Worker package_digit -= 5 297*6777b538SAndroid Build Coastguard Worker 298*6777b538SAndroid Build Coastguard Worker for package, number in _PACKAGE_NAMES.items(): 299*6777b538SAndroid Build Coastguard Worker if number == package_digit * 10: 300*6777b538SAndroid Build Coastguard Worker if is_webview == ('WEBVIEW' in package): 301*6777b538SAndroid Build Coastguard Worker package_name = package 302*6777b538SAndroid Build Coastguard Worker break 303*6777b538SAndroid Build Coastguard Worker 304*6777b538SAndroid Build Coastguard Worker for arch, bitness_to_number in (_GetAbisToDigitMask(build_number, 305*6777b538SAndroid Build Coastguard Worker patch_number).items()): 306*6777b538SAndroid Build Coastguard Worker for bitness, number in bitness_to_number.items(): 307*6777b538SAndroid Build Coastguard Worker if abi_digit == number: 308*6777b538SAndroid Build Coastguard Worker abi = arch if arch != 'intel' else 'x86' 309*6777b538SAndroid Build Coastguard Worker if bitness != '32': 310*6777b538SAndroid Build Coastguard Worker abi += '_' + bitness 311*6777b538SAndroid Build Coastguard Worker break 312*6777b538SAndroid Build Coastguard Worker 313*6777b538SAndroid Build Coastguard Worker return VersionCodeComponents(build_number, patch_number, package_name, abi, 314*6777b538SAndroid Build Coastguard Worker is_next_build) 315*6777b538SAndroid Build Coastguard Worker 316*6777b538SAndroid Build Coastguard Worker 317*6777b538SAndroid Build Coastguard Workerdef GenerateVersionCodes(build_number, patch_number, arch, is_next_build): 318*6777b538SAndroid Build Coastguard Worker """Build dict of version codes for the specified build architecture. Eg: 319*6777b538SAndroid Build Coastguard Worker 320*6777b538SAndroid Build Coastguard Worker { 321*6777b538SAndroid Build Coastguard Worker 'CHROME_VERSION_CODE': '378100010', 322*6777b538SAndroid Build Coastguard Worker 'MONOCHROME_VERSION_CODE': '378100013', 323*6777b538SAndroid Build Coastguard Worker ... 324*6777b538SAndroid Build Coastguard Worker } 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker versionCode values are built like this: 327*6777b538SAndroid Build Coastguard Worker {full BUILD int}{3 digits: PATCH}{1 digit: package}{1 digit: ABIs}. 328*6777b538SAndroid Build Coastguard Worker 329*6777b538SAndroid Build Coastguard Worker MAJOR and MINOR values are not used for generating versionCode. 330*6777b538SAndroid Build Coastguard Worker - MINOR is always 0. It was used for something long ago in Chrome's history 331*6777b538SAndroid Build Coastguard Worker but has not been used since, and has never been nonzero on Android. 332*6777b538SAndroid Build Coastguard Worker - MAJOR is cosmetic and controlled by the release managers. MAJOR and BUILD 333*6777b538SAndroid Build Coastguard Worker always have reasonable sort ordering: for two version codes A and B, it's 334*6777b538SAndroid Build Coastguard Worker always the case that (A.MAJOR < B.MAJOR) implies (A.BUILD < B.BUILD), and 335*6777b538SAndroid Build Coastguard Worker that (A.MAJOR > B.MAJOR) implies (A.BUILD > B.BUILD). This property is just 336*6777b538SAndroid Build Coastguard Worker maintained by the humans who set MAJOR. 337*6777b538SAndroid Build Coastguard Worker 338*6777b538SAndroid Build Coastguard Worker Thus, this method is responsible for the final two digits of versionCode. 339*6777b538SAndroid Build Coastguard Worker """ 340*6777b538SAndroid Build Coastguard Worker base_version_code = (build_number * 1000 + patch_number) * 100 341*6777b538SAndroid Build Coastguard Worker 342*6777b538SAndroid Build Coastguard Worker if is_next_build: 343*6777b538SAndroid Build Coastguard Worker base_version_code += _NEXT_BUILD_VERSION_CODE_DIFF 344*6777b538SAndroid Build Coastguard Worker 345*6777b538SAndroid Build Coastguard Worker mfg, bitness = _ARCH_TO_MFG_AND_BITNESS[arch] 346*6777b538SAndroid Build Coastguard Worker 347*6777b538SAndroid Build Coastguard Worker version_codes = {} 348*6777b538SAndroid Build Coastguard Worker 349*6777b538SAndroid Build Coastguard Worker abi_to_digit_mask = _GetAbisToDigitMask(build_number, patch_number) 350*6777b538SAndroid Build Coastguard Worker for apk, package, abis in _APKS[bitness]: 351*6777b538SAndroid Build Coastguard Worker if abis == '64_32_high' and arch != 'arm64': 352*6777b538SAndroid Build Coastguard Worker continue 353*6777b538SAndroid Build Coastguard Worker abi_part = abi_to_digit_mask[mfg][abis] 354*6777b538SAndroid Build Coastguard Worker package_part = _PACKAGE_NAMES[package] 355*6777b538SAndroid Build Coastguard Worker 356*6777b538SAndroid Build Coastguard Worker version_code_name = apk + '_VERSION_CODE' 357*6777b538SAndroid Build Coastguard Worker version_code_val = base_version_code + package_part + abi_part 358*6777b538SAndroid Build Coastguard Worker version_codes[version_code_name] = str(version_code_val) 359*6777b538SAndroid Build Coastguard Worker 360*6777b538SAndroid Build Coastguard Worker return version_codes 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Worker 363*6777b538SAndroid Build Coastguard Workerdef main(): 364*6777b538SAndroid Build Coastguard Worker parser = argparse.ArgumentParser(description='Parses version codes.') 365*6777b538SAndroid Build Coastguard Worker g1 = parser.add_argument_group('To Generate Version Name') 366*6777b538SAndroid Build Coastguard Worker g1.add_argument('--version-code', help='Version code (e.g. 529700010).') 367*6777b538SAndroid Build Coastguard Worker g1.add_argument('--webview', 368*6777b538SAndroid Build Coastguard Worker action='store_true', 369*6777b538SAndroid Build Coastguard Worker help='Whether this is a webview version code.') 370*6777b538SAndroid Build Coastguard Worker g2 = parser.add_argument_group('To Generate Version Code') 371*6777b538SAndroid Build Coastguard Worker g2.add_argument('--version-name', help='Version name (e.g. 124.0.6355.0).') 372*6777b538SAndroid Build Coastguard Worker g2.add_argument('--arch', 373*6777b538SAndroid Build Coastguard Worker choices=ARCH_CHOICES, 374*6777b538SAndroid Build Coastguard Worker help='Set which cpu architecture the build is for.') 375*6777b538SAndroid Build Coastguard Worker g2.add_argument('--next', 376*6777b538SAndroid Build Coastguard Worker action='store_true', 377*6777b538SAndroid Build Coastguard Worker help='Whether the current build should be a "next" ' 378*6777b538SAndroid Build Coastguard Worker 'build, which targets pre-release versions of Android.') 379*6777b538SAndroid Build Coastguard Worker args = parser.parse_args() 380*6777b538SAndroid Build Coastguard Worker if args.version_code: 381*6777b538SAndroid Build Coastguard Worker print(TranslateVersionCode(args.version_code, is_webview=args.webview)) 382*6777b538SAndroid Build Coastguard Worker elif args.version_name: 383*6777b538SAndroid Build Coastguard Worker if not args.arch: 384*6777b538SAndroid Build Coastguard Worker parser.error('Required --arch') 385*6777b538SAndroid Build Coastguard Worker _, _, build, patch = args.version_name.split('.') 386*6777b538SAndroid Build Coastguard Worker values = GenerateVersionCodes(int(build), int(patch), args.arch, args.next) 387*6777b538SAndroid Build Coastguard Worker for k, v in values.items(): 388*6777b538SAndroid Build Coastguard Worker print(f'{k}={v}') 389*6777b538SAndroid Build Coastguard Worker else: 390*6777b538SAndroid Build Coastguard Worker parser.print_help() 391*6777b538SAndroid Build Coastguard Worker 392*6777b538SAndroid Build Coastguard Worker 393*6777b538SAndroid Build Coastguard Worker 394*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 395*6777b538SAndroid Build Coastguard Worker main() 396