xref: /aosp_15_r20/external/cronet/build/util/android_chrome_version.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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