diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 000000000000..90885eac0a50 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,148 @@ +name: Android 32/64-bit + +on: + push: + branches: + - master + - 'Stable*' + tags: + - 'v*' + paths-ignore: + - 'docs/**' + pull_request: + paths-ignore: + - 'docs/**' + +defaults: + run: + shell: bash + +env: + QT_VERSION: 6.6.3 + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + include: + - eabi: armeabi-v7a + arch: android_armv7 + ARTIFACT: QGroundControl32.apk + BuildType: Debug + - eabi: armeabi-v7a + arch: android_armv7 + ARTIFACT: QGroundControl32.apk + BuildType: Release + - eabi: arm64-v8a + arch: android_arm64_v8a + ARTIFACT: QGroundControl64.apk + BuildType: Debug + - eabi: arm64-v8a + arch: android_arm64_v8a + ARTIFACT: QGroundControl64.apk + BuildType: Release + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-tags: true + + - name: Setup Java Environment + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 11 + + - uses: actions/checkout@v4 + with: + repository: jurplel/install-qt-action + ref: master + path: install-qt-action + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: install-qt-action/action/ + + - name: Build jurplel/install-qt-action + run: | + cd install-qt-action/action/ + npm ci || npm install + npm run build + shell: bash + + - name: Install Qt6 for Linux + uses: ./install-qt-action/action/ + with: + version: ${{ env.QT_VERSION }} + host: linux + target: desktop + dir: ${{ runner.temp }} + modules: qtcharts qtlocation qtpositioning qtspeech qt5compat qtmultimedia qtserialport qtimageformats qtshadertools qtconnectivity qtquick3d + cache: true + + - name: Install Qt6 for Android + uses: ./install-qt-action/action/ + with: + version: ${{ env.QT_VERSION }} + host: linux + target: android + arch: ${{ matrix.arch }} + dir: ${{ runner.temp }} + extra: --autodesktop + modules: qtcharts qtlocation qtpositioning qtspeech qt5compat qtmultimedia qtserialport qtimageformats qtshadertools qtconnectivity qtquick3d + cache: true + + - name: Install gstreamer + working-directory: ${{ github.workspace }} + env: + GST_VERSION: 1.18.5 + run: | + wget --quiet https://gstreamer.freedesktop.org/data/pkg/android/${GST_VERSION}/gstreamer-1.0-android-universal-${GST_VERSION}.tar.xz + mkdir gstreamer-1.0-android-universal-${GST_VERSION} + tar xf gstreamer-1.0-android-universal-${GST_VERSION}.tar.xz -C gstreamer-1.0-android-universal-${GST_VERSION} + + - name: Install dependencies + run: sudo apt-get install -y ninja-build + + - name: Set Environment + run: | + mkdir ${{ runner.temp }}/shadow_build_dir + chmod a+x ${QT_ROOT_DIR}/bin/qt-cmake + + - name: Configure + working-directory: ${{ runner.temp }}/shadow_build_dir + env: + QT_ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/deploy/android/android_release.keystore + QT_ANDROID_KEYSTORE_ALIAS: QGCAndroidKeyStore + QT_ANDROID_KEYSTORE_STORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} + QT_ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} + run: ${QT_ROOT_DIR}/bin/qt-cmake -S ${{ github.workspace }} -B . -G Ninja + -DCMAKE_BUILD_TYPE=${{ matrix.BuildType }} + -DANDROID_ABI=${{ matrix.eabi }} + -DANDROID_PLATFORM=android-23 + -DQT_HOST_PATH:PATH=${QT_ROOT_DIR}/../gcc_64 + -DQT_DEBUG_FIND_PACKAGE=ON + -DQGC_STABLE_BUILD=${{ github.ref_type == 'tag' || contains(github.ref, 'Stable') && 'ON' || 'OFF' }} + + - name: Build + working-directory: ${{ runner.temp }}/shadow_build_dir + run: cmake --build . --target all --config ${{ matrix.BuildType }} + + - name: Prepare APK + working-directory: ${{ runner.temp }}/shadow_build_dir + run: cp ./android-build/*.apk ./${{ matrix.ARTIFACT }} + + - name: Upload Build File + uses: ./.github/actions/upload + if: matrix.BuildType == 'Release' + with: + artifact_name: ${{ matrix.ARTIFACT }} + aws_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + source: '' diff --git a/.github/workflows/android_debug.yml b/.github/workflows/android_debug.yml deleted file mode 100644 index 822b1e328dbf..000000000000 --- a/.github/workflows/android_debug.yml +++ /dev/null @@ -1,141 +0,0 @@ -# The 32 and 64 bit version of these actions should be kept in sync -name: Android 32/64-bit Debug - -on: - push: - branches: - - 'master' - - 'Stable*' - tags: - - 'v*' - paths-ignore: - - 'docs/**' - pull_request: - branches: - - '*' - paths-ignore: - - 'docs/**' - -defaults: - run: - shell: bash - -env: - SOURCE_DIR: ${{ github.workspace }} - QT_VERSION: 6.6.3 - BUILD_TYPE: ${{ fromJSON('["DailyBuild", "StableBuild"]')[ github.ref_type == 'tag' || contains(github.ref, 'Stable_' ) ] }} - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - architecture: 32bits - eabi: armeabi-v7a - arch: android_armv7 - ARTIFACT: QGroundControl32.apk - - architecture: 64bits - eabi: arm64-v8a - arch: android_arm64_v8a - ARTIFACT: QGroundControl64.apk - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - submodules: recursive - - - run: sudo apt update - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - create-symlink: true - key: ${{ runner.os }}-${{ matrix.arch }}-Debug - restore-keys: ${{ runner.os }}-${{ matrix.arch }}-Debug - max-size: "2G" - append-timestamp: false - - - name: Get all tags for correct version determination - working-directory: ${{ github.workspace }} - run: | - git fetch --all --tags -f --depth 1 - - - uses: actions/checkout@v4 - with: - repository: jurplel/install-qt-action - ref: master - path: install-qt-action - - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: npm - cache-dependency-path: install-qt-action/action/ - - - name: Build jurplel/install-qt-action - run: | - cd install-qt-action/action/ - npm ci || npm install - npm run build - shell: bash - - - name: Install Qt6 for Linux - uses: ./install-qt-action/action/ - with: - version: ${{ env.QT_VERSION }} - host: linux - target: desktop - dir: ${{ runner.temp }} - modules: qtcharts qtlocation qtpositioning qtspeech qt5compat qtmultimedia qtserialport qtimageformats qtshadertools qtconnectivity qtquick3d - cache: true - - - name: Install Qt6 for Android - uses: ./install-qt-action/action/ - with: - version: ${{ env.QT_VERSION }} - host: linux - target: android - arch: ${{ matrix.arch }} - dir: ${{ runner.temp }} - extra: --autodesktop - modules: qtcharts qtlocation qtpositioning qtspeech qt5compat qtmultimedia qtserialport qtimageformats qtshadertools qtconnectivity qtquick3d - cache: true - - - name: Remove Android SDKs to force usage of android-33 only - run: | - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-33-ext5" - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-33-ext4" - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-34" - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-34-ext8" - - - name: Install gstreamer - working-directory: ${{ github.workspace }} - run: | - wget --quiet https://gstreamer.freedesktop.org/data/pkg/android/1.18.5/gstreamer-1.0-android-universal-1.18.5.tar.xz - mkdir gstreamer-1.0-android-universal-1.18.5 - tar xf gstreamer-1.0-android-universal-1.18.5.tar.xz -C gstreamer-1.0-android-universal-1.18.5 - - - name: Update android manifest - if: github.ref_name != 'Stable' - run: ${SOURCE_DIR}/tools/update_android_manifest_package.sh ${{ github.ref_name }} - - - name: Install dependencies - run: sudo apt-get install -y ninja-build - - - name: Create build directory - run: mkdir ${{ runner.temp }}/shadow_build_dir - - - name: Build - working-directory: ${{ runner.temp }}/shadow_build_dir - run: | - chmod a+x ${QT_ROOT_DIR}/bin/qt-cmake - ${QT_ROOT_DIR}/bin/qt-cmake -S ${{ env.SOURCE_DIR }} -B ${{ runner.temp }}/shadow_build_dir/ -G Ninja \ - -DCMAKE_BUILD_TYPE=Debug \ - -DANDROID_ABI=${{ matrix.eabi }} \ - -DANDROID_PLATFORM=android-23 \ - -DQT_HOST_PATH:PATH=${QT_ROOT_DIR}/../gcc_64 \ - -DQT_DEBUG_FIND_PACKAGE=ON - cmake --build ${{ runner.temp }}/shadow_build_dir/ --target all diff --git a/.github/workflows/android_release.yml b/.github/workflows/android_release.yml deleted file mode 100644 index 76f9108f9c11..000000000000 --- a/.github/workflows/android_release.yml +++ /dev/null @@ -1,118 +0,0 @@ -# The 32 and 64 bit version of these actions should be kept in sync -name: Android 32/64-bit Release - -on: - push: - branches: - - 'master' - - 'Stable*' - tags: - - 'v*' - paths-ignore: - - 'docs/**' - pull_request: - branches: - - '*' - paths-ignore: - - 'docs/**' - - '.github/workflows/**' - -defaults: - run: - shell: bash - -env: - SOURCE_DIR: ${{ github.workspace }} - QT_VERSION: 6.6.* - BUILD_TYPE: ${{ fromJSON('["DailyBuild", "StableBuild"]')[ github.ref_type == 'tag' || contains(github.ref, 'Stable_' ) ] }} - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - include: - - architecture: 32bits - eabi: armeabi-v7a - arch: android_armv7 - ARTIFACT: QGroundControl32.apk - - architecture: 64bits - eabi: arm64-v8a - arch: android_arm64_v8a - ARTIFACT: QGroundControl64.apk - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - submodules: recursive - - - run: sudo apt update - - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - create-symlink: true - key: ${{ runner.os }}-${{ matrix.arch }}-Release - restore-keys: ${{ runner.os }}-${{ matrix.arch }}-Release - max-size: "2G" - append-timestamp: false - if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' - - - name: Get all tags for correct version determination - working-directory: ${{ github.workspace }} - run: | - git fetch --all --tags -f --depth 1 - - - name: Install Qt6 for Android - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - aqtversion: ==3.1.* - host: linux - target: android - arch: ${{ matrix.arch }} - extra: --autodesktop - dir: ${{ runner.temp }} - modules: qtcharts qtlocation qtpositioning qtspeech qt5compat qtmultimedia qtserialport qtimageformats qtshadertools qtconnectivity qtquick3d - setup-python: true - cache: true - - - name: Remove Android SDKs to force usage of android-33 only - run: | - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-33-ext5" - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-33-ext4" - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-34" - ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --uninstall "platforms;android-34-ext8" - - - name: Create build directory - run: mkdir ${{ runner.temp }}/shadow_build_dir - - - name: Install gstreamer - working-directory: ${{ github.workspace }} - run: | - wget --quiet https://gstreamer.freedesktop.org/data/pkg/android/1.18.5/gstreamer-1.0-android-universal-1.18.5.tar.xz - mkdir gstreamer-1.0-android-universal-1.18.5 - tar xf gstreamer-1.0-android-universal-1.18.5.tar.xz -C gstreamer-1.0-android-universal-1.18.5 - - - name: Update android manifest - if: github.ref_name != 'Stable' - run: | - ${SOURCE_DIR}/tools/update_android_manifest_package.sh ${{ github.ref_name }} - - - name: Build - working-directory: ${{ runner.temp }}/shadow_build_dir - env: - ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} - run: | - ls /home/runner/work/_temp/Qt/${{ env.QT_VERSION }} - qmake -r ${SOURCE_DIR}/qgroundcontrol.pro -spec android-clang CONFIG+=${BUILD_TYPE} CONFIG+=installer ANDROID_ABIS="${{ matrix.eabi }}" - make -j2 - - - name: Upload Build File - uses: ./.github/actions/upload - with: - artifact_name: ${{ matrix.ARTIFACT }} - aws_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/CMakeLists.txt b/CMakeLists.txt index d3be93e293fa..6b4299b05645 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,9 +26,9 @@ include(FetchContent) include(ExternalProject) include(GNUInstallDirs) -set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;RelWithDebInfo;MinSizeRel;Coverage") +set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release") if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type" FORCE) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) endif() list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) @@ -57,6 +57,8 @@ message(STATUS "Qt spec: ${QT_MKSPEC}") if(LINUX) set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/AppDir/usr) +elseif(ANDROID) + set(QT_ENABLE_VERBOSE_DEPLOYMENT ON) endif() # Find Qt6 libraries @@ -230,13 +232,25 @@ elseif(ANDROID) QT_ANDROID_MIN_SDK_VERSION 26 QT_ANDROID_TARGET_SDK_VERSION 33 QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_SOURCE_DIR}/android - QT_ANDROID_VERSION_NAME ${APP_VERSION_STR} - # QT_ANDROID_VERSION_CODE 5.0 + QT_ANDROID_VERSION_NAME "${CMAKE_PROJECT_VERSION}" + # QT_ANDROID_VERSION_CODE "${CMAKE_PROJECT_VERSION}" QT_QML_ROOT_PATH ${CMAKE_SOURCE_DIR} ) - if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID_KEYSTORE_PASSWORD) - set(QT_ANDROID_SIGN_APK TRUE) + get_target_property(QGC_ANDROID_DEPLOY_FILE ${PROJECT_NAME} QT_ANDROID_DEPLOYMENT_SETTINGS_FILE) + cmake_print_variables(QGC_ANDROID_DEPLOY_FILE) + + # configure_file("${CMAKE_SOURCE_DIR}/android/AndroidManifest.xml.in" "${CMAKE_SOURCE_DIR}/android/AndroidManifest.xml") + cmake_print_variables(CMAKE_BUILD_TYPE ANDROID_KEYSTORE_PATH ANDROID_KEYSTORE_ALIAS QT_ANDROID_KEYSTORE_PATH QT_ANDROID_KEYSTORE_ALIAS) + message(STATUS "ANDROID_KEYSTORE_PATH $ENV{ANDROID_KEYSTORE_PATH}") + message(STATUS "ANDROID_KEYSTORE_ALIAS $ENV{ANDROID_KEYSTORE_ALIAS}") + message(STATUS "QT_ANDROID_KEYSTORE_PATH $ENV{QT_ANDROID_KEYSTORE_PATH}") + message(STATUS "QT_ANDROID_KEYSTORE_ALIAS $ENV{QT_ANDROID_KEYSTORE_ALIAS}") + + if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID_KEYSTORE_PATH AND ANDROID_KEYSTORE_ALIAS) + message(STATUS "Signing APK") + # QT_ANDROID_DEPLOYMENT_TYPE + set(QT_ANDROID_SIGN_APK ON) endif() endif() @@ -262,14 +276,17 @@ install( ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} BUNDLE DESTINATION . ) -if(NOT ANDROID) - qt_generate_deploy_qml_app_script( - TARGET ${PROJECT_NAME} - OUTPUT_SCRIPT deploy_script - MACOS_BUNDLE_POST_BUILD - ) - install(SCRIPT ${deploy_script}) -endif() + +qt_generate_deploy_qml_app_script( + TARGET ${PROJECT_NAME} + OUTPUT_SCRIPT deploy_script + # DEPLOY_TOOL_OPTIONS + MACOS_BUNDLE_POST_BUILD + NO_UNSUPPORTED_PLATFORM_ERROR + DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM +) +install(SCRIPT ${deploy_script}) + install( DIRECTORY ${CMAKE_SOURCE_DIR}/resources/ DESTINATION ${CMAKE_INSTALL_DATADIR}/qgroundcontrol