From 865c56f400edce2d67181422a4593078d7fb051a Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Mon, 3 Apr 2023 21:41:42 +0300 Subject: [PATCH] scripts: adapted compress-and-sign-apk script to case-insensitive file systems (#2138) Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> --- apps/android/app/build.gradle | 14 ++++---- scripts/android/compress-and-sign-apk.sh | 42 ++++++++++++++++-------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/apps/android/app/build.gradle b/apps/android/app/build.gradle index eea4d39335..3995d2d929 100644 --- a/apps/android/app/build.gradle +++ b/apps/android/app/build.gradle @@ -153,19 +153,12 @@ dependencies { debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" } -def buildType = "unknown" // Don't do anything if no compression is needed if (compression_level != "0") { tasks.whenTaskAdded { task -> if (task.name == 'packageDebug') { - task.doLast { - buildType = "debug" - } task.finalizedBy compressApk } else if (task.name == 'packageRelease') { - task.doLast { - buildType = "release" - } task.finalizedBy compressApk } } @@ -173,6 +166,13 @@ if (compression_level != "0") { tasks.register("compressApk") { doLast { + def isRelease = gradle.getStartParameter().taskNames.find({ it.toLowerCase().contains("release") }) != null + def buildType + if (isRelease) { + buildType = "release" + } else { + buildType = "debug" + } def javaHome = System.properties['java.home'] ?: org.gradle.internal.jvm.Jvm.current().getJavaHome() def sdkDir = android.getSdkDirectory().getAbsolutePath() def keyAlias = "" diff --git a/scripts/android/compress-and-sign-apk.sh b/scripts/android/compress-and-sign-apk.sh index 694dcade8d..586511cdfa 100755 --- a/scripts/android/compress-and-sign-apk.sh +++ b/scripts/android/compress-and-sign-apk.sh @@ -12,37 +12,53 @@ store_password=$5 key_alias=$6 key_password=$7 -if [ -z ${7} ]; then echo "You didn't enter all required params: +if [ -z "${7}" ]; then echo "You didn't enter all required params: compress-and-sign-apk.sh level apk_parent_dir sdk_dir store_file store_password key_alias key_password" fi -cd $apk_parent_dir +cd "$apk_parent_dir" + +touch remove_this_file remove_this_FILE +(( $(ls | grep "remove_this" | wc -l)==1 )) && case_insensitive=1 || case_insensitive=0 +#echo Case-insensitive file system: $case_insensitive +rm remove_this_file remove_this_FILE 2> /dev/null || true ORIG_NAMES=( $(echo app*.apk) ) for ORIG_NAME in "${ORIG_NAMES[@]}"; do unzip -o -q -d apk $ORIG_NAME + ORIG_NAME_COPY=$ORIG_NAME-copy + mv "$ORIG_NAME" "$ORIG_NAME_COPY" - rm $ORIG_NAME - - (cd apk && zip -r -q -$level ../$ORIG_NAME .) + (cd apk && zip -r -q -"$level" ../"$ORIG_NAME" .) # Shouldn't be compressed because of Android requirement - (cd apk && zip -r -q -0 ../$ORIG_NAME resources.arsc) - (cd apk && zip -r -q -0 ../$ORIG_NAME res) + (cd apk && zip -r -q -0 ../"$ORIG_NAME" resources.arsc) + + if [ $case_insensitive -eq 1 ]; then + # For case-insensitive file systems + list_of_files=$(unzip -l "$ORIG_NAME_COPY" | grep res/ | sed -e "s|.*res/|res/|") + for file in $list_of_files; do unzip -o -q -d apk "$ORIG_NAME_COPY" "$file" && (cd apk && zip -r -q -0 ../"$ORIG_NAME" "$file"); done + else + # This method is not working correctly on case-insensitive file systems since Android AAPT produce the same names of files + # but with different case like xX.png, Xx.png, xx.png, etc + (cd apk && zip -r -q -0 ../"$ORIG_NAME" res) + fi + #(cd apk && 7z a -r -mx=$level -tzip -x!resources.arsc ../$ORIG_NAME .) #(cd apk && 7z a -r -mx=0 -tzip ../$ORIG_NAME resources.arsc) - ALL_TOOLS=($sdk_dir/build-tools/*/) + ALL_TOOLS=("$sdk_dir"/build-tools/*/) BIN_DIR="${ALL_TOOLS[1]}" - $BIN_DIR/zipalign -p -f 4 $ORIG_NAME $ORIG_NAME-2 + "$BIN_DIR"/zipalign -p -f 4 "$ORIG_NAME" "$ORIG_NAME"-2 - mv $ORIG_NAME{-2,} + mv "$ORIG_NAME"{-2,} - $BIN_DIR/apksigner sign \ + "$BIN_DIR"/apksigner sign \ --ks "$store_file" --ks-key-alias "$key_alias" --ks-pass "pass:$store_password" \ - --key-pass "pass:$key_password" $ORIG_NAME + --key-pass "pass:$key_password" "$ORIG_NAME" # cleanup + rm "$ORIG_NAME_COPY" 2> /dev/null || true rm -rf apk || true - rm ${ORIG_NAME}.idsig 2> /dev/null || true + rm "${ORIG_NAME}".idsig 2> /dev/null || true done \ No newline at end of file