From 20a55f48409421ba53ebe4af154b5eff23acd47b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 22 Jun 2026 18:47:06 +0200 Subject: [PATCH 1/7] aapt dump --- tools/manifest/aaptDump.sh | 13 +++ tools/manifest/gplay/release/aaptDump.txt | 96 +++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100755 tools/manifest/aaptDump.sh create mode 100644 tools/manifest/gplay/release/aaptDump.txt diff --git a/tools/manifest/aaptDump.sh b/tools/manifest/aaptDump.sh new file mode 100755 index 00000000000..440cf441bc8 --- /dev/null +++ b/tools/manifest/aaptDump.sh @@ -0,0 +1,13 @@ +#! /bin/bash + +# Copyright (c) 2026 Element Creations Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. +# Please see LICENSE files in the repository root for full details. + +# Assemble Gplay Release +./gradlew assembleGplayRelease + +# Dump information +$ANDROID_HOME/build-tools/37.0.0/aapt dump badging ./app/build/outputs/apk/gplay/release/app-gplay-universal-release.apk | + > ./tools/manifest/gplay/release/aaptDump.txt diff --git a/tools/manifest/gplay/release/aaptDump.txt b/tools/manifest/gplay/release/aaptDump.txt new file mode 100644 index 00000000000..918080f5c13 --- /dev/null +++ b/tools/manifest/gplay/release/aaptDump.txt @@ -0,0 +1,96 @@ +package: name='io.element.android.x' versionCode='202606040' versionName='26.06.4' platformBuildVersionName='17' platformBuildVersionCode='37' compileSdkVersion='37' compileSdkVersionCodename='17' +sdkVersion:'24' +targetSdkVersion:'37' +uses-permission: name='android.permission.REQUEST_INSTALL_PACKAGES' +uses-permission: name='android.permission.POST_NOTIFICATIONS' +uses-permission: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' +uses-permission: name='android.permission.RECORD_AUDIO' +uses-permission: name='android.permission.ACCESS_COARSE_LOCATION' +uses-permission: name='android.permission.ACCESS_FINE_LOCATION' +uses-permission: name='android.permission.FOREGROUND_SERVICE' +uses-permission: name='android.permission.FOREGROUND_SERVICE_LOCATION' +uses-permission: name='android.permission.CAMERA' +uses-permission: name='android.permission.MODIFY_AUDIO_SETTINGS' +uses-permission: name='android.permission.WAKE_LOCK' +uses-permission: name='android.permission.FOREGROUND_SERVICE_MICROPHONE' +uses-permission: name='android.permission.USE_FULL_SCREEN_INTENT' +uses-permission: name='android.permission.ACCESS_NETWORK_STATE' +uses-permission: name='android.permission.INTERNET' +uses-permission: name='android.permission.VIBRATE' +uses-permission: name='android.permission.ACCESS_WIFI_STATE' +uses-permission: name='android.permission.USE_BIOMETRIC' +uses-permission: name='android.permission.USE_FINGERPRINT' +uses-permission: name='com.google.android.c2dm.permission.RECEIVE' +uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' +uses-permission: name='io.element.android.x.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' +application-label:'Element X' +application-label-be:'Element X' +application-label-bg:'Element X' +application-label-ca:'Element X' +application-label-cs:'Element X' +application-label-cy:'Element X' +application-label-da:'Element X' +application-label-de:'Element X' +application-label-el:'Element X' +application-label-en-US:'Element X' +application-label-es:'Element X' +application-label-et:'Element X' +application-label-eu:'Element X' +application-label-fa:'Element X' +application-label-fi:'Element X' +application-label-fr:'Element X' +application-label-hr:'Element X' +application-label-hu:'Element X' +application-label-in:'Element X' +application-label-it:'Element X' +application-label-ja:'Element X' +application-label-ka:'Element X' +application-label-ko:'Element X' +application-label-lt:'Element X' +application-label-nb:'Element X' +application-label-nl:'Element X' +application-label-pl:'Element X' +application-label-pt:'Element X' +application-label-pt-BR:'Element X' +application-label-ro:'Element X' +application-label-ru:'Element X' +application-label-sk:'Element X' +application-label-sv:'Element X' +application-label-tr:'Element X' +application-label-uk:'Element X' +application-label-ur:'Element X' +application-label-uz:'Element X' +application-label-vi:'Element X' +application-label-zh:'Element X' +application-label-zh-CN:'Element X' +application-label-zh-TW:'Element X' +application-icon-120:'res/BW.xml' +application-icon-160:'res/BW.xml' +application-icon-240:'res/BW.xml' +application-icon-320:'res/BW.xml' +application-icon-480:'res/BW.xml' +application-icon-640:'res/BW.xml' +application-icon-65534:'res/BW.xml' +application-icon-65535:'res/BW.xml' +application: label='Element X' icon='res/BW.xml' +launchable-activity: name='io.element.android.x.MainActivity' label='' icon='' +uses-library-not-required:'androidx.window.extensions' +uses-library-not-required:'androidx.window.sidecar' +feature-group: label='' + uses-feature-not-required: name='android.hardware.camera' + uses-feature-not-required: name='android.hardware.microphone' + uses-feature-not-required: name='android.hardware.vulkan.version' version='4194307' + uses-feature-not-required: name='android.hardware.wifi' + uses-feature: name='android.hardware.faketouch' + uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' + uses-feature: name='android.hardware.location' + uses-implied-feature: name='android.hardware.location' reason='requested android.permission.ACCESS_COARSE_LOCATION permission, and requested android.permission.ACCESS_FINE_LOCATION permission' +main +other-activities +other-receivers +other-services +supports-screens: 'small' 'normal' 'large' 'xlarge' +supports-any-density: 'true' +locales: '--_--' 'be' 'bg' 'ca' 'cs' 'cy' 'da' 'de' 'el' 'en-US' 'es' 'et' 'eu' 'fa' 'fi' 'fr' 'hr' 'hu' 'in' 'it' 'ja' 'ka' 'ko' 'lt' 'nb' 'nl' 'pl' 'pt' 'pt-BR' 'ro' 'ru' 'sk' 'sv' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-TW' +densities: '120' '160' '240' '320' '480' '640' '65534' '65535' +native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' From 8731e2243a76ab5a899f8b30880b0180f0ca14e4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 8 Jul 2026 13:29:50 +0200 Subject: [PATCH 2/7] Fix script issue --- tools/manifest/aaptDump.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/manifest/aaptDump.sh b/tools/manifest/aaptDump.sh index 440cf441bc8..ac66b92593a 100755 --- a/tools/manifest/aaptDump.sh +++ b/tools/manifest/aaptDump.sh @@ -9,5 +9,5 @@ ./gradlew assembleGplayRelease # Dump information -$ANDROID_HOME/build-tools/37.0.0/aapt dump badging ./app/build/outputs/apk/gplay/release/app-gplay-universal-release.apk | +$ANDROID_HOME/build-tools/37.0.0/aapt dump badging ./app/build/outputs/apk/gplay/release/app-gplay-universal-release.apk \ > ./tools/manifest/gplay/release/aaptDump.txt From 06c9c9b77c8c18271c7cefc8c0dd77417223ba83 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 8 Jul 2026 13:30:44 +0200 Subject: [PATCH 3/7] Ensure that Manifest content (aapt dump) is unchanged. --- .github/workflows/build.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7d1f7d8ea38..35620c2f928 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -104,7 +104,16 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Compile release sources if: ${{ matrix.variant == 'release' }} - run: ./gradlew bundleGplayRelease -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES + run: ./gradlew assembleGplayRelease bundleGplayRelease -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES + - name: Run aapt dump + if: ${{ matrix.variant == 'release' }} + run: | + $ANDROID_HOME/build-tools/37.0.0/aapt dump badging \ + ./app/build/outputs/apk/gplay/release/app-gplay-universal-release.apk \ + > /tmp/currentAaptDump.txt + - name: Check manifest has not changed + if: ${{ matrix.variant == 'release' }} + run: diff /tmp/currentAaptDump.txt ./tools/manifest/gplay/release/aaptDump.txt - name: Compile nightly sources if: ${{ matrix.variant == 'nightly' }} run: ./gradlew compileGplayNightlySources -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES From ac822544f28dc9e92686d2529e08207ea2de9ac4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 8 Jul 2026 14:12:32 +0200 Subject: [PATCH 4/7] Split gradle invocation, else universal build is not generated. --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35620c2f928..521eafb3d3d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -104,7 +104,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Compile release sources if: ${{ matrix.variant == 'release' }} - run: ./gradlew assembleGplayRelease bundleGplayRelease -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES + run: | + ./gradlew assembleGplayRelease -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES + ./gradlew bundleGplayRelease -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - name: Run aapt dump if: ${{ matrix.variant == 'release' }} run: | From a7f4418555515f657be955305fb7528541bb0b21 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 8 Jul 2026 14:13:12 +0200 Subject: [PATCH 5/7] Update dump. --- tools/manifest/gplay/release/aaptDump.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/manifest/gplay/release/aaptDump.txt b/tools/manifest/gplay/release/aaptDump.txt index 918080f5c13..7764f0d76bf 100644 --- a/tools/manifest/gplay/release/aaptDump.txt +++ b/tools/manifest/gplay/release/aaptDump.txt @@ -1,4 +1,4 @@ -package: name='io.element.android.x' versionCode='202606040' versionName='26.06.4' platformBuildVersionName='17' platformBuildVersionCode='37' compileSdkVersion='37' compileSdkVersionCodename='17' +package: name='io.element.android.x' versionCode='202607000' versionName='26.07.0' platformBuildVersionName='17' platformBuildVersionCode='37' compileSdkVersion='37' compileSdkVersionCodename='17' sdkVersion:'24' targetSdkVersion:'37' uses-permission: name='android.permission.REQUEST_INSTALL_PACKAGES' From ebc16bb3e1d899283037d41e7b7897a0cff98e60 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 8 Jul 2026 14:39:04 +0200 Subject: [PATCH 6/7] Update version in ./tools/manifest/gplay/release/aaptDump.txt during the release. --- tools/release/release.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tools/release/release.sh b/tools/release/release.sh index 0934e6c7140..83ccc6d2582 100755 --- a/tools/release/release.sh +++ b/tools/release/release.sh @@ -151,12 +151,20 @@ sed "s/private const val versionMonth = .*/private const val versionMonth = ${ve sed "s/private const val versionReleaseNumber = .*/private const val versionReleaseNumber = ${versionReleaseNumber}/" ${versionsFileBak} > ${versionsFile} rm ${versionsFileBak} +printf -v versionReleaseNumber2Digits "%02d" "${versionReleaseNumber}" +versionCode="20${versionYear}${versionMonth}${versionReleaseNumber2Digits}0" + +# Update the file aaptDump.txt with the new version +aaptDumpFile="./tools/manifest/gplay/release/aaptDump.txt" +sed "s/versionCode='[0-9]*'/versionCode='${versionCode}'/" ${aaptDumpFile} > ${aaptDumpFile}.bak +sed "s/versionName='[0-9]*\.[0-9]*\.[0-9]*'/versionName='${version}'/" ${aaptDumpFile}.bak > ${aaptDumpFile} +rm ${aaptDumpFile}.bak + git commit -a -m "Setting version for the release ${version}" printf "\n================================================================================\n" printf "Creating fastlane file...\n" -printf -v versionReleaseNumber2Digits "%02d" "${versionReleaseNumber}" -fastlaneFile="20${versionYear}${versionMonth}${versionReleaseNumber2Digits}0.txt" +fastlaneFile="${versionCode}.txt" fastlanePathFile="./fastlane/metadata/android/en-US/changelogs/${fastlaneFile}" printf "Main changes in this version: bug fixes and improvements.\nFull changelog: https://github.com/element-hq/element-x-android/releases" > "${fastlanePathFile}" From 2e161914a9f70b7587ab547ebde85c581665f0fd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 8 Jul 2026 14:42:13 +0200 Subject: [PATCH 7/7] Update aaptDump.txt when syncing strings from Localazy New locales added via Localazy would change the locales line in aaptDump.txt and break the manifest CI check if the reference file is not kept in sync. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/sync-localazy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sync-localazy.yml b/.github/workflows/sync-localazy.yml index d52100ad9fc..6bd5c842836 100644 --- a/.github/workflows/sync-localazy.yml +++ b/.github/workflows/sync-localazy.yml @@ -39,6 +39,7 @@ jobs: ./tools/localazy/downloadStrings.sh --all ./tools/localazy/importSupportedLocalesFromLocalazy.py ./tools/test/generateAllScreenshots.py + ./tools/manifest/aaptDump.sh - name: Create Pull Request for Strings uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: