浏览代码

Legacy Android Script Deprecation (#17916)

* Updates to support deprecation of legacy android generation scripts
* Update gradle to version 8.7 for the new android project generation workflow
* Update JDK to jdk17 for the new android project generation workflow to support the latest android_sdk
* Add new 'NONE' option to 'ASSET_MODE' to support generating APK packages without assets (needed for gradle AR, but still a valid use case)
* Update the gradle_windows.cmd to use the new android project generation scripts in the o3de command line tools
* Update how AndroidSDK command line tools is downloaded
* Update pipeline node label for new windows image as part of this update
* Additional fixes
* Fix ANDROID_SDK_ROOT
* Fix AndroidSDK command path
* Update scripts/build/Platform/Android/pipeline.json
* Update scripts/build/build_node/Platform/Windows/install-windows-android.ps1

Signed-off-by: Steve Pham <[email protected]>
Co-authored-by: Mike Chang <[email protected]>
Steve Pham 8 月之前
父节点
当前提交
8f26dbf996

+ 5 - 2
cmake/Tools/Platform/Android/android_post_build.py

@@ -24,7 +24,8 @@ ANDROID_ARCH = 'arm64-v8a'
 
 ASSET_MODE_PAK     = 'PAK'
 ASSET_MODE_LOOSE   = 'LOOSE'
-SUPPORTED_ASSET_MODES = [ASSET_MODE_PAK, ASSET_MODE_LOOSE]
+ASSET_MODE_NONE    = 'NONE'
+SUPPORTED_ASSET_MODES = [ASSET_MODE_PAK, ASSET_MODE_LOOSE, ASSET_MODE_NONE]
 ASSET_PLATFORM_KEY = 'android'
 
 SUPPORTED_BUILD_CONFIGS = ['debug', 'profile', 'release']
@@ -186,7 +187,9 @@ def post_build_action(android_app_root: Path, project_root: Path, gradle_version
         apply_pak_layout(project_root=project_root,
                          target_layout_root=target_layout_root,
                          asset_bundle_folder=asset_bundle_folder)
-
+    elif asset_mode == ASSET_MODE_NONE:
+        # Skip any asset layout
+        pass
     else:
         raise AndroidPostBuildError(f"Invalid Asset Mode '{asset_mode}'.")
 

+ 95 - 36
scripts/build/Platform/Android/gradle_windows.cmd

@@ -9,24 +9,62 @@ REM
 
 SETLOCAL EnableDelayedExpansion
 
-IF NOT EXIST "%LY_3RDPARTY_PATH%" (
-    ECHO [ci_build] Warning: LY_3RDPARTY_PATH %LY_3RDPARTY_PATH% does not exist. The 3rd party files will be downloaded.
-    mkdir %LY_3RDPARTY_PATH%
+SET CURRENT_DIR=%cd%
+
+REM Calculate the path of the engine based on the relative position of this script
+SET CMD_DIR=%~dp0
+SET CMD_DIR=%CMD_DIR:~0,-1%
+SET O3DE_PATH_REL=%CMD_DIR%\..\..\..\..\
+for %%i in ("%O3DE_PATH_REL%") do SET "O3DE_PATH=%%~fi"
+
+ECHO Using O3DE Engine at '%O3DE_PATH%'
+
+REM Validate the Android SDK is set
+IF "%ANDROID_SDK_ROOT%" == "" (
+    ECHO Environment key ANDROID_SDK_ROOT not set
+    GOTO :error
 )
+IF NOT EXIST "%ANDROID_SDK_ROOT%" (
+    ECHO Environment key value for ANDROID_SDK_ROOT '%ANDROID_SDK_ROOT%' does not exist
+    GOTO :error
+)
+ECHO Using Android SDK at '%ANDROID_SDK_ROOT%'
+CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value sdk.root="%ANDROID_SDK_ROOT%" --global
 
-IF NOT EXIST "%GRADLE_BUILD_HOME%" (
-    REM This is the default for developers
-    SET GRADLE_BUILD_HOME=C:\Gradle\gradle-7.0
+
+REM Validate that gradle home path was set
+IF "%GRADLE_BUILD_HOME%" == "" (
+    ECHO Environment key GRADLE_BUILD_HOME not set
+    GOTO :error
 )
 IF NOT EXIST "%GRADLE_BUILD_HOME%" (
-    ECHO [ci_build] FAIL: GRADLE_BUILD_HOME=%GRADLE_BUILD_HOME%
+    ECHO Environment key value for ANDROID_SDK_ROOT '%GRADLE_BUILD_HOME%' does not exist
     GOTO :error
 )
+ECHO Using Gradle Build at '%GRADLE_BUILD_HOME%'
+CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value gradle.home="%GRADLE_BUILD_HOME%" --global
+
 
-IF NOT "%ANDROID_GRADLE_PLUGIN%" == "" (
-    set ANDROID_GRADLE_PLUGIN_OPTION=--gradle-plugin-version=%ANDROID_GRADLE_PLUGIN%
+REM Optionally override the gradle plugin version, otherwise default to 8.1.4
+IF "%ANDROID_GRADLE_PLUGIN%" == "" (
+    ECHO Using [default] Android gradle plugin version 8.1.4
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value android.gradle.plugin=8.1.4 --global
+) else (
+    ECHO Using [default] Android gradle plugin version 
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value android.gradle.plugin=%ANDROID_GRADLE_PLUGIN% --global
 )
 
+
+REM Optionally override the version of the android NDK to use, otherwise default to 25
+IF "%ANDROID_NDK_VERSION%" == "" (
+    ECHO Using [default] Android NDK Version 25
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value ndk.version=25.*
+) else (
+    ECHO Using [default] Android NDK Version %ANDROID_NDK_VERSION%
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value ndk.version=%ANDROID_NDK_VERSION%
+)
+
+
 IF NOT EXIST %OUTPUT_DIRECTORY% (
     mkdir %OUTPUT_DIRECTORY%
 ) ELSE (
@@ -35,7 +73,6 @@ IF NOT EXIST %OUTPUT_DIRECTORY% (
     RMDIR /S /Q %OUTPUT_DIRECTORY%
     mkdir %OUTPUT_DIRECTORY%
 )
-
 REM Jenkins does not defined TMP
 IF "%TMP%"=="" (
     IF "%WORKSPACE%"=="" (
@@ -50,15 +87,14 @@ IF "%TMP%"=="" (
         )
     )
 )
-
 REM Create a minimal project for the native build process
 IF EXIST "%TMP%\o3de_gradle_ar" (
     DEL /S /F /Q "%TMP%\o3de_gradle_ar"
     RMDIR /S /Q "%TMP%\o3de_gradle_ar"
 )
 ECHO Creating a minimal project for the native build process
-ECHO %PYTHON% scripts\o3de.py create-project -pp "%TMP%\o3de_gradle_ar" -pn GradleTest -tn MinimalProject
-CALL %PYTHON% scripts\o3de.py create-project -pp "%TMP%\o3de_gradle_ar" -pn GradleTest -tn MinimalProject
+ECHO %PYTHON% %O3DE_PATH%\scripts\o3de.bat create-project -pp "%TMP%\o3de_gradle_ar" -pn GradleTest -tn MinimalProject
+CALL %PYTHON% %O3DE_PATH%\scripts\o3de.bat create-project -pp "%TMP%\o3de_gradle_ar" -pn GradleTest -tn MinimalProject
 
 REM Optionally sign the APK if we are generating an APK 
 SET GENERATE_SIGNED_APK=false
@@ -68,25 +104,40 @@ IF "%SIGN_APK%"=="true" (
     )
 )
 
-SET PYTHON=python\python.cmd
+SET PYTHON=%O3DE_PATH%\python\python.cmd
 
-REM Regardless of whether or not we generate a signing key, apparently we must set variables outside of 
-REM an IF clause otherwise it will not work.
+IF "%JDK_PATH%" == "" (
 
-REM First look in the windowsregistry
-FOR /F "skip=2 tokens=1,2*" %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8" /v "JavaHome" 2^>nul') DO (
-    SET JDK_REG_VALUE=%%C
-)
-IF EXIST "%JDK_REG_VALUE%" (
-    SET JAVA_HOME=!JDK_REG_VALUE!
-    ECHO JAVA_HOME found in registry: !JAVA_HOME!
-    GOTO JDK_FOUND
-) ELSE (
-    REM Next, look for the JDK HOME in the environment variable
-    IF EXIST "%JAVA_HOME%" (
-        ECHO JDK Home found in Environment: !JAVA_HOME!
-        GOTO JDK_FOUND
+    IF "%JAVA_HOME%" == "" (
+        REM First look in the windowsregistry
+        FOR /F "skip=2 tokens=1,2*" %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8" /v "JavaHome" 2^>nul') DO (
+            SET JDK_REG_VALUE=%%C
+        )
+        IF EXIST "%JDK_REG_VALUE%" (
+            SET JAVA_HOME=!JDK_REG_VALUE!
+            ECHO JAVA_HOME found in registry: !JAVA_HOME!
+            GOTO JDK_FOUND
+        ) ELSE (
+            REM Next, look for the JDK HOME in the environment variable
+            IF EXIST "%JAVA_HOME%" (
+                ECHO JDK Home found in Environment: !JAVA_HOME!
+                GOTO JDK_FOUND
+            )
+        )
+    ) else (
+        echo Using Java from JAVA_HOME at '%JAVA_HOME%'
+        IF EXIST "%JAVA_HOME%" (
+            GOTO :JDK_FOUND
+        )
+        echo JAVA_HOME set to an invalid path '%JAVA_HOME%'
+    )
+) else (
+    echo Using Java from JDK_PATH at '%JDK_PATH%'
+    IF EXIST "%JDK_PATH%" (
+        SET JAVA_HOME=%JDK_PATH%
+        GOTO :JDK_FOUND
     )
+    echo JDK_PATH set to an invalid path '%JDK_PATH%'
 )
 
 ECHO Unable to locate JAVA_HOME
@@ -118,7 +169,6 @@ SET CI_KEYSTORE_CERT_DN=cn=LY Developer, ou=Lumberyard, o=Amazon, c=US
 REM Clear out any existing keystore file since the password/alias may have changed
 SET CI_ANDROID_KEYSTORE_FILE_ABS=%cd%\%OUTPUT_DIRECTORY%\%CI_ANDROID_KEYSTORE_FILE%
 
-
 IF "%GENERATE_SIGNED_APK%"=="true" (
 
     REM Prepare a temporary keystore just for this unit test session
@@ -137,12 +187,19 @@ IF "%GENERATE_SIGNED_APK%"=="true" (
         ECHO Using keystore file at %CI_ANDROID_KEYSTORE_FILE_ABS%
     )
 
-    ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g "%TMP%\o3de_gradle_ar" --gradle-install-path=%GRADLE_BUILD_HOME% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build --android-sdk-path=%ANDROID_HOME% %ANDROID_GRADLE_PLUGIN_OPTION% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing
-    CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g "%TMP%\o3de_gradle_ar" --gradle-install-path=%GRADLE_BUILD_HOME% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build --android-sdk-path=%ANDROID_HOME% %ANDROID_GRADLE_PLUGIN_OPTION% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing
-) ELSE (
-    ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g "%TMP%\o3de_gradle_ar" %GRADLE_OVERRIDE_OPTION% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build %ANDROID_GRADLE_PLUGIN_OPTION% --android-sdk-path=%ANDROID_HOME% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing
-    CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g "%TMP%\o3de_gradle_ar" --gradle-install-path=%GRADLE_BUILD_HOME% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build %ANDROID_GRADLE_PLUGIN_OPTION% --android-sdk-path=%ANDROID_HOME% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing
-)
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value signconfig.store.file=%CI_ANDROID_KEYSTORE_FILE_ABS% 
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value signconfig.key.alias=%CI_ANDROID_KEYSTORE_ALIAS% 
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value signconfig.key.password=%CI_ANDROID_KEYSTORE_PASSWORD%
+    CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value signconfig.store.password=%CI_ANDROID_KEYSTORE_PASSWORD%
+
+) 
+
+CALL %O3DE_PATH%\scripts\o3de.bat android-configure --set-value asset.mode=NONE
+
+cd "%TMP%\o3de_gradle_ar"
+
+ECHO %O3DE_PATH%\scripts\o3de.bat android-generate -p %TMP%\o3de_gradle_ar -B %OUTPUT_DIRECTORY%
+CALL %O3DE_PATH%\scripts\o3de.bat android-generate -p %TMP%\o3de_gradle_ar -B %OUTPUT_DIRECTORY%
 
 SET CMAKE_BUILD_PARALLEL_LEVEL=!NUMBER_OF_PROCESSORS!
 
@@ -188,6 +245,7 @@ CALL gradlew --stop
 
 POPD
 
+cd %CURRENT_DIR%
 EXIT /b 0
 
 :popd_error
@@ -195,4 +253,5 @@ POPD
 
 :error
 
+cd %CURRENT_DIR%
 EXIT /b 1

+ 2 - 2
scripts/build/Platform/Android/pipeline.json

@@ -1,9 +1,9 @@
 {
     "ENV": {
         "GRADLE_HOME": "C:/Gradle/gradle-7.0",
-        "NODE_LABEL": "windows-latest",
+        "NODE_LABEL": "windows-2024-07",
         "LY_3RDPARTY_PATH": "D:\\workspace\\3rdParty",
-        "LY_NDK_DIR": "C:/Android/android-sdk/ndk/21.4.7075529",
+        "LY_NDK_DIR": "C:/AndroidSdk/ndk/21.4.7075529",
         "TIMEOUT": 30,
         "WORKSPACE": "D:/workspace",
         "MOUNT_VOLUME": true

+ 1 - 1
scripts/build/Platform/Windows/pipeline.json

@@ -1,6 +1,6 @@
 {
     "ENV": {
-        "NODE_LABEL": "windows-latest",
+        "NODE_LABEL": "windows-2024-07",
         "LY_3RDPARTY_PATH": "D:/workspace/3rdParty",
         "TIMEOUT": 30,
         "WORKSPACE": "D:/workspace",

+ 19 - 6
scripts/build/build_node/Platform/Windows/install-windows-android.ps1

@@ -5,9 +5,21 @@ For complete copyright and license terms please see the LICENSE at the root of t
 SPDX-License-Identifier: Apache-2.0 OR MIT
 #>
 
-Write-Host "Installing Android SDK"
-choco install -y android-sdk
-[Environment]::SetEnvironmentVariable("ANDROID_HOME", "C:\Android\android-sdk", [EnvironmentVariableTarget]::Machine)
+Import-Module C:\ProgramData\chocolatey\helpers\chocolateyInstaller.psm1 
+
+
+
+#Android SDK Command line tools needs a custom installer due the latest command like version not being available in the Chocolatey repository
+$androidSdkPackageName = 'androidsdk'
+$androidSdkVersion = '11076708_latest'
+$androidSdkUrl = "https://dl.google.com/android/repository/commandlinetools-win-$androidSdkVersion.zip"
+$androidSdkChecksum = '4d6931209eebb1bfb7c7e8b240a6a3cb3ab24479ea294f3539429574b1eec862'
+$androidSdkInstallDir = "C:\AndroidSdk\cmdline-tools"
+$androidSdkLatestDir = "$androidSdkInstallDir\latest"
+Install-ChocolateyZipPackage $androidSdkPackageName $androidSdkUrl $androidSdkInstallDir -Checksum $androidSdkChecksum -ChecksumType 'sha256'
+[Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", "C:\AndroidSdk", [EnvironmentVariableTarget]::Machine)
+# Rename the Android SDK folder 'cmdline-tools' to match what the command line tools looks like normally in a full AndroidSDK install
+Rename-Item -Path "$androidSdkInstallDir\cmdline-tools" "$androidSdkLatestDir"
 
 # Set package versions
 $android_packages = '"platforms;android-28" "platforms;android-29" "platforms;android-30"'
@@ -16,7 +28,8 @@ $build_tools = '"build-tools;30.0.2" "build-tools;34.0.0" "tools"'
 $ndk = '"ndk;21.4.7075529" "ndk;23.1.7779620" "ndk;25.1.8937393" "ndk;25.2.9519653"'
 
 Write-Host "Installing Android SDK packages"
-$sdkmanager = "C:\Android\android-sdk\tools\bin\sdkmanager.bat"
+$sdkmanager = "$androidSdkLatestDir\bin\sdkmanager.bat"
+Start-Process -FilePath $sdkmanager -ArgumentList "--licenses" -NoNewWindow -Wait # Accept all licenses manually
 Start-Process -FilePath $sdkmanager -ArgumentList $android_packages -NoNewWindow -Wait
 Start-Process -FilePath $sdkmanager -ArgumentList $googleplay_packages -NoNewWindow -Wait
 Start-Process -FilePath $sdkmanager -ArgumentList $build_tools -NoNewWindow -Wait
@@ -25,8 +38,8 @@ Start-Process -FilePath $sdkmanager -ArgumentList $ndk -NoNewWindow -Wait
 [Environment]::SetEnvironmentVariable("LY_NDK_DIR", "C:\AndroidSdk\ndk\25.1.8937393", [EnvironmentVariableTarget]::Machine)
 
 Write-Host "Installing Gradle"
-$gradle_version = '7.0'
-$gradle_checksum = '81003F83B0056D20EEDF48CDDD4F52A9813163D4BA185BCF8ABD34B8EEEA4CBD'
+$gradle_version = '8.7'
+$gradle_checksum = '194717442575a6f96e1c1befa2c30e9a4fc90f701d7aee33eb879b79e7ff05c0'
 
 #Gradle needs a custom installer due to being hardcoded to C:\Programdata in Chocolatey
 Import-Module C:\ProgramData\chocolatey\helpers\chocolateyInstaller.psm1 

+ 2 - 2
scripts/build/build_node/Platform/Windows/install-windows-buildtools.ps1

@@ -13,10 +13,10 @@ Write-Host "Install Java (for Jenkins)"
 choco install corretto11jdk -y --ia INSTALLDIR="c:\jdk11" # Custom directory to handle cases where whitespace in the path is not quote wrapped
 
 Write-Host "Install Java (for Android)"
-choco install corretto8jdk -y --ia INSTALLDIR="c:\jdk8" # Custom directory to handle cases where whitespace in the path is not quote wrapped
+choco install corretto17jdk -y --ia INSTALLDIR="c:\jdk17" # Custom directory to handle cases where whitespace in the path is not quote wrapped
 
 Write-Host "Set JDK_PATH for Android"
-[Environment]::SetEnvironmentVariable("JDK_PATH", "c:\jdk8", [EnvironmentVariableTarget]::Machine)
+[Environment]::SetEnvironmentVariable("JDK_PATH", "c:\jdk17\jdk17.0.12_7", [EnvironmentVariableTarget]::Machine)
     
 Write-Host "Set Java path for Jenkins node agent"
 [Environment]::SetEnvironmentVariable("JENKINS_JAVA_CMD", "c:\jdk11", [EnvironmentVariableTarget]::Machine)

+ 4 - 3
scripts/o3de/o3de/android_support.py

@@ -61,8 +61,9 @@ else:
 
 ASSET_MODE_LOOSE = 'LOOSE'
 ASSET_MODE_PAK = 'PAK'
+ASSET_MODE_NONE = 'NONE'
 
-ASSET_MODES = [ASSET_MODE_LOOSE, ASSET_MODE_PAK]
+ASSET_MODES = [ASSET_MODE_LOOSE, ASSET_MODE_PAK, ASSET_MODE_NONE]
 
 BUILD_CONFIGURATIONS = ['Debug', 'Profile', 'Release']
 ANDROID_ARCH = 'arm64-v8a'
@@ -149,8 +150,8 @@ SETTINGS_SIGNING_KEY_PASSWORD   = register_setting(key='signconfig.key.password'
 
 # General O3DE build and deployment options
 SETTINGS_ASSET_MODE             = register_setting(key='asset.mode',
-                                                   description='The asset mode to determine how the assets are stored in the target APK. Valid values are LOOSE and PAK.',
-                                                   restricted_regex=f'({ASSET_MODE_LOOSE}|{ASSET_MODE_PAK})',
+                                                   description=f"The asset mode to determine how the assets are stored in the target APK. Valid values are {','.join(ASSET_MODES)}.",
+                                                   restricted_regex=f'({ASSET_MODE_LOOSE}|{ASSET_MODE_PAK}|{ASSET_MODE_NONE})',
                                                    restricted_regex_description=f"Valid values are {','.join(ASSET_MODES)}.")
 
 SETTINGS_STRIP_DEBUG            = register_setting(key='strip.debug',