xref: /aosp_15_r20/build/make/tools/finalization/finalize-sdk-resources.sh (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker#!/bin/bash
2*9e94795aSAndroid Build Coastguard Worker
3*9e94795aSAndroid Build Coastguard Workerset -ex
4*9e94795aSAndroid Build Coastguard Worker
5*9e94795aSAndroid Build Coastguard Workerfunction apply_droidstubs_hack() {
6*9e94795aSAndroid Build Coastguard Worker    if ! grep -q 'STOPSHIP: RESTORE THIS LOGIC WHEN DECLARING "REL" BUILD' "$top/build/soong/java/droidstubs.go" ; then
7*9e94795aSAndroid Build Coastguard Worker        local build_soong_git_root="$(readlink -f $top/build/soong)"
8*9e94795aSAndroid Build Coastguard Worker        patch --strip=1 --no-backup-if-mismatch --directory="$build_soong_git_root" --input=../../build/make/tools/finalization/build_soong_java_droidstubs.go.apply_hack.diff
9*9e94795aSAndroid Build Coastguard Worker    fi
10*9e94795aSAndroid Build Coastguard Worker}
11*9e94795aSAndroid Build Coastguard Worker
12*9e94795aSAndroid Build Coastguard Workerfunction finalize_bionic_ndk() {
13*9e94795aSAndroid Build Coastguard Worker    # Adding __ANDROID_API_<>__.
14*9e94795aSAndroid Build Coastguard Worker    # If this hasn't done then it's not used and not really needed. Still, let's check and add this.
15*9e94795aSAndroid Build Coastguard Worker    local api_level="$top/bionic/libc/include/android/api-level.h"
16*9e94795aSAndroid Build Coastguard Worker    if ! grep -q "\__.*$((${FINAL_PLATFORM_SDK_VERSION}))" $api_level ; then
17*9e94795aSAndroid Build Coastguard Worker        local tmpfile=$(mktemp /tmp/finalization.XXXXXX)
18*9e94795aSAndroid Build Coastguard Worker        echo "
19*9e94795aSAndroid Build Coastguard Worker/** Names the \"${FINAL_PLATFORM_CODENAME:0:1}\" API level ($FINAL_PLATFORM_SDK_VERSION), for comparison against \`__ANDROID_API__\`. */
20*9e94795aSAndroid Build Coastguard Worker#define __ANDROID_API_${FINAL_PLATFORM_CODENAME:0:1}__ $FINAL_PLATFORM_SDK_VERSION" > "$tmpfile"
21*9e94795aSAndroid Build Coastguard Worker
22*9e94795aSAndroid Build Coastguard Worker        local api_level="$top/bionic/libc/include/android/api-level.h"
23*9e94795aSAndroid Build Coastguard Worker        sed -i -e "/__.*$((${FINAL_PLATFORM_SDK_VERSION}-1))/r""$tmpfile" $api_level
24*9e94795aSAndroid Build Coastguard Worker
25*9e94795aSAndroid Build Coastguard Worker        rm "$tmpfile"
26*9e94795aSAndroid Build Coastguard Worker    fi
27*9e94795aSAndroid Build Coastguard Worker}
28*9e94795aSAndroid Build Coastguard Worker
29*9e94795aSAndroid Build Coastguard Workerfunction finalize_modules_utils() {
30*9e94795aSAndroid Build Coastguard Worker    local shortCodename="${FINAL_PLATFORM_CODENAME:0:1}"
31*9e94795aSAndroid Build Coastguard Worker    local methodPlaceholder="INSERT_NEW_AT_LEAST_${shortCodename}_METHOD_HERE"
32*9e94795aSAndroid Build Coastguard Worker
33*9e94795aSAndroid Build Coastguard Worker    local tmpfile=$(mktemp /tmp/finalization.XXXXXX)
34*9e94795aSAndroid Build Coastguard Worker    echo "    /** Checks if the device is running on a release version of Android $FINAL_PLATFORM_CODENAME or newer */
35*9e94795aSAndroid Build Coastguard Worker    @ChecksSdkIntAtLeast(api = $FINAL_PLATFORM_SDK_VERSION /* BUILD_VERSION_CODES.$FINAL_PLATFORM_CODENAME */)
36*9e94795aSAndroid Build Coastguard Worker    public static boolean isAtLeast${FINAL_PLATFORM_CODENAME:0:1}() {
37*9e94795aSAndroid Build Coastguard Worker        return SDK_INT >= $FINAL_PLATFORM_SDK_VERSION ||
38*9e94795aSAndroid Build Coastguard Worker                (SDK_INT == $(($FINAL_PLATFORM_SDK_VERSION - 1)) && isAtLeastPreReleaseCodename(\"$FINAL_PLATFORM_CODENAME\"));
39*9e94795aSAndroid Build Coastguard Worker    }" > "$tmpfile"
40*9e94795aSAndroid Build Coastguard Worker
41*9e94795aSAndroid Build Coastguard Worker    local javaFuncRegex='\/\*\*[^{]*isAtLeast'"${shortCodename}"'() {[^{}]*}'
42*9e94795aSAndroid Build Coastguard Worker    local javaFuncReplace="N;N;N;N;N;N;N;N; s/$javaFuncRegex/$methodPlaceholder/; /$javaFuncRegex/!{P;D};"
43*9e94795aSAndroid Build Coastguard Worker
44*9e94795aSAndroid Build Coastguard Worker    local javaSdkLevel="$top/frameworks/libs/modules-utils/java/com/android/modules/utils/build/SdkLevel.java"
45*9e94795aSAndroid Build Coastguard Worker    sed -i "$javaFuncReplace" $javaSdkLevel
46*9e94795aSAndroid Build Coastguard Worker
47*9e94795aSAndroid Build Coastguard Worker    sed -i "/${methodPlaceholder}"'/{
48*9e94795aSAndroid Build Coastguard Worker           r '"$tmpfile"'
49*9e94795aSAndroid Build Coastguard Worker           d}' $javaSdkLevel
50*9e94795aSAndroid Build Coastguard Worker
51*9e94795aSAndroid Build Coastguard Worker    echo "// Checks if the device is running on release version of Android ${FINAL_PLATFORM_CODENAME:0:1} or newer.
52*9e94795aSAndroid Build Coastguard Workerinline bool IsAtLeast${FINAL_PLATFORM_CODENAME:0:1}() {
53*9e94795aSAndroid Build Coastguard Worker  return android_get_device_api_level() >= $FINAL_PLATFORM_SDK_VERSION ||
54*9e94795aSAndroid Build Coastguard Worker         (android_get_device_api_level() == $(($FINAL_PLATFORM_SDK_VERSION - 1)) &&
55*9e94795aSAndroid Build Coastguard Worker          detail::IsAtLeastPreReleaseCodename(\"$FINAL_PLATFORM_CODENAME\"));
56*9e94795aSAndroid Build Coastguard Worker}" > "$tmpfile"
57*9e94795aSAndroid Build Coastguard Worker
58*9e94795aSAndroid Build Coastguard Worker    local cppFuncRegex='\/\/[^{]*IsAtLeast'"${shortCodename}"'() {[^{}]*}'
59*9e94795aSAndroid Build Coastguard Worker    local cppFuncReplace="N;N;N;N;N;N; s/$cppFuncRegex/$methodPlaceholder/; /$cppFuncRegex/!{P;D};"
60*9e94795aSAndroid Build Coastguard Worker
61*9e94795aSAndroid Build Coastguard Worker    local cppSdkLevel="$top/frameworks/libs/modules-utils/build/include/android-modules-utils/sdk_level.h"
62*9e94795aSAndroid Build Coastguard Worker    sed -i "$cppFuncReplace" $cppSdkLevel
63*9e94795aSAndroid Build Coastguard Worker    sed -i "/${methodPlaceholder}"'/{
64*9e94795aSAndroid Build Coastguard Worker           r '"$tmpfile"'
65*9e94795aSAndroid Build Coastguard Worker           d}' $cppSdkLevel
66*9e94795aSAndroid Build Coastguard Worker
67*9e94795aSAndroid Build Coastguard Worker    rm "$tmpfile"
68*9e94795aSAndroid Build Coastguard Worker}
69*9e94795aSAndroid Build Coastguard Worker
70*9e94795aSAndroid Build Coastguard Workerfunction bumpSdkExtensionsVersion() {
71*9e94795aSAndroid Build Coastguard Worker    local SDKEXT="packages/modules/SdkExtensions/"
72*9e94795aSAndroid Build Coastguard Worker
73*9e94795aSAndroid Build Coastguard Worker    # This used to call bump_sdk.sh utility.
74*9e94795aSAndroid Build Coastguard Worker    # However due to TS, we have to build the gen_sdk with a correct set of settings.
75*9e94795aSAndroid Build Coastguard Worker
76*9e94795aSAndroid Build Coastguard Worker    # "$top/packages/modules/SdkExtensions/gen_sdk/bump_sdk.sh" ${FINAL_MAINLINE_EXTENSION}
77*9e94795aSAndroid Build Coastguard Worker    # Leave the last commit as a set of modified files.
78*9e94795aSAndroid Build Coastguard Worker    # The code to create a finalization topic will pick it up later.
79*9e94795aSAndroid Build Coastguard Worker    # git -C ${SDKEXT} reset HEAD~1
80*9e94795aSAndroid Build Coastguard Worker
81*9e94795aSAndroid Build Coastguard Worker    local sdk="${FINAL_MAINLINE_EXTENSION}"
82*9e94795aSAndroid Build Coastguard Worker    local modules_arg=
83*9e94795aSAndroid Build Coastguard Worker
84*9e94795aSAndroid Build Coastguard Worker    TARGET_PRODUCT=aosp_arm64 \
85*9e94795aSAndroid Build Coastguard Worker        TARGET_RELEASE=fina_1 \
86*9e94795aSAndroid Build Coastguard Worker        TARGET_BUILD_VARIANT=userdebug \
87*9e94795aSAndroid Build Coastguard Worker        DIST_DIR=out/dist \
88*9e94795aSAndroid Build Coastguard Worker        $top/build/soong/soong_ui.bash --make-mode --soong-only gen_sdk
89*9e94795aSAndroid Build Coastguard Worker
90*9e94795aSAndroid Build Coastguard Worker    ANDROID_BUILD_TOP="$top" out/soong/host/linux-x86/bin/gen_sdk \
91*9e94795aSAndroid Build Coastguard Worker        --database ${SDKEXT}/gen_sdk/extensions_db.textpb \
92*9e94795aSAndroid Build Coastguard Worker        --action new_sdk \
93*9e94795aSAndroid Build Coastguard Worker        --sdk "$sdk" \
94*9e94795aSAndroid Build Coastguard Worker        $modules_arg
95*9e94795aSAndroid Build Coastguard Worker}
96*9e94795aSAndroid Build Coastguard Worker
97*9e94795aSAndroid Build Coastguard Workerfunction finalize_sdk_resources() {
98*9e94795aSAndroid Build Coastguard Worker    local top="$(dirname "$0")"/../../../..
99*9e94795aSAndroid Build Coastguard Worker    source $top/build/make/tools/finalization/environment.sh
100*9e94795aSAndroid Build Coastguard Worker
101*9e94795aSAndroid Build Coastguard Worker    local SDK_CODENAME="public static final int $FINAL_PLATFORM_CODENAME_JAVA = CUR_DEVELOPMENT;"
102*9e94795aSAndroid Build Coastguard Worker    local SDK_VERSION="public static final int $FINAL_PLATFORM_CODENAME_JAVA = $FINAL_PLATFORM_SDK_VERSION;"
103*9e94795aSAndroid Build Coastguard Worker
104*9e94795aSAndroid Build Coastguard Worker    # The full process can be found at (INTERNAL) go/android-sdk-finalization.
105*9e94795aSAndroid Build Coastguard Worker
106*9e94795aSAndroid Build Coastguard Worker    # apply droidstubs hack to prevent tools from incrementing an API version
107*9e94795aSAndroid Build Coastguard Worker    apply_droidstubs_hack
108*9e94795aSAndroid Build Coastguard Worker
109*9e94795aSAndroid Build Coastguard Worker    # bionic/NDK
110*9e94795aSAndroid Build Coastguard Worker    finalize_bionic_ndk
111*9e94795aSAndroid Build Coastguard Worker
112*9e94795aSAndroid Build Coastguard Worker    # Finalize SDK
113*9e94795aSAndroid Build Coastguard Worker
114*9e94795aSAndroid Build Coastguard Worker    # frameworks/libs/modules-utils
115*9e94795aSAndroid Build Coastguard Worker    finalize_modules_utils
116*9e94795aSAndroid Build Coastguard Worker
117*9e94795aSAndroid Build Coastguard Worker    # development/sdk
118*9e94795aSAndroid Build Coastguard Worker    local platform_source="$top/development/sdk/platform_source.prop_template"
119*9e94795aSAndroid Build Coastguard Worker    sed -i -e 's/Pkg\.Revision.*/Pkg\.Revision=1/g' $platform_source
120*9e94795aSAndroid Build Coastguard Worker    local build_tools_source="$top/development/sdk/build_tools_source.prop_template"
121*9e94795aSAndroid Build Coastguard Worker    sed -i -e 's/Pkg\.Revision.*/Pkg\.Revision=${PLATFORM_SDK_VERSION}.0.0/g' $build_tools_source
122*9e94795aSAndroid Build Coastguard Worker
123*9e94795aSAndroid Build Coastguard Worker    # build/soong
124*9e94795aSAndroid Build Coastguard Worker    local codename_version="\"${FINAL_PLATFORM_CODENAME}\":     ${FINAL_PLATFORM_SDK_VERSION}"
125*9e94795aSAndroid Build Coastguard Worker    if ! grep -q "$codename_version" "$top/build/soong/android/api_levels.go" ; then
126*9e94795aSAndroid Build Coastguard Worker        sed -i -e "/:.*$((${FINAL_PLATFORM_SDK_VERSION}-1)),/a \\\t\t$codename_version," "$top/build/soong/android/api_levels.go"
127*9e94795aSAndroid Build Coastguard Worker    fi
128*9e94795aSAndroid Build Coastguard Worker
129*9e94795aSAndroid Build Coastguard Worker    # cts
130*9e94795aSAndroid Build Coastguard Worker    if ! grep -q "${FINAL_PLATFORM_VERSION}" "$top/cts/tests/tests/os/assets/platform_releases.txt" ; then
131*9e94795aSAndroid Build Coastguard Worker        echo ${FINAL_PLATFORM_VERSION} >> "$top/cts/tests/tests/os/assets/platform_releases.txt"
132*9e94795aSAndroid Build Coastguard Worker    fi
133*9e94795aSAndroid Build Coastguard Worker    if ! grep -q "$((${FINAL_PLATFORM_SDK_VERSION}-1)), ${FINAL_PLATFORM_VERSION}" "$top/cts/tests/tests/os/src/android/os/cts/BuildVersionTest.java" ; then
134*9e94795aSAndroid Build Coastguard Worker        sed -i -e "s/.*EXPECTED_SDKS = List.of(.*$((${FINAL_PLATFORM_SDK_VERSION}-1))/&, $FINAL_PLATFORM_SDK_VERSION/" "$top/cts/tests/tests/os/src/android/os/cts/BuildVersionTest.java"
135*9e94795aSAndroid Build Coastguard Worker    fi
136*9e94795aSAndroid Build Coastguard Worker
137*9e94795aSAndroid Build Coastguard Worker    # libcore
138*9e94795aSAndroid Build Coastguard Worker    sed -i "s%$SDK_CODENAME%$SDK_VERSION%g" "$top/libcore/dalvik/src/main/java/dalvik/annotation/compat/VersionCodes.java"
139*9e94795aSAndroid Build Coastguard Worker
140*9e94795aSAndroid Build Coastguard Worker    # platform_testing
141*9e94795aSAndroid Build Coastguard Worker    local version_codes="$top/platform_testing/libraries/compatibility-common-util/src/com/android/compatibility/common/util/VersionCodes.java"
142*9e94795aSAndroid Build Coastguard Worker    sed -i -e "/=.*$((${FINAL_PLATFORM_SDK_VERSION}-1));/a \\    ${SDK_VERSION}" $version_codes
143*9e94795aSAndroid Build Coastguard Worker
144*9e94795aSAndroid Build Coastguard Worker    # tools/platform-compat
145*9e94795aSAndroid Build Coastguard Worker    local class2nonsdklist="$top/tools/platform-compat/java/com/android/class2nonsdklist/Class2NonSdkList.java"
146*9e94795aSAndroid Build Coastguard Worker    if ! grep -q "\.*map.put($((${FINAL_PLATFORM_SDK_VERSION}))" $class2nonsdklist ; then
147*9e94795aSAndroid Build Coastguard Worker      local sdk_version="map.put(${FINAL_PLATFORM_SDK_VERSION}, FLAG_UNSUPPORTED);"
148*9e94795aSAndroid Build Coastguard Worker      sed -i -e "/.*map.put($((${FINAL_PLATFORM_SDK_VERSION}-1))/a \\        ${sdk_version}" $class2nonsdklist
149*9e94795aSAndroid Build Coastguard Worker    fi
150*9e94795aSAndroid Build Coastguard Worker
151*9e94795aSAndroid Build Coastguard Worker    # Finalize resources
152*9e94795aSAndroid Build Coastguard Worker    "$top/frameworks/base/tools/aapt2/tools/finalize_res.py" \
153*9e94795aSAndroid Build Coastguard Worker           "$top/frameworks/base/core/res/res/values/public-staging.xml" \
154*9e94795aSAndroid Build Coastguard Worker           "$top/frameworks/base/core/res/res/values/public-final.xml"
155*9e94795aSAndroid Build Coastguard Worker
156*9e94795aSAndroid Build Coastguard Worker    # frameworks/base
157*9e94795aSAndroid Build Coastguard Worker    sed -i "s%$SDK_CODENAME%$SDK_VERSION%g" "$top/frameworks/base/core/java/android/os/Build.java"
158*9e94795aSAndroid Build Coastguard Worker    sed -i -e "/=.*$((${FINAL_PLATFORM_SDK_VERSION}-1)),/a \\    SDK_${FINAL_PLATFORM_CODENAME_JAVA} = ${FINAL_PLATFORM_SDK_VERSION}," "$top/frameworks/base/tools/aapt/SdkConstants.h"
159*9e94795aSAndroid Build Coastguard Worker    sed -i -e "/=.*$((${FINAL_PLATFORM_SDK_VERSION}-1)),/a \\  SDK_${FINAL_PLATFORM_CODENAME_JAVA} = ${FINAL_PLATFORM_SDK_VERSION}," "$top/frameworks/base/tools/aapt2/SdkConstants.h"
160*9e94795aSAndroid Build Coastguard Worker
161*9e94795aSAndroid Build Coastguard Worker    # Bump Mainline SDK extension version.
162*9e94795aSAndroid Build Coastguard Worker    bumpSdkExtensionsVersion
163*9e94795aSAndroid Build Coastguard Worker
164*9e94795aSAndroid Build Coastguard Worker    # target to build SDK
165*9e94795aSAndroid Build Coastguard Worker    local sdk_m="$top/build/soong/soong_ui.bash --make-mode TARGET_PRODUCT=aosp_arm64 TARGET_RELEASE=fina_1 TARGET_BUILD_VARIANT=userdebug DIST_DIR=out/dist"
166*9e94795aSAndroid Build Coastguard Worker
167*9e94795aSAndroid Build Coastguard Worker    # Force update current.txt
168*9e94795aSAndroid Build Coastguard Worker    $sdk_m clobber
169*9e94795aSAndroid Build Coastguard Worker    $sdk_m update-api
170*9e94795aSAndroid Build Coastguard Worker}
171*9e94795aSAndroid Build Coastguard Worker
172*9e94795aSAndroid Build Coastguard Workerfinalize_sdk_resources
173*9e94795aSAndroid Build Coastguard Worker
174