diff --git a/server/build-docker.sh b/server/build-docker.sh index e1d53215..26f5900f 100755 --- a/server/build-docker.sh +++ b/server/build-docker.sh @@ -37,7 +37,7 @@ for request in $REQUESTED; do INSTALL="wine nssdk-1832" ;; android) - INSTALL="android android-ndk25" + INSTALL="android android-ndk25 android-ndk25_sdk36" ;; android-ndk-*) INSTALL="android $request" diff --git a/server/configs/application-local-dev-app.yml b/server/configs/application-local-dev-app.yml index 84898cad..0f5f0080 100644 --- a/server/configs/application-local-dev-app.yml +++ b/server/configs/application-local-dev-app.yml @@ -7,6 +7,10 @@ extender: url: http://android-ndk25:9000 instanceId: android-ndk25 alwaysOn: true + android-ndk25_sdk36: + url: http://android-ndk25_sdk36:9000 + instanceId: android-ndk25_sdk36 + alwaysOn: true emsdk-3165: url: http://emsdk-3165:9000 instanceId: emsdk-3165 diff --git a/server/docker/Dockerfile.android.ndk25-env b/server/docker/Dockerfile.android.ndk25-env index d0fc6d96..bff8df68 100644 --- a/server/docker/Dockerfile.android.ndk25-env +++ b/server/docker/Dockerfile.android.ndk25-env @@ -113,4 +113,4 @@ RUN \ RUN \ echo '#!/usr/bin/env bash' > /usr/bin/ar && \ find /opt/platformsdk/android -iname "llvm-ar" | tail -1 | xargs xargs printf "%s \$*\n" $1 >> /usr/bin/ar && \ - chmod +x /usr/bin/ar + chmod +x /usr/bin/ar \ No newline at end of file diff --git a/server/docker/Dockerfile.android.ndk25_sdk36-env b/server/docker/Dockerfile.android.ndk25_sdk36-env new file mode 100644 index 00000000..1e56a3af --- /dev/null +++ b/server/docker/Dockerfile.android.ndk25_sdk36-env @@ -0,0 +1,93 @@ +FROM europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-android-env:1.6.0 + +# +# Android SDK/NDK +# https://developer.android.com/studio/command-line/variables +# +ENV ANDROID_ROOT=${PLATFORMSDK_DIR}/android +# ANDROID_HOME has been replaced with ANDROID_SDK_ROOT +ENV ANDROID_HOME=${ANDROID_ROOT}/android-sdk-linux +ENV ANDROID_SDK_ROOT=${ANDROID_HOME} +# ANDROID_SDK_HOME is the location of the .android folder +ENV ANDROID_SDK_HOME=${ANDROID_ROOT}/.android + +ENV ANDROID_BUILD_TOOLS_VERSION=36.1.0 +ENV ANDROID_SDK_VERSION=36 +ENV ANDROID_SDK_FILENAME=android-sdk-linux-android-${ANDROID_SDK_VERSION}-${ANDROID_BUILD_TOOLS_VERSION}.tar.gz + +ENV ANDROID_SDK_BUILD_TOOLS_PATH=${ANDROID_HOME}/build-tools/${ANDROID_BUILD_TOOLS_VERSION} +ENV ANDROID_LIBRARYJAR=${ANDROID_HOME}/platforms/android-${ANDROID_SDK_VERSION}/android.jar + +# We specify it in build_input.yml by setting it the first in PATH for new SDK +# But at least one SDK should be specified by default in Dockerfile +ENV PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_SDK_BUILD_TOOLS_PATH} +# ANDROID_SDK_VERSION used in Java code, default should be specified in Dockerfile as well: +ENV ANDROID_SDK_VERSION=${ANDROID_SDK_VERSION} + +ENV ANDROID_NDK_VERSION=25b +ENV ANDROID_NDK_API_VERSION=19 +ENV ANDROID_64_NDK_API_VERSION=21 + +# These paths are the same for both the 32 and 64 bit toolchains +ENV ANDROID_NDK_PATH=${ANDROID_ROOT}/android-ndk-r${ANDROID_NDK_VERSION} +ENV ANDROID_NDK_BIN_PATH=${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin +ENV ANDROID_NDK_SYSROOT=${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/sysroot +ENV ANDROID_NDK_FILENAME=android-ndk-r${ANDROID_NDK_VERSION}-linux.tar.gz + +# We specify it in build_input.yml by setting it the first in PATH +ENV PATH=${PATH}:${ANDROID_NDK_BIN_PATH} + +# android proguard was version 4.7, this is at least 5.2.1 which seems to work with OpenJDK 11 +RUN \ + apt-get update && \ + apt-get install -y --no-install-recommends proguard && \ + ls -la /usr/share/java/proguard.jar + +ENV ANDROID_PROGUARD=/usr/share/java/proguard.jar + +RUN --mount=type=secret,id=DM_PACKAGES_URL,required=true \ + echo "Android SDK" && \ + mkdir -p ${ANDROID_HOME} && \ + wget -q -O - $(cat /run/secrets/DM_PACKAGES_URL)/${ANDROID_NDK_FILENAME} | tar xz -C ${ANDROID_ROOT} && \ + wget -q -O - $(cat /run/secrets/DM_PACKAGES_URL)/${ANDROID_SDK_FILENAME} | tar xz -C ${ANDROID_HOME} --strip-components=1 && \ + rm -rf ${ANDROID_HOME}/extras && \ + rm -rf ${ANDROID_NDK_PATH}/prebuilt && \ + rm -rf ${ANDROID_NDK_PATH}/simpleperf && \ + rm -rf ${ANDROID_NDK_PATH}/shader-tools && \ + rm -rf ${ANDROID_NDK_PATH}/sources/third_party && \ + rm -rf ${ANDROID_NDK_PATH}/sources/cxx-stl && \ + rm -rf ${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/i686-linux-android && \ + rm -rf ${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/x86_64-linux-android && \ + rm -rf ${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-* && \ + rm -rf ${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-* && \ + rm -rf ${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android && \ + rm -rf ${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android && \ +# create the .android folder and give read+write permissions (the Android Gradle plugin will write to the folder) +# It is not enough to give 'user' and 'group'. We unfortunately also need 'others' + mkdir ${ANDROID_SDK_HOME} && \ + chmod ugo+rw -R ${ANDROID_SDK_HOME} && \ +# fix permissions + chmod +r -R ${ANDROID_ROOT} && \ + chmod +w -R ${ANDROID_SDK_ROOT} && \ + chmod -R 755 ${ANDROID_ROOT}/android-ndk-r${ANDROID_NDK_VERSION} && \ +# check that dx installed properly + ls -la ${ANDROID_SDK_BUILD_TOOLS_PATH}/d8 && \ + which ${ANDROID_NDK_BIN_PATH}/armv7a-linux-androideabi${ANDROID_NDK_API_VERSION}-clang++ && \ + which ${ANDROID_NDK_BIN_PATH}/aarch64-linux-android${ANDROID_64_NDK_API_VERSION}-clang++ && \ +# check that aapt installed correctly + aapt v && \ + aapt2 version + +# download and install R8 utility separatly. It's done in that way because +# R8/D8 received fixes from time to time which not populated with build tools +# It's ok that R8.jar downloaded but saved to D8.jar. Can't find D8 as separate utility. +# R8 contains all classes of D8. +ENV R8_VERSION=8.13.19 +RUN wget -O ${ANDROID_SDK_BUILD_TOOLS_PATH}/lib/d8.jar https://storage.googleapis.com/r8-releases/raw/${R8_VERSION}/r8.jar + +# Since dotnet cannot really cross compile, we need to create a "ar" shim for "llvm-ar" +# As long as it's in the path, it will be picked up +RUN \ + echo '#!/usr/bin/env bash' > /usr/bin/ar && \ + find /opt/platformsdk/android -iname "llvm-ar" | tail -1 | xargs xargs printf "%s \$*\n" $1 >> /usr/bin/ar && \ + chmod +x /usr/bin/ar diff --git a/server/docker/docker-compose.yml b/server/docker/docker-compose.yml index 500755af..0ef96751 100644 --- a/server/docker/docker-compose.yml +++ b/server/docker/docker-compose.yml @@ -63,7 +63,7 @@ services: service: common_builder command: ["--spring.config.location=classpath:./,file:/etc/defold/extender/", "--spring.profiles.active=local-dev-android${STRUCTURED_LOGGING+,logging}"] environment: - - INSTANCE_ID=emsdk-2011-local + - INSTANCE_ID=android-ndk25-local profiles: - all - android @@ -71,6 +71,21 @@ services: default: aliases: - android-ndk25 + android_ndk25_sdk36-dev: + image: europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-android-ndk25_sdk36-env:latest + extends: + file: common-services.yml + service: common_builder + command: ["--spring.config.location=classpath:./,file:/etc/defold/extender/", "--spring.profiles.active=local-dev-android${STRUCTURED_LOGGING+,logging}"] + environment: + - INSTANCE_ID=android-ndk25_sdk36-local + profiles: + - all + - android + networks: + default: + aliases: + - android-ndk25_sdk36 emscripten_3165-dev: image: europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-emsdk-3165-env:latest extends: @@ -202,6 +217,19 @@ services: default: aliases: - android-ndk25 + android_ndk25_sdk36-integration-test: + image: europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-android-ndk25_sdk36-env:latest + extends: + file: common-services.yml + service: test_builder + command: ["--spring.config.location=classpath:./,file:/etc/defold/extender/", "--spring.profiles.active=local-dev-android"] + profiles: + - test + - auth-test + networks: + default: + aliases: + - android-ndk25_sdk35 emscripten_3165-integration-test: image: europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-emsdk-3165-env:latest extends: diff --git a/server/test-data/sdk/a/defoldsdk/extender/build.yml b/server/test-data/sdk/a/defoldsdk/extender/build.yml index 636cef74..953d0f1b 100755 --- a/server/test-data/sdk/a/defoldsdk/extender/build.yml +++ b/server/test-data/sdk/a/defoldsdk/extender/build.yml @@ -267,15 +267,15 @@ platforms: android: env: PROGUARD: "{{env.ANDROID_PROGUARD}}" - LIBRARYJAR: "{{env.ANDROID_LIBRARYJAR_35}}" - NDK_PATH: "{{env.ANDROID_NDK25_PATH}}" - SYSROOT: "{{env.ANDROID_NDK25_SYSROOT}}" + LIBRARYJAR: "{{env.ANDROID_LIBRARYJAR}}" + NDK_PATH: "{{env.ANDROID_NDK_PATH}}" + SYSROOT: "{{env.ANDROID_NDK_SYSROOT}}" MANIFEST_MERGE_TOOL: "{{env.MANIFEST_MERGE_TOOL}}" PATH: "{{env.PATH}}" - NDK_LD: "{{env.ANDROID_NDK25_BIN_PATH}}/ld.lld" - NDK_AR: "{{env.ANDROID_NDK25_BIN_PATH}}/llvm-ar" - ANDROID_SDK_VERSION: "{{env.ANDROID_SDK_VERSION_35}}" - ANDROID_BUILD_TOOLS_PATH: "{{env.ANDROID_SDK_BUILD_TOOLS_PATH_35}}" + NDK_LD: "{{env.ANDROID_NDK_BIN_PATH}}/ld.lld" + NDK_AR: "{{env.ANDROID_NDK_BIN_PATH}}/llvm-ar" + ANDROID_SDK_VERSION: "{{env.ANDROID_SDK_VERSION}}" + ANDROID_BUILD_TOOLS_PATH: "{{env.ANDROID_SDK_BUILD_TOOLS_PATH}}" context: engineJars: ["{{dynamo_home}}/ext/share/java/android-support-multidex.jar", "{{dynamo_home}}/ext/share/java/androidx-multidex.jar", "{{dynamo_home}}/ext/share/java/glfw_android.jar", "{{dynamo_home}}/share/java/gamesys_android.jar", "{{dynamo_home}}/share/java/sound_android.jar"] engineLibs: ["engine", "engine_service", "mbedtls", "zip", "profile", "remotery", "profilerext", "record_null", "gameobject", "ddf", "resource", "gamesys", "gamesys_model", "gamesys_rig", "script_box2d", "graphics", "graphics_transcoder_basisu", "basis_transcoder", "physics", "BulletDynamics", "BulletCollision", "platform", "LinearMath", "Box2D", "render", "render_font_default", "script", "luajit-5.1", "extension", "hid", "input", "particle", "rig", "dlib", "image", "dmglfw", "gui", "crashext", "sound", "tremolo", "liveupdate", "unwind"] @@ -312,8 +312,8 @@ platforms: armv7-android: env: - NDK_VERSION: "{{env.ANDROID_NDK25_API_VERSION}}" - NDK_CXX: "{{env.ANDROID_NDK25_BIN_PATH}}/armv7a-linux-androideabi{{env.ANDROID_NDK25_API_VERSION}}-clang++" + NDK_VERSION: "{{env.ANDROID_NDK_API_VERSION}}" + NDK_CXX: "{{env.ANDROID_NDK_BIN_PATH}}/armv7a-linux-androideabi{{env.ANDROID_NDK_API_VERSION}}-clang++" context: libPaths: ["{{dynamo_home}}/lib/armv7-android", "{{dynamo_home}}/ext/lib/armv7-android"] defines: ["DM_PLATFORM_ANDROID", "LUA_BYTECODE_ENABLE_32", "__ARM_ARCH_5__", "__ARM_ARCH_5T__", "__ARM_ARCH_5E__", "__ARM_ARCH_5TE__"] @@ -323,8 +323,8 @@ platforms: arm64-android: env: - NDK_VERSION: "{{env.ANDROID_64_NDK25_API_VERSION}}" - NDK_CXX: "{{env.ANDROID_NDK25_BIN_PATH}}/aarch64-linux-android{{env.ANDROID_64_NDK25_API_VERSION}}-clang++" + NDK_VERSION: "{{env.ANDROID_64_NDK_API_VERSION}}" + NDK_CXX: "{{env.ANDROID_NDK_BIN_PATH}}/aarch64-linux-android{{env.ANDROID_64_NDK_API_VERSION}}-clang++" context: libPaths: ["{{dynamo_home}}/lib/arm64-android", "{{dynamo_home}}/ext/lib/arm64-android"] defines: ["DM_PLATFORM_ANDROID", "__aarch64__"]