From fb9e83c5d97ba35e60712fdcd8684b24b723eb22 Mon Sep 17 00:00:00 2001 From: Christopher Roy Bratusek Date: Mon, 8 Jul 2019 20:52:43 +0200 Subject: [PATCH] build-package: use gzip instead of bzip2 (faster and same compression result) --- CommonInstaller | 6 +- data/build-package.database | 128 ++++++++++++++-------------- data/build-package.download | 24 +++--- patcher/dexpatcher/org.spoofing.apk | Bin 8159 -> 0 bytes 4 files changed, 79 insertions(+), 79 deletions(-) delete mode 100644 patcher/dexpatcher/org.spoofing.apk diff --git a/CommonInstaller b/CommonInstaller index e8b307c..c8e91a5 100644 --- a/CommonInstaller +++ b/CommonInstaller @@ -1311,11 +1311,11 @@ nanodroid_install_apk () { echo " installing app: ${app}" echo " from: ${source}" echo " into: ${dest} [${dest_apk}]" - cp "${source}.bz2" "${dest}/${dest_apk}.bz2" || \ + cp "${source}.gz" "${dest}/${dest_apk}.gz" || \ error "failed to install ${source} to ${dest}" - bzip2 -d "${dest}/${dest_apk}.bz2" || \ - error "failed to decompress ${dest}/${dest_apk}.bz2" + gzip -d "${dest}/${dest_apk}.gz" || \ + error "failed to decompress ${dest}/${dest_apk}.gz" installinfo_add "${dest}/${dest_apk}" diff --git a/data/build-package.database b/data/build-package.database index 3536d99..35df11f 100644 --- a/data/build-package.database +++ b/data/build-package.database @@ -95,24 +95,24 @@ bm_WEBVIEW_x86=(bromite com.android.webview app BromiteWebView_x86 x86) # Files Database (for consistency check) ### -files_database=( Full/gsync/K/app/GoogleCalendarSync/GoogleCalendarSync.apk.bz2 - Full/gsync/K/app/GoogleContactsSync/GoogleContactsSync.apk.bz2 - Full/gsync/K/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.bz2 - Full/gsync/L/app/GoogleCalendarSync/GoogleCalendarSync.apk.bz2 - Full/gsync/L/app/GoogleContactsSync/GoogleContactsSync.apk.bz2 - Full/gsync/L/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.bz2 - Full/gsync/M/app/GoogleCalendarSync/GoogleCalendarSync.apk.bz2 - Full/gsync/M/app/GoogleContactsSync/GoogleContactsSync.apk.bz2 - Full/gsync/M/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.bz2 - Full/gsync/N/app/GoogleCalendarSync/GoogleCalendarSync.apk.bz2 - Full/gsync/N/app/GoogleContactsSync/GoogleContactsSync.apk.bz2 - Full/gsync/N/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.bz2 - Full/gsync/O/app/GoogleCalendarSync/GoogleCalendarSync.apk.bz2 - Full/gsync/O/app/GoogleContactsSync/GoogleContactsSync.apk.bz2 - Full/gsync/O/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.bz2 - Full/gsync/P/app/GoogleCalendarSync/GoogleCalendarSync.apk.bz2 - Full/gsync/P/app/GoogleContactsSync/GoogleContactsSync.apk.bz2 - Full/gsync/P/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.bz2 +files_database=( Full/gsync/K/app/GoogleCalendarSync/GoogleCalendarSync.apk.gz + Full/gsync/K/app/GoogleContactsSync/GoogleContactsSync.apk.gz + Full/gsync/K/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.gz + Full/gsync/L/app/GoogleCalendarSync/GoogleCalendarSync.apk.gz + Full/gsync/L/app/GoogleContactsSync/GoogleContactsSync.apk.gz + Full/gsync/L/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.gz + Full/gsync/M/app/GoogleCalendarSync/GoogleCalendarSync.apk.gz + Full/gsync/M/app/GoogleContactsSync/GoogleContactsSync.apk.gz + Full/gsync/M/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.gz + Full/gsync/N/app/GoogleCalendarSync/GoogleCalendarSync.apk.gz + Full/gsync/N/app/GoogleContactsSync/GoogleContactsSync.apk.gz + Full/gsync/N/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.gz + Full/gsync/O/app/GoogleCalendarSync/GoogleCalendarSync.apk.gz + Full/gsync/O/app/GoogleContactsSync/GoogleContactsSync.apk.gz + Full/gsync/O/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.gz + Full/gsync/P/app/GoogleCalendarSync/GoogleCalendarSync.apk.gz + Full/gsync/P/app/GoogleContactsSync/GoogleContactsSync.apk.gz + Full/gsync/P/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk.gz Full/swipe/arm/libjni_keyboarddecoder.so Full/swipe/arm/libjni_latinimegoogle.so_19 Full/swipe/arm/libjni_latinimegoogle.so_21 @@ -130,49 +130,49 @@ files_database=( Full/gsync/K/app/GoogleCalendarSync/GoogleCalendarSync.apk.bz2 Full/swipe/x86/libjni_latinimegoogle.so Full/swipe/x86_64/libjni_keyboarddecoder.so Full/swipe/x86_64/libjni_latinimegoogle.so - Full/system/app/Alarmio/Alarmio.apk.bz2 - Full/system/app/Amaze/Amaze.apk.bz2 - Full/system/app/AnysoftKeyboard/AnysoftKeyboard.apk.bz2 - Full/system/app/AuroraStore/AuroraStore.apk.bz2 - Full/system/app/Blokada/Blokada.apk.bz2 - Full/system/app/FDroid/FDroid.apk.bz2 - Full/system/app/FaceSlim/FaceSlim.apk.bz2 - Full/system/app/HackersKeyboard/HackersKeyboard.apk.bz2 - Full/system/app/K9Mail/K9Mail.apk.bz2 - Full/system/app/KeePassDX/KeePassDX.apk.bz2 - Full/system/app/KernelAdiutor/KernelAdiutor.apk.bz2 - Full/system/app/MPV/MPV.apk.bz2 - Full/system/app/NewPipe/NewPipe.apk.bz2 - Full/system/app/Oandbackup/Oandbackup.apk.bz2 - Full/system/app/Odyssey/Odyssey.apk.bz2 - Full/system/app/OpenCamera/OpenCamera.apk.bz2 - Full/system/app/OpenKeyChain/OpenKeyChain.apk.bz2 - Full/system/app/OpenLauncher/OpenLauncher.apk.bz2 - Full/system/app/OpenVPN/OpenVPN.apk.bz2 - Full/system/app/Orbot/Orbot.apk.bz2 - Full/system/app/PrivacyBrowser/PrivacyBrowser.apk.bz2 - Full/system/app/QKSMS/QKSMS.apk.bz2 - Full/system/app/SimpleCalendar/SimpleCalendar.apk.bz2 - Full/system/app/SimpleGallery/SimpleGallery.apk.bz2 - Full/system/app/Substratum/Substratum.apk.bz2 - Full/system/app/Termux/Termux.apk.bz2 - Full/system/app/TorBrowser/TorBrowser.apk.bz2 - Full/system/app/Twidere/Twidere.apk.bz2 - Full/system/app/XDALabs/XDALabs.apk.bz2 - Full/system/app/nlpBackendApple/nlpBackendApple.apk.bz2 - Full/system/app/nlpBackendIchnaea/nlpBackendIchnaea.apk.bz2 - Full/system/app/nlpBackendDejavu/nlpBackendDejavu.apk.bz2 - Full/system/app/nlpBackendRadiocell/nlpBackendRadiocell.apk.bz2 - Full/system/app/nlpBackendNominatim/nlpBackendNominatim.apk.bz2 - Full/system/app/DroidGuard/DroidGuard.apk.bz2 - Full/system/priv-app/FDroidPrivileged/FDroidPrivileged.apk.bz2 - Full/system/priv-app/FakeStore/FakeStore.apk.bz2 - Full/system/priv-app/Phonesky/Phonesky.apk.bz2 - Full/system/priv-app/YalpStore/YalpStore.apk.bz2 - Full/system/priv-app/GsfProxy/GsfProxy.apk.bz2 - Full/system/priv-app/GmsCore/GmsCore.apk.bz2 - BromiteWebView/system/app/BromiteWebView_arm/BromiteWebView_arm.apk.bz2 - BromiteWebView/system/app/BromiteWebView_arm64/BromiteWebView_arm64.apk.bz2 - BromiteWebView/system/app/BromiteWebView_x86/BromiteWebView_x86.apk.bz2 - OsmAnd/system/app/OsmAnd/OsmAnd.apk.bz2 - OsmAnd/system/app/OsmAnd_ContourLines/OsmAnd_ContourLines.apk.bz2 ) + Full/system/app/Alarmio/Alarmio.apk.gz + Full/system/app/Amaze/Amaze.apk.gz + Full/system/app/AnysoftKeyboard/AnysoftKeyboard.apk.gz + Full/system/app/AuroraStore/AuroraStore.apk.gz + Full/system/app/Blokada/Blokada.apk.gz + Full/system/app/FDroid/FDroid.apk.gz + Full/system/app/FaceSlim/FaceSlim.apk.gz + Full/system/app/HackersKeyboard/HackersKeyboard.apk.gz + Full/system/app/K9Mail/K9Mail.apk.gz + Full/system/app/KeePassDX/KeePassDX.apk.gz + Full/system/app/KernelAdiutor/KernelAdiutor.apk.gz + Full/system/app/MPV/MPV.apk.gz + Full/system/app/NewPipe/NewPipe.apk.gz + Full/system/app/Oandbackup/Oandbackup.apk.gz + Full/system/app/Odyssey/Odyssey.apk.gz + Full/system/app/OpenCamera/OpenCamera.apk.gz + Full/system/app/OpenKeyChain/OpenKeyChain.apk.gz + Full/system/app/OpenLauncher/OpenLauncher.apk.gz + Full/system/app/OpenVPN/OpenVPN.apk.gz + Full/system/app/Orbot/Orbot.apk.gz + Full/system/app/PrivacyBrowser/PrivacyBrowser.apk.gz + Full/system/app/QKSMS/QKSMS.apk.gz + Full/system/app/SimpleCalendar/SimpleCalendar.apk.gz + Full/system/app/SimpleGallery/SimpleGallery.apk.gz + Full/system/app/Substratum/Substratum.apk.gz + Full/system/app/Termux/Termux.apk.gz + Full/system/app/TorBrowser/TorBrowser.apk.gz + Full/system/app/Twidere/Twidere.apk.gz + Full/system/app/XDALabs/XDALabs.apk.gz + Full/system/app/nlpBackendApple/nlpBackendApple.apk.gz + Full/system/app/nlpBackendIchnaea/nlpBackendIchnaea.apk.gz + Full/system/app/nlpBackendDejavu/nlpBackendDejavu.apk.gz + Full/system/app/nlpBackendRadiocell/nlpBackendRadiocell.apk.gz + Full/system/app/nlpBackendNominatim/nlpBackendNominatim.apk.gz + Full/system/app/DroidGuard/DroidGuard.apk.gz + Full/system/priv-app/FDroidPrivileged/FDroidPrivileged.apk.gz + Full/system/priv-app/FakeStore/FakeStore.apk.gz + Full/system/priv-app/Phonesky/Phonesky.apk.gz + Full/system/priv-app/YalpStore/YalpStore.apk.gz + Full/system/priv-app/GsfProxy/GsfProxy.apk.gz + Full/system/priv-app/GmsCore/GmsCore.apk.gz + BromiteWebView/system/app/BromiteWebView_arm/BromiteWebView_arm.apk.gz + BromiteWebView/system/app/BromiteWebView_arm64/BromiteWebView_arm64.apk.gz + BromiteWebView/system/app/BromiteWebView_x86/BromiteWebView_x86.apk.gz + OsmAnd/system/app/OsmAnd/OsmAnd.apk.gz + OsmAnd/system/app/OsmAnd_ContourLines/OsmAnd_ContourLines.apk.gz ) diff --git a/data/build-package.download b/data/build-package.download index 473485c..689bc25 100644 --- a/data/build-package.download +++ b/data/build-package.download @@ -11,7 +11,7 @@ REPO_NANOLX="https://nanolx.org/fdroid/repo" REPO_BROMITE="https://fdroid.bromite.org/fdroid/repo" # check dependencies -for dep in gawk wget curl sha256sum jq bzip2; do +for dep in gawk wget curl sha256sum jq gzip; do if ! which ${dep} &>/dev/null; then echo "${dep} is not installed!" exit 1 @@ -35,8 +35,8 @@ check_sha256sum () { EX_CHECKSUM="${2}" case ${INPUT} in - *.bz2 ) - IN_CHECKSUM=$(bzip2 -dc ${INPUT} 2>/dev/null | sha256sum | gawk '{print $1}') + *.gz ) + IN_CHECKSUM=$(gzip -dc ${INPUT} 2>/dev/null | sha256sum | gawk '{print $1}') ;; * ) @@ -143,15 +143,15 @@ grab_apk_from_repo () { APK_URL="${REPO}/${APK_NAME}" - if check_sha256sum "${APK_DEST}/${4}.apk.bz2" "${SHA_SUM}"; then + if check_sha256sum "${APK_DEST}/${4}.apk.gz" "${SHA_SUM}"; then echo -e "\nUp-to-Date from ${REPO_P} : ${4}.apk" else echo -e "\nUpdating from ${REPO_P} : ${4}.apk" - rm -f "${APK_DEST}/${4}.apk.bz2" + rm -f "${APK_DEST}/${4}.apk.gz" wget -q -O "${APK_DEST}/${4}.apk" "${APK_URL}" if check_sha256sum "${APK_DEST}/${4}.apk" "${SHA_SUM}"; then echo " SHA256 hash of ${4}.apk is correct" - bzip2 -z "${APK_DEST}/${4}.apk" + gzip "${APK_DEST}/${4}.apk" else echo -e " SHA256 hash of ${4}.apk is wrong!\ \n expected : ${SHA_SUM}\ \n got : ${IN_CHECKSUM}" @@ -201,15 +201,15 @@ ${5}-${VERSION}-android-apk-download" APK_URL="https://www.apkmirror.com${URL_WP}" APK_DEST="${CWD}/Full/system/${3}/${4}" - if check_sha256sum "${APK_DEST}/${4}.apk.bz2" "${SHA_SUM}"; then + if check_sha256sum "${APK_DEST}/${4}.apk.gz" "${SHA_SUM}"; then echo -e "\nUp-to-Date from APK Mirror : ${4}.apk" else echo -e "\nUpdating from APK Mirror : ${4}.apk" - rm -f "${APK_DEST}/${4}.apk.bz2" + rm -f "${APK_DEST}/${4}.apk.gz" wget --user-agent="${USER_AGENT}" -q "${APK_URL}" -O "${APK_DEST}/${4}.apk" if check_sha256sum "${APK_DEST}/${4}.apk" "${SHA_SUM}"; then echo " SHA256 hash of ${4}.apk is correct" - bzip2 -z "${APK_DEST}/${4}.apk" + gzip "${APK_DEST}/${4}.apk" else echo -e " SHA256 hash of ${4}.apk is wrong!\ \n expected : ${SHA_SUM}\ \n got : ${IN_CHECKSUM}" @@ -260,9 +260,9 @@ grab_apk_from_ogapps () { APK_DEST="${CWD}/Full/gsync/${API_LETTER}/${2}/${3}" - if [[ -f "${APK_DEST}/${3}.apk.bz2" ]]; then + if [[ -f "${APK_DEST}/${3}.apk.gz" ]]; then echo -e "\nUpdating from OpenGApps : ${3}.apk [${API_LETTER}]" - rm -f "${APK_DEST}/${3}.apk.bz2" + rm -f "${APK_DEST}/${3}.apk.gz" else echo -e "\nDownloading from OpenGApps: ${3}.apk [${API_LETTER}]" mkdir -p "${APK_DEST}" fi @@ -272,7 +272,7 @@ grab_apk_from_ogapps () { wget -q -O "${APK_DEST}/${3}.apk" "${APK_URL}" || \ rm -f "${APK_DEST}/${3}.apk" - [ -f "${APK_DEST}/${3}.apk" ] && bzip2 -z "${APK_DEST}/${3}.apk" + [ -f "${APK_DEST}/${3}.apk" ] && gzip "${APK_DEST}/${3}.apk" } grab_lib_from_ogapps () { diff --git a/patcher/dexpatcher/org.spoofing.apk b/patcher/dexpatcher/org.spoofing.apk deleted file mode 100644 index 7a62eac1dd475d20f2aa9428a1d2c0ab72fb1fde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8159 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