diff --git a/.fdroid.yml b/.fdroid.yml index d92273b..fd65837 100644 --- a/.fdroid.yml +++ b/.fdroid.yml @@ -1,5 +1,5 @@ Categories: - - Connectivity + - VPN & Proxy License: MIT AuthorName: Andrey Prokopyuk AuthorWebSite: https://github.com/andre487 @@ -12,9 +12,9 @@ RepoType: git Repo: https://github.com/andre487/AndroidMegaProxy.git Builds: - - versionName: 0.0.7 - versionCode: 7 - commit: v0.0.7 + - versionName: 0.0.8 + versionCode: 8001 + commit: d314a250df796643ce9e52c60f9b061318634935 subdir: app ndk: 29.0.14206865 sudo: @@ -27,8 +27,10 @@ Builds: - yes srclibs: - go@go1.26.3 - binary: https://github.com/andre487/AndroidMegaProxy/releases/download/v%v/mega-proxy-universal.apk - prebuild: sdkmanager 'platforms;android-26' + binary: https://github.com/andre487/AndroidMegaProxy/releases/download/v%v/mega-proxy-armeabi-v7a.apk + prebuild: + - sdkmanager 'platforms;android-26' + - echo 'megaproxyVersionVariant=armeabi-v7a' >> ../gradle.properties build: - pushd $$go$$/src - ./make.bash @@ -38,11 +40,114 @@ Builds: - export PATH=$GOROOT/bin:$GOPATH/bin:$PATH - cp -a .. /home/runner/work/AndroidMegaProxy/AndroidMegaProxy - cd /home/runner/work/AndroidMegaProxy/AndroidMegaProxy/app - - ../scripts/build-fdroid-native.sh + - MEGAPROXY_ANDROID_ABI=armeabi-v7a ../scripts/build-fdroid-native.sh - mkdir -p $OLDPWD/libs - cp libs/megaproxy.aar $OLDPWD/libs/ + - versionName: 0.0.8 + versionCode: 8002 + commit: d314a250df796643ce9e52c60f9b061318634935 + subdir: app + ndk: 29.0.14206865 + sudo: + - apt-get update + - apt-get install -t trixie-backports -y golang-go + - apt-get install -y gcc libc-dev make openjdk-21-jdk-headless + - mkdir -p /home/runner/work/AndroidMegaProxy + - chown -R vagrant:vagrant /home/runner + gradle: + - yes + srclibs: + - go@go1.26.3 + binary: https://github.com/andre487/AndroidMegaProxy/releases/download/v%v/mega-proxy-arm64-v8a.apk + prebuild: + - sdkmanager 'platforms;android-26' + - echo 'megaproxyVersionVariant=arm64-v8a' >> ../gradle.properties + build: + - pushd $$go$$/src + - ./make.bash + - popd + - export GOROOT=$$go$$ + - export GOPATH=$HOME/go + - export PATH=$GOROOT/bin:$GOPATH/bin:$PATH + - cp -a .. /home/runner/work/AndroidMegaProxy/AndroidMegaProxy + - cd /home/runner/work/AndroidMegaProxy/AndroidMegaProxy/app + - MEGAPROXY_ANDROID_ABI=arm64-v8a ../scripts/build-fdroid-native.sh + - mkdir -p $OLDPWD/libs + - cp libs/megaproxy.aar $OLDPWD/libs/ + + - versionName: 0.0.8 + versionCode: 8003 + commit: d314a250df796643ce9e52c60f9b061318634935 + subdir: app + ndk: 29.0.14206865 + sudo: + - apt-get update + - apt-get install -t trixie-backports -y golang-go + - apt-get install -y gcc libc-dev make openjdk-21-jdk-headless + - mkdir -p /home/runner/work/AndroidMegaProxy + - chown -R vagrant:vagrant /home/runner + gradle: + - yes + srclibs: + - go@go1.26.3 + binary: https://github.com/andre487/AndroidMegaProxy/releases/download/v%v/mega-proxy-x86.apk + prebuild: + - sdkmanager 'platforms;android-26' + - echo 'megaproxyVersionVariant=x86' >> ../gradle.properties + build: + - pushd $$go$$/src + - ./make.bash + - popd + - export GOROOT=$$go$$ + - export GOPATH=$HOME/go + - export PATH=$GOROOT/bin:$GOPATH/bin:$PATH + - cp -a .. /home/runner/work/AndroidMegaProxy/AndroidMegaProxy + - cd /home/runner/work/AndroidMegaProxy/AndroidMegaProxy/app + - MEGAPROXY_ANDROID_ABI=x86 ../scripts/build-fdroid-native.sh + - mkdir -p $OLDPWD/libs + - cp libs/megaproxy.aar $OLDPWD/libs/ + + - versionName: 0.0.8 + versionCode: 8004 + commit: d314a250df796643ce9e52c60f9b061318634935 + subdir: app + ndk: 29.0.14206865 + sudo: + - apt-get update + - apt-get install -t trixie-backports -y golang-go + - apt-get install -y gcc libc-dev make openjdk-21-jdk-headless + - mkdir -p /home/runner/work/AndroidMegaProxy + - chown -R vagrant:vagrant /home/runner + gradle: + - yes + srclibs: + - go@go1.26.3 + binary: https://github.com/andre487/AndroidMegaProxy/releases/download/v%v/mega-proxy-x86_64.apk + prebuild: + - sdkmanager 'platforms;android-26' + - echo 'megaproxyVersionVariant=x86_64' >> ../gradle.properties + build: + - pushd $$go$$/src + - ./make.bash + - popd + - export GOROOT=$$go$$ + - export GOPATH=$HOME/go + - export PATH=$GOROOT/bin:$GOPATH/bin:$PATH + - cp -a .. /home/runner/work/AndroidMegaProxy/AndroidMegaProxy + - cd /home/runner/work/AndroidMegaProxy/AndroidMegaProxy/app + - MEGAPROXY_ANDROID_ABI=x86_64 ../scripts/build-fdroid-native.sh + - mkdir -p $OLDPWD/libs + - cp libs/megaproxy.aar $OLDPWD/libs/ + +VercodeOperation: + - 1000 * %c + 1 + - 1000 * %c + 2 + - 1000 * %c + 3 + - 1000 * %c + 4 + AutoUpdateMode: Version UpdateCheckMode: Tags -CurrentVersion: 0.0.7 -CurrentVersionCode: 7 +UpdateCheckData: app/build.gradle.kts|versionCodeBase = (\d+)|.|versionName = "([^"]+)" +CurrentVersion: 0.0.8 +CurrentVersionCode: 8004 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 720ce16..556e38e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,6 +8,17 @@ val releaseKeystorePath = providers.environmentVariable("MEGAPROXY_KEYSTORE_PATH val releaseKeystorePassword = providers.environmentVariable("MEGAPROXY_KEYSTORE_PASSWORD").orNull val releaseKeyAlias = providers.environmentVariable("MEGAPROXY_KEY_ALIAS").orNull val releaseKeyPassword = providers.environmentVariable("MEGAPROXY_KEY_PASSWORD").orNull +val versionCodeBase = 8 +val versionVariant = providers.gradleProperty("megaproxyVersionVariant") + .orElse("universal") + .get() +val versionVariantCode = mapOf( + "universal" to 0, + "armeabi-v7a" to 1, + "arm64-v8a" to 2, + "x86" to 3, + "x86_64" to 4, +)[versionVariant] ?: throw GradleException("Unsupported MegaProxy version variant: $versionVariant") val gitCommitHash = providers.environmentVariable("GITHUB_SHA") .orElse(providers.environmentVariable("MEGAPROXY_GIT_COMMIT")) .orElse(providers.exec { @@ -28,8 +39,11 @@ android { applicationId = "net.megaproxy487" minSdk = 26 targetSdk = 35 - versionCode = 7 - versionName = "0.0.7" + // Each APK has a unique, monotonically ordered code. Keeping the + // universal code below the ABI variants lets app stores prefer the + // smaller compatible APK when both are available. + versionCode = versionCodeBase * 1000 + versionVariantCode + versionName = "0.0.8" buildConfigField("String", "GIT_COMMIT_HASH", "\"$gitCommitHash\"") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/scripts/build-fdroid-native.sh b/scripts/build-fdroid-native.sh index 255fc46..acd87c1 100755 --- a/scripts/build-fdroid-native.sh +++ b/scripts/build-fdroid-native.sh @@ -15,10 +15,23 @@ go install "golang.org/x/mobile/cmd/gomobile@$gomobile_version" go install "golang.org/x/mobile/cmd/gobind@$gomobile_version" gomobile init +android_abi="${MEGAPROXY_ANDROID_ABI:-}" +case "$android_abi" in + "") gomobile_target="android" ;; + armeabi-v7a) gomobile_target="android/arm" ;; + arm64-v8a) gomobile_target="android/arm64" ;; + x86) gomobile_target="android/386" ;; + x86_64) gomobile_target="android/amd64" ;; + *) + echo "Unsupported MEGAPROXY_ANDROID_ABI: $android_abi" >&2 + exit 1 + ;; +esac + mkdir -p "$project_dir/app/libs" cd "$project_dir/native" gomobile bind \ - -target=android \ + -target="$gomobile_target" \ -androidapi 26 \ -trimpath \ -ldflags='-s -w -buildid=' \ diff --git a/scripts/build-release-apks.sh b/scripts/build-release-apks.sh index 62ac699..2900aef 100755 --- a/scripts/build-release-apks.sh +++ b/scripts/build-release-apks.sh @@ -85,6 +85,20 @@ verify_release_apk() { fi } +verify_release_version_code() { + local apk="$1" + local expected_version_code="$2" + local actual_version_code + actual_version_code="$( + "$ANDROID_HOME/build-tools/34.0.0/aapt" dump badging "$apk" \ + | sed -n "s/^package:.*versionCode='\([^']*\)'.*/\1/p" + )" + if [[ "$actual_version_code" != "$expected_version_code" ]]; then + echo "Unexpected versionCode for $apk: expected $expected_version_code, got $actual_version_code" >&2 + exit 1 + fi +} + temporary_dir="$(mktemp -d "${TMPDIR:-/tmp}/megaproxy-release.XXXXXX")" original_aar="$project_dir/app/libs/megaproxy.aar" had_original_aar=false @@ -115,10 +129,10 @@ echo "Running native tests" # gomobile architecture names and their corresponding Android ABI names. targets=( - "arm64:arm64-v8a" - "arm:armeabi-v7a" - "amd64:x86_64" - "386:x86" + "arm64:arm64-v8a:8002" + "arm:armeabi-v7a:8001" + "amd64:x86_64:8004" + "386:x86:8003" ) # A clean checkout has no app/libs/megaproxy.aar. Gradle resolves local AAR @@ -126,7 +140,8 @@ targets=( # before invoking Gradle and reuse it for the first release APK below. first_target="${targets[0]}" first_go_arch="${first_target%%:*}" -first_android_abi="${first_target##*:}" +first_target_rest="${first_target#*:}" +first_android_abi="${first_target_rest%%:*}" echo "Building initial native AAR for $first_android_abi" ( cd "$project_dir/native" @@ -147,7 +162,9 @@ echo "Running Android unit tests" for target in "${targets[@]}"; do go_arch="${target%%:*}" - android_abi="${target##*:}" + target_rest="${target#*:}" + android_abi="${target_rest%%:*}" + version_code="${target_rest##*:}" output_apk="$MEGAPROXY_RELEASE_DIR/mega-proxy-${android_abi}.apk" if [[ "$android_abi" == "$first_android_abi" ]]; then @@ -173,7 +190,7 @@ for target in "${targets[@]}"; do # requested in one task graph, Gradle does not guarantee that clean has # finished before every generated-resource task starts. ./gradlew clean - ./gradlew assembleRelease + ./gradlew assembleRelease -PmegaproxyVersionVariant="$android_abi" ) built_apk="$project_dir/app/build/outputs/apk/release/app-release.apk" if [[ ! -f "$built_apk" ]]; then @@ -183,6 +200,7 @@ for target in "${targets[@]}"; do cp "$built_apk" "$output_apk" verify_release_apk "$output_apk" + verify_release_version_code "$output_apk" "$version_code" done # F-Droid verifies this universal APK against a clean source build before @@ -204,7 +222,7 @@ echo "Building and signing universal APK" ( cd "$project_dir" ./gradlew clean - ./gradlew assembleRelease + ./gradlew assembleRelease -PmegaproxyVersionVariant=universal ) universal_apk="$MEGAPROXY_RELEASE_DIR/mega-proxy-universal.apk" built_apk="$project_dir/app/build/outputs/apk/release/app-release.apk" @@ -214,6 +232,7 @@ if [[ ! -f "$built_apk" ]]; then fi cp "$built_apk" "$universal_apk" verify_release_apk "$universal_apk" +verify_release_version_code "$universal_apk" 8000 ( cd "$MEGAPROXY_RELEASE_DIR"