aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorKacper Sagalara <mail@kasesag.me>2026-06-19 19:08:11 +0200
committerKacper Sagalara <mail@kasesag.me>2026-06-19 19:08:11 +0200
commit7821c02171d77229797e3a57edd0502e942373cc (patch)
tree2856fdb7f36144c6e539cfedacd475bf10458ce1 /scripts
parent0339c6b9e1cafffc2e37c47df4277157fc678041 (diff)
Add missing files.HEADmaster
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/add_media.sh29
-rwxr-xr-xscripts/apk_obtain_permissions.sh49
-rw-r--r--scripts/bloatware/bloatware.json720
-rwxr-xr-xscripts/bloatware/main.sh21
-rwxr-xr-xscripts/configs/main.sh20
-rwxr-xr-xscripts/configs/modify_configs.sh57
-rwxr-xr-xscripts/configs/remove_configs.sh95
-rwxr-xr-xscripts/download_apks.sh65
-rwxr-xr-xscripts/install_apks.sh57
-rwxr-xr-xscripts/microg.sh130
-rwxr-xr-xscripts/permissions/install_permissions.sh37
-rwxr-xr-xscripts/permissions/main.sh14
-rwxr-xr-xscripts/permissions/remove_permissions.sh154
-rwxr-xr-xscripts/props.sh115
14 files changed, 1563 insertions, 0 deletions
diff --git a/scripts/add_media.sh b/scripts/add_media.sh
new file mode 100755
index 0000000..44bc5bf
--- /dev/null
+++ b/scripts/add_media.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR> <TMP_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+TMP_DIR=$2
+PRODUCT_DIR="${BASE_DIR}/product_a"
+RES_MEDIA_DIR="${TMP_DIR}/res/media"
+
+add_tones() {
+ local subdir=$1
+
+ cp -L -r "${RES_MEDIA_DIR}"/"${subdir}"/* "${PRODUCT_DIR}"/media-moto/"${subdir}"
+
+ for tone in "${RES_MEDIA_DIR}"/"${subdir}"/*; do
+ [ -f "$tone" ] || continue
+ tone_name=$(basename "$tone")
+
+ ./utils/scripts/add_to_fs.sh product_a "$tone_name" media-moto/"${subdir}"
+ done
+}
+
+add_tones "ringtones"
+add_tones "notifications"
+add_tones "ringtones"
diff --git a/scripts/apk_obtain_permissions.sh b/scripts/apk_obtain_permissions.sh
new file mode 100755
index 0000000..c40c3b3
--- /dev/null
+++ b/scripts/apk_obtain_permissions.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+if [ "$#" -ne 1 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <TMP_DIR>"
+ exit 1
+fi
+
+TMP_DIR=$1
+APPS_DIR="$TMP_DIR/res/apks"
+PERMISSIONS_APPS_DIR="$TMP_DIR/res/permissions"
+
+mkdir -p "$TMP_DIR/res/permissions" \
+ "$TMP_DIR/res/permissions/apps" \
+ "$TMP_DIR/res/permissions/priv-apps"
+
+obtain_permissions() {
+ local type_app=$1
+
+ for apk in "${APPS_DIR}"/$type_app/*.apk; do
+ package_name=$(aapt dump badging ${apk} | awk '/package:/{gsub("name=|'"'"'",""); print $2}')
+ permissions=$(aapt dump badging ${apk} | awk '/uses-permission:/{gsub("name=|'"'"'",""); print $2}')
+
+ if [[ $type_app == "apps" ]]; then
+ out_file="${PERMISSIONS_APPS_DIR}/$type_app/default-permissions-${package_name}.xml"
+ echo -e '<?xml version="1.0" encoding="utf-8"?>\n<exceptions>\n\t<exception package="'$package_name'">' > "$out_file"
+ for p in $permissions; do
+ echo -e '\t\t<permission name="'$p'" fixed="false"/>' >> "$out_file"
+ done
+ echo -e '\t</exception>\n</exceptions>' >> "$out_file"
+
+ echo -e "\t[+] $out_file"
+ else
+ out_file="${PERMISSIONS_APPS_DIR}/$type_app/privapp-permissions-${package_name}.xml"
+ echo -e '<?xml version="1.0" encoding="utf-8"?>\n<permissions>\n\t<privapp-permissions package="'$package_name'">' > "$out_file"
+ for p in $permissions; do
+ echo -e '\t\t<permission name="'$p'" />' >> "$out_file"
+ done
+ echo -e '\t</privapp-permissions>\n</permissions>' >> "$out_file"
+
+ echo -e "\t[+] $out_file"
+ fi
+
+ done
+}
+
+echo -e "[*] Obtaining permissions from APKs."
+obtain_permissions "apps"
+obtain_permissions "priv-apps"
diff --git a/scripts/bloatware/bloatware.json b/scripts/bloatware/bloatware.json
new file mode 100644
index 0000000..23dab79
--- /dev/null
+++ b/scripts/bloatware/bloatware.json
@@ -0,0 +1,720 @@
+{
+ "product_a": [
+ {
+ "path": "priv-app/MotoFeedback",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/GameMode",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "operator-app/priv-app/PayJoyAccess",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/FamilyLinkParentalControls/",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/GooglePartnerSetup",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/AndroidAutoStub",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/AndroidSystemIntelligence",
+ "description": "An app that enables smart and personalized features on your Android phone using machine learning and Private Compute Core",
+ "remove": false
+ },
+ {
+ "path": "priv-app/AndroidSettingsIntelligence",
+ "description": "If you remove it, you will lose the search in the settings",
+ "remove": false
+ },
+ {
+ "path": "priv-app/SettingsIntelligence",
+ "description": "If you remove it, you will lose the search in the settings",
+ "remove": false
+ },
+ {
+ "path": "priv-app/GoogleRestore",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/Turbo",
+ "description": "Breaks battery settings",
+ "remove": false
+ },
+ {
+ "path": "priv-app/Velvet",
+ "description": "Google's Main app (aka. QuickSearchBox)",
+ "remove": true
+ },
+ {
+ "path": "app/YouTube",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/Meet",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/YTMusic",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/com.google.mainline.adservices",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/com.google.mainline.telemetry",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/Drive",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/Gmail2",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/Maps",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/Chrome64",
+ "description": "Google Chrome web browser",
+ "remove": true
+ },
+ {
+ "path": "app/WebViewGoogle64",
+ "description": "Default Google's webview app.",
+ "remove": false
+ },
+ {
+ "path": "app/CalculatorGoogle",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/DeskClockGoogle",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/GoogleLocationHistory",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/Photos",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/Videos",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/GoogleOne",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/GoogleOneTimeInitializer",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/com.google.android.modulemetadata",
+ "description": "",
+ "remove": false
+ },
+ {
+ "path": "priv-app/AssistantShell",
+ "description": "Google Assistant",
+ "remove": true
+ },
+ {
+ "path": "priv-app/Messages",
+ "description": "Google Messages",
+ "remove": true
+ },
+ {
+ "path": "priv-app/Phonesky",
+ "description": "Google Play store",
+ "remove": true
+ },
+ {
+ "path": "priv-app/GmsCore",
+ "description": "Google Play Services",
+ "remove": true
+ },
+ {
+ "path": "app/CalendarGoogle",
+ "description": "Google Calendar",
+ "remove": true
+ },
+ {
+ "path": "app/GoogleContacts",
+ "description": "Google Calendar",
+ "remove": true
+ },
+ {
+ "path": "priv-app/FilesGoogle",
+ "description": "Google Files",
+ "remove": true
+ },
+ {
+ "path": "priv-app/PersonalSafety",
+ "description": "Google Personal Safety Manager (broken)",
+ "remove": true
+ },
+ {
+ "path": "app/LatinImeGoogle",
+ "description": "GBoard",
+ "remove": true
+ },
+ {
+ "path": "priv-app/Wellbeing",
+ "description": "Digital Wellbeing",
+ "remove": true
+ },
+ {
+ "path": "overlay/GmsConfigOverlayASI.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/GmsConfigOverlayCommon.apk",
+ "description": "Removing this causes system's webview to not be present.",
+ "remove": false
+ },
+ {
+ "path": "overlay/GmsConfigOverlayComms.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/GmsConfigOverlayGeotz.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/GmsConfigOverlayGSA.apk",
+ "description": "GSA - Google Search Assistant. Needed to enable 'DigitalAssistant' app to work.",
+ "remove": false
+ },
+ {
+ "path": "overlay/GmsConfigOverlayPersonalSafety.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/GmsConfigOverlayPhotos.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/GmsConfigOverlaySearchSelector.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "operator-app/priv-app/DigitalTurbine",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "operator-app/priv-app/OneWeather",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "operator-app/priv-app/OneWeatherAmx",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "app/SpeechServicesByGoogle",
+ "description": "Google TTS",
+ "remove": true
+ },
+ {
+ "path": "priv-app/GoogleDialer",
+ "description": "Google default dialer",
+ "remove": true
+ },
+ {
+ "path": "overlay/MotoSetupWizardOverlay.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/MotoSetupWizardOverlayDS.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/GoogleDeviceLockControllerOverlay.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/GoogleExtServicesConfigOverlay.apk",
+ "description": "Seems to preconfigure Google assistant as the preferred package. Removing causes defects.",
+ "remove": false
+ },
+ {
+ "path": "overlay/GooglePermissionControllerOverlay.apk",
+ "description": "Removing causes defects.",
+ "remove": false
+ },
+ {
+ "path": "overlay/GooglePermissionControllerFrameworkOverlay.apk",
+ "description": "Seems to preconfigure Google Wallet as the preferred package. Removing causes defects.",
+ "remove": false
+ },
+ {
+ "path": "overlay/PAKSOverlayTCE.apk",
+ "description": "Overlay for PAKS (package removed from the system).",
+ "remove": true
+ },
+ {
+ "path": "overlay/PAKSOverlayUSC.apk",
+ "description": "Overlay for PAKS (package removed from the system).",
+ "remove": true
+ },
+ {
+ "path": "overlay/LauncherFrameworkRRO.apk",
+ "description": "",
+ "remove": false
+ },
+ {
+ "path": "overlay/MotoLauncherConfigLamuLiteResOverlay.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/MotoLauncherConfigLamuPowerResOverlay.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/MotoLauncherOverlayAMX.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/MotoLauncherOverlayAppLabelTwoLines.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/MotoLauncherResOverlay.apk",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "overlay/VivoAppTrayFolderOverlay.apk",
+ "description": "",
+ "remove": true
+ }
+ ],
+
+ "system_a": [
+ {
+ "path": "system/app/CompanionDeviceManager",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/app/facebook-appmanager",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/app/WallpaperBackup",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/app/BasicDreams",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/app/MotoSignatureApp",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/LiveWallpapersPicker",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/LenovoID",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/facebook-installer",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/facebook-services",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/Taboola",
+ "description": "Moto Live lockscreen",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/PartnerBookmarksProviderMoto",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/MotoGlance",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/TelcelContenedor",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/BRApps2",
+ "description": "Allows unathorized installation of bloatware by moto.",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/ChromeHomePageProviderMoto",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/ClaroContenedor",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/StubMotorolaClaro",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/SysDLL",
+ "description": "Useless app that sends requests to carrier servers to know if the device has to be locked (if the IMEI is banned)",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/IronSource",
+ "description": "IronSource: Israeli software company offering products focused on the app economy.",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/IronSource3UK",
+ "description": "IronSource: Israeli software company offering products focused on the app economy.",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/MotoCamera",
+ "description": "",
+ "remove": false
+ },
+ {
+ "path": "system/priv-app/ManagedProvisioning",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/ONS",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/preloadapp/app/facebook",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/preloadapp/operator-app/app/instagram",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/MotoHelp",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/MotoSpaces",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/MotoOta",
+ "description": "OTA updater from Motorola",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/PlayAutoInstallConfigSigned",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/app/ApeSoundRecorder",
+ "description": "Shipped sound recorder",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/SearchSelector",
+ "description": "Search Selector app (depends on GMS)",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/MotoSetupWizard",
+ "description": "Moto setup wizard application",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/EnterpriseAdapterService",
+ "description": "Thinkshield",
+ "remove": true
+ },
+ {
+ "path": "system/priv-app/MotoThinkUEM",
+ "description": "Thinkshield",
+ "remove": true
+ },
+ {
+ "path": "system/app/TimeWeather",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/app/CarrierDefaultApp",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/HomepageAPAC",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/MDIP",
+ "description": "Amazon appmanager",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/priv-app/Orange",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfig",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigAmxar",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigAmxcl",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigAmxco",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigAmxla",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigAmxmx",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigAmxpe",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigClaro",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigLenovo",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigOraeu",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigPlaypl",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigTimit",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigYandex",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/operator-app/app/MotoLauncherConfigYandexLenovo",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "system/framework/moto-enterprise.jar",
+ "description": "",
+ "remove": false
+ },
+ {
+ "path": "system/framework/moto-core_services.jar",
+ "description": "",
+ "remove": false
+ },
+ {
+ "path": "system/framework/moto-enterprise.jar.fsv_meta",
+ "description": "",
+ "remove": false
+ },
+ {
+ "path": "system/framework/moto-core_services.jar.fsv_meta",
+ "description": "",
+ "remove": false
+ }
+ ],
+
+ "system_ext_a": [
+ {
+ "path": "priv-app/PAKS",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/PaksNotification",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/DemoMode",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/GoogleFeedback",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "operator-app/priv-app/MotoLiveWallpaper3",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/Notifications",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/MotoCare",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/SetupWizard",
+ "description": "Removing this app causes system to become unusable without prior option changes.",
+ "remove": false
+ },
+ {
+ "path": "priv-app/GoogleServicesFramework",
+ "description": "Google GSF",
+ "remove": true
+ },
+ {
+ "path": "priv-app/MotoInstaller",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/MotoSecureVault",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/MotoSecurityHub",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/Devicemanagement",
+ "description": "Device management app",
+ "remove": true
+ },
+ {
+ "path": "app/Main",
+ "description": "",
+ "remove": true
+ },
+ {
+ "path": "priv-app/MotoLauncher",
+ "description": "Replaced with Lawnchair. Requires LauncherFrameworkRRO overlay to be set to 'app.lawnchair'.",
+ "remove": true
+ },
+ {
+ "path": "priv-app/DuraSpeed",
+ "description": "DuraSpeed by Mediatek. Can be disabled by the end-user without uninstalling app.",
+ "remove": false
+ },
+ {
+ "path": "priv-app/CoreSettingsExt",
+ "description": "",
+ "remove": true
+ }
+ ]
+}
diff --git a/scripts/bloatware/main.sh b/scripts/bloatware/main.sh
new file mode 100755
index 0000000..2a76137
--- /dev/null
+++ b/scripts/bloatware/main.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+if [ "$#" -ne 1 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+SCRIPT_DIR=$(dirname "$(realpath "${BASH_SOURCE[0]}")")
+CONFIG="${SCRIPT_DIR}/bloatware.json"
+BLOATWARE=()
+
+BLOATWARE+=($(jq -r '.product_a[] | select(.remove == true) | "product_a/\(.path)"' "$CONFIG"))
+BLOATWARE+=($(jq -r '.system_a[] | select(.remove == true) | "system_a/\(.path)"' "$CONFIG"))
+BLOATWARE+=($(jq -r '.system_ext_a[] | select(.remove == true) | "system_ext_a/\(.path)"' "$CONFIG"))
+
+for package in "${BLOATWARE[@]}"; do
+ echo "[-] ${BASE_DIR}/${package}"
+ rm -rf "${BASE_DIR}/${package}"
+done
diff --git a/scripts/configs/main.sh b/scripts/configs/main.sh
new file mode 100755
index 0000000..55ebc46
--- /dev/null
+++ b/scripts/configs/main.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR> <TMP_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+TMP_DIR=$2
+SCRIPT_DIR=$(dirname "$(realpath "${BASH_SOURCE[0]}")")
+
+cp -L "$TMP_DIR/res/configs/preferred-apps/preferred-apps-driedlamu.xml" "${BASE_DIR}"/product_a/etc/preferred-apps
+./utils/scripts/add_to_fs.sh product_a "preferred-apps-driedlamu.xml" etc/preferred-apps 1
+
+cp -L -r "$TMP_DIR/res/configs/sysconfig/app.lawnchair-hiddenapi-package-whitelist.xml" "${BASE_DIR}/product_a/etc/sysconfig"
+./utils/scripts/add_to_fs.sh product_a app.lawnchair-hiddenapi-package-whitelist.xml etc/sysconfig
+
+"${SCRIPT_DIR}"/modify_configs.sh "$BASE_DIR"
+"${SCRIPT_DIR}"/remove_configs.sh "$BASE_DIR"
diff --git a/scripts/configs/modify_configs.sh b/scripts/configs/modify_configs.sh
new file mode 100755
index 0000000..d400346
--- /dev/null
+++ b/scripts/configs/modify_configs.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+if [ "$#" -ne 1 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+
+SYSTEM_DIR="${BASE_DIR}/system_a"
+PRODUCT_DIR="${BASE_DIR}/product_a"
+SYSTEM_EXT_DIR="${BASE_DIR}/system_ext_a"
+
+modify_default_assistant() {
+ local apk_name="GmsConfigOverlayGSA"
+ local apk_location="${PRODUCT_DIR}/overlay"
+ local working_dir="/tmp/driedlamu/modify_apk/${apk_name}/decompile"
+ local assistant_package_name="me.kasesag.driedlamu.assistant"
+
+ ./utils/scripts/modify_apk.sh unpack "$apk_location"/${apk_name}.apk
+ xml ed -L -u "/resources/string[@name='config_defaultAssistant']" -v "${assistant_package_name}" "$working_dir/res/values/strings.xml"
+ ./utils/scripts/modify_apk.sh repack "$apk_location"/${apk_name}.apk "$apk_location"
+}
+
+modify_default_launcher() {
+ local apk_name="LauncherFrameworkRRO"
+ local apk_location="${PRODUCT_DIR}/overlay"
+ local working_dir="/tmp/driedlamu/modify_apk/${apk_name}/decompile"
+ local launcher_package_name="app.lawnchair"
+
+ ./utils/scripts/modify_apk.sh unpack "$apk_location"/${apk_name}.apk
+ sed -i "s/com.motorola.launcher3/${launcher_package_name}/g" "$working_dir/res/values/strings.xml"
+ ./utils/scripts/modify_apk.sh repack "$apk_location"/${apk_name}.apk "$apk_location"
+}
+
+echo "[=] Modifying default assistant to 'me.kasesag.driedlamu.asistant'"
+modify_default_assistant
+
+echo "[=] Modifying default launcher activity to 'app.lawnchair'"
+modify_default_launcher
+
+echo "[=] Writing an empty config to ${SYSTEM_DIR}/system/etc/sysconfig/enable-disable-preload-apps.xml"
+echo -e '<?xml version="1.0" encoding="utf-8"?>\n<config>\n\n</config>' > "${SYSTEM_DIR}/system/etc/sysconfig/enable-disable-preload-apps.xml"
+./utils/scripts/add_to_fs.sh system_a "enable-disable-preload-apps.xml" system/etc/sysconfig
+
+echo "[=] Writing an empty config to ${SYSTEM_DIR}/system/etc/appmanager.conf"
+touch "${SYSTEM_DIR}/system/etc/appmanager.conf"
+./utils/scripts/add_to_fs.sh system_a "appmanager.conf" system/etc
+
+echo "[=] Patching 'system_ext_property_contexts' in ${SYSTEM_EXT_DIR}/etc/selinux/system_ext_property_contexts"
+sed -i -e "/facebook/d" \
+ -e "/spotify/d" \
+ -e "/booking/d" \
+ -e "/inmobi/d" \
+ -e "/zero_touch/d" \
+ "${SYSTEM_EXT_DIR}/etc/selinux/system_ext_property_contexts" \ No newline at end of file
diff --git a/scripts/configs/remove_configs.sh b/scripts/configs/remove_configs.sh
new file mode 100755
index 0000000..6940b2e
--- /dev/null
+++ b/scripts/configs/remove_configs.sh
@@ -0,0 +1,95 @@
+#!/bin/bash
+
+if [ "$#" -ne 1 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+
+SYSTEM_DIR="${BASE_DIR}/system_a"
+PRODUCT_DIR="${BASE_DIR}/product_a"
+SYSTEM_EXT_DIR="${BASE_DIR}/system_ext_a"
+
+REMOVE_CONFIGS=(
+ "${PRODUCT_DIR}/etc/sysconfig/bugreport-whitelist-com.motorola.help.xml"
+ "${PRODUCT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.gamemode.xml"
+ "${PRODUCT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.help.xml"
+ "${PRODUCT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.timeweatherwidget.xml"
+ "${PRODUCT_DIR}/etc/sysconfig/preinstalled-packages-platform-overlays.xml"
+ "${PRODUCT_DIR}/etc/sysconfig/shortcut-com.motorola.gamemode.xml"
+ "${PRODUCT_DIR}/etc/sysconfig/whitelist_com.dti.motorola.xml"
+ "${PRODUCT_DIR}/etc/preferred-apps/google.xml"
+ "${PRODUCT_DIR}/etc/tn_app_delay.xml"
+ "${PRODUCT_DIR}/etc/perf_config_common.xml"
+
+ "${SYSTEM_EXT_DIR}/etc/init/init.spotifyprops.rc"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/com.motorola.ccc.devicemanagement.powersave.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/com.motorola.ccc.mainplm.powersave.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/com.motorola.ccc.notification.powersave.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/com.motorola.installer.powersave.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/com.motorola.paks.powersave.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/hiddenapi-allowlist-com.motorola.paks.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.ccc.devicemanagement.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.ccc.notification.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.demo.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.livewallpaper.xml"
+ # "${SYSTEM_EXT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.securevault.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/hiddenapi-whitelist-com.motorola.launcher3.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/initial-package-stopped-states-com.motorola.securityhub.xml"
+ "${SYSTEM_EXT_DIR}/etc/sysconfig/whitelist_com.motorola.motocare.xml"
+ "${SYSTEM_EXT_DIR}/etc/nondisable/com.motorola.ccc.devicemanagement.nondisable.xml"
+ "${SYSTEM_EXT_DIR}/etc/nondisable/com.motorola.installer.xml"
+ "${SYSTEM_EXT_DIR}/etc/enable-disable-packages/enable-disable-com.motorola.installer.xml"
+
+ "${SYSTEM_DIR}/system/etc/sysconfig/facebook-hiddenapi-package-allowlist.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/hiddenapi-moto-ota-package-whitelist.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/hiddenapi-whitelist-com.motorola.brapps.xml"
+ "${SYSTEM_DIR}/system/etc/enable-disable-packages/enable-disable-com.motorola.brapps.xml"
+ "${SYSTEM_DIR}/system/etc/enable-disable-packages/enable-disable-com.motorola.enterprise.adapter.service.xml"
+
+ "${SYSTEM_DIR}/system/etc/init/facebook-appmanager.rc"
+ "${SYSTEM_DIR}/system/etc/sysconfig/afw-com.aura.oobe.motorola.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/afw-com.dti.motorola.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/afw-com.inmobi.installer.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/business-edition-disabled-apps.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/com.motorola.brapps.powersave.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/com.motorola.enterprise.adapter.service.powersave.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/hiddenapi-whitelist-cco.sitic.pp.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/hiddenapi-whitelist-com.android.providers.partnerbookmarks.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/hiddenapi-whitelist-com.motorola.android.providers.chromehomepage.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/hiddenapi-whitelist-moto.xml" # MotoOTA package
+ "${SYSTEM_DIR}/system/etc/sysconfig/initial-package-stopped-states-orange.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/meta-hiddenapi-package-allowlist.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/sysconfig-orange.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/whitelist_aura.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/whitelist_com.claroColombia.contenedor.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/whitelist_com.ironsource.appcloud.oobe.hutchison.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/whitelist_com.motorola.spaces.xml"
+ "${SYSTEM_DIR}/system/etc/sysconfig/whitelist_com.telcel.contenedor.xml"
+ "${SYSTEM_DIR}/system/etc/appmanager.conf"
+)
+
+REMOVE_DIRS=(
+ "${PRODUCT_DIR}/media-poland-play"
+ "${PRODUCT_DIR}/etc/sku_RU"
+ "${PRODUCT_DIR}/etc/sku_INDIA"
+ "${PRODUCT_DIR}/etc/sku_EEA"
+ "${PRODUCT_DIR}/etc/motorola"
+ "${PRODUCT_DIR}/etc/MotoDesktopAppConfig"
+
+ # "${SYSTEM_DIR}/system/etc/duraspeed"
+)
+
+echo "[i] Removing system configs..."
+for config in "${REMOVE_CONFIGS[@]}"; do
+ echo -e "\t[-] ${config}"
+ rm -rf "$config"
+done
+
+echo "[i] Removing system directories..."
+for config in "${REMOVE_DIRS[@]}"; do
+ echo -e "\t[-] ${config}"
+ rm -rf "$config"
+done
diff --git a/scripts/download_apks.sh b/scripts/download_apks.sh
new file mode 100755
index 0000000..e494b9e
--- /dev/null
+++ b/scripts/download_apks.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+
+if [ "$#" -ne 1 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <TMP_DIR>"
+ exit 1
+fi
+
+source .config
+
+TMP_DIR=$1
+APK_RES_DIR="$TMP_DIR/res/apks"
+
+FDROID_PACKAGES=(
+ "org.fossify.math"
+ "org.fossify.clock"
+ "org.fossify.contacts"
+ "org.fossify.filemanager"
+ "org.fossify.gallery"
+ "org.fossify.messages"
+ "org.fossify.phone"
+ "org.fossify.voicerecorder"
+ "org.fossify.musicplayer"
+ "org.fossify.calendar"
+)
+
+normalize_package_name() {
+ local package_name=$1
+ local dots=$(echo "${package_name}" | grep -o "\." | wc -l)
+ echo "${package_name}" | tr "." "\n" | sed -e "1,${dots}d" -e "s/\b\(.\)/\u\1/g"
+}
+
+fdroid_download_package() {
+ local package_name=$1
+ local output_dir=$2
+ local version=$(curl -s "https://f-droid.org/api/v1/packages/${package_name}" | jq -r '.suggestedVersionCode')
+ local normalized_pkg_name=$(normalize_package_name ${package_name})
+
+ wget -q -O "$output_dir/${normalized_pkg_name}.apk" https://f-droid.org/repo/${package_name}_${version}.apk
+ echo -e "\t[+] $package_name"
+}
+
+mkdir -p "$TMP_DIR/res/apks" \
+ "$TMP_DIR/res/apks/apps" \
+ "$TMP_DIR/res/apks/priv-apps" \
+ "$TMP_DIR/res/apks/preload-apps"
+
+if [[ $INSTALL_FDROID == 1 ]]; then
+ echo "[i] Downloading F-Droid"
+ fdroid_download_package "org.fdroid.fdroid.privileged" "$APK_RES_DIR/priv-apps"
+ fdroid_download_package "org.fdroid.fdroid" "$APK_RES_DIR/apps"
+ echo "[i] Done"
+fi
+
+wait
+
+if [[ $INSTALL_RECOMMENDED_FOSS_APPS == 1 ]]; then
+ echo "[i] Downloading recommended apps"
+ fdroid_download_package "org.fossify.phone" "$APK_RES_DIR/priv-apps"
+ for pkg in "${FDROID_PACKAGES[@]}"; do
+ fdroid_download_package "${pkg}" "$APK_RES_DIR/apps" &
+ done
+ wait
+ echo "[i] Done"
+fi \ No newline at end of file
diff --git a/scripts/install_apks.sh b/scripts/install_apks.sh
new file mode 100755
index 0000000..9e22ee3
--- /dev/null
+++ b/scripts/install_apks.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+ echo "Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR> <SRC_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+SRC_DIR=$2
+
+APPS_SRC="${SRC_DIR}/apks/apps"
+PRIV_APPS_SRC="${SRC_DIR}/apks/priv-apps"
+PRELOAD_APP_SRC="${SRC_DIR}/apks/preload-apps"
+OVERLAY_APP_SRC="${SRC_DIR}/apks/overlay"
+
+APPS_DST="${BASE_DIR}/product_a/app"
+PRIV_APPS_DST="${BASE_DIR}/product_a/priv-app"
+PRELOAD_APP_DST="${BASE_DIR}/system_a/system/preloadapp/app"
+OVERLAY_APP_DST="${BASE_DIR}/product_a/overlay"
+
+install_apks() {
+ local src_dir=$1
+ local dst_dir=$2
+ local label=$3
+ local partition=$4
+
+ if [ ! -d "$src_dir" ]; then
+ echo "[~] No apks avialable ${label}"
+ return
+ fi
+
+ local count=0
+ for apk in "${src_dir}"/*.apk; do
+ [ -f "$apk" ] || continue
+
+ app_name=$(basename "$apk" .apk)
+ app_dst="${dst_dir}/${app_name}"
+
+ echo -e "\t[=] Installing ${app_name} to ${label}..."
+ mkdir -p "$app_dst"
+ ./utils/scripts/add_to_fs.sh "$partition" "$app_name" "$label" 1
+
+ cp -L "$apk" "${app_dst}/${app_name}.apk"
+ ./utils/scripts/add_to_fs.sh "$partition" "${app_name}.apk" "$label/$app_name"
+
+ count=$((count + 1))
+ done
+
+ echo "[i] ${count} APK(s) have been installed as '${label}'"
+}
+
+echo "[*] Installing APKs..."
+install_apks "$APPS_SRC" "$APPS_DST" "app" "product_a"
+install_apks "$PRIV_APPS_SRC" "$PRIV_APPS_DST" "priv-app" "product_a"
+install_apks "$OVERLAY_APP_SRC" "$OVERLAY_APP_DST" "overlay" "product_a"
+install_apks "$PRELOAD_APP_SRC" "$PRELOAD_APP_DST" "system/preloadapp/app" "system_a" \ No newline at end of file
diff --git a/scripts/microg.sh b/scripts/microg.sh
new file mode 100755
index 0000000..6b4bed8
--- /dev/null
+++ b/scripts/microg.sh
@@ -0,0 +1,130 @@
+#!/bin/bash
+
+if [ "$#" -lt 2 ]; then
+ echo "Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR> <TMP_DIR>"
+ exit 1
+fi
+
+source .config
+
+BASE_DIR=$1
+TMP_DIR=$2
+
+RES_DIR="$TMP_DIR/res/microg"
+APK_RES_DIR="$TMP_DIR/res/apks"
+WORK_DIR="$TMP_DIR/microg"
+
+SYSTEM_DIR="${BASE_DIR}/system_a"
+PRODUCT_DIR="${BASE_DIR}/product_a"
+
+patch_microg() {
+ echo "[i] Patching microG"
+
+ zip -q -d "${WORK_DIR}"/GmsCore_o.apk META-INF/MANIFEST.MF
+ zip -q -d "${WORK_DIR}"/GmsCore_o.apk META-INF/CERT.SF
+ zip -q -d "${WORK_DIR}"/GmsCore_o.apk META-INF/CERT.RSA
+
+ zip -q -d "${WORK_DIR}"/Phonesky_o.apk META-INF/MANIFEST.MF
+ zip -q -d "${WORK_DIR}"/Phonesky_o.apk META-INF/CERT.SF
+ zip -q -d "${WORK_DIR}"/Phonesky_o.apk META-INF/CERT.RSA
+
+ zipalign 4 "${WORK_DIR}"/Phonesky_o.apk "${WORK_DIR}"/Phonesky_oz.apk
+ zipalign 4 "${WORK_DIR}"/GmsCore_o.apk "${WORK_DIR}"/GmsCore_oz.apk
+
+ apksigcopier patch "${RES_DIR}"/signatures-google/phonesky "${WORK_DIR}"/Phonesky_oz.apk "${APK_RES_DIR}"/priv-apps/Phonesky.apk
+ apksigcopier patch "${RES_DIR}"/signatures-google/gms "${WORK_DIR}"/GmsCore_oz.apk "${APK_RES_DIR}"/priv-apps/GmsCore.apk
+}
+
+download_latest_microg() {
+ echo "[i] Downloading latest microG"
+
+ local gmscore_url=$(curl -s "https://api.github.com/repos/microg/GmsCore/releases/latest" | jq -r '[ .assets[] | select( .browser_download_url | test("com.google.android.gms.(\\d+).apk$")?) ]' | jq -r ".[] | .browser_download_url")
+ local phonesky_url=$(curl -s "https://api.github.com/repos/microg/GmsCore/releases/latest" | jq -r '[ .assets[] | select( .browser_download_url | test("com.android.vending.(\\d+).apk$")) ]' | jq -r ".[] | .browser_download_url")
+ local gsfproxy_url=$(curl -s "https://api.github.com/repos/microg/GsfProxy/releases/latest" | jq -r '[ .assets[] | select( .browser_download_url) ]' | jq -r ".[] | .browser_download_url")
+
+ if [[ $INSTALL_SU == 1 ]]; then
+ wget -q -O "${APK_RES_DIR}"/priv-apps/GmsCore.apk "$gmscore_url"
+ wget -q -O "${APK_RES_DIR}"/priv-apps/Phonesky_o.apk "$phonesky_url"
+ else
+ wget -q -O "${WORK_DIR}"/GmsCore_o.apk "$gmscore_url"
+ wget -q -O "${WORK_DIR}"/Phonesky_o.apk "$phonesky_url"
+ fi
+
+ wget -q -O "${APK_RES_DIR}"/priv-apps/GsfProxy.apk "$gsfproxy_url"
+}
+
+install_lib() {
+ mkdir -p "${PRODUCT_DIR}"/priv-app/GmsCore/lib
+ ./utils/scripts/add_to_fs.sh product_a "lib" priv-app/GmsCore 1
+
+ mkdir -p "${PRODUCT_DIR}"/priv-app/GmsCore/lib/arm64
+ ./utils/scripts/add_to_fs.sh product_a "arm64" priv-app/GmsCore/lib 1
+
+ echo "[*] Installing microG libraries (64-bit)"
+
+ for lib in "${RES_DIR}"/system/lib/arm64/*; do
+ lib_name=$(basename "$lib")
+
+ cp -L "${lib}" "${SYSTEM_DIR}/system/lib64/"
+ cp -L "${lib}" "${PRODUCT_DIR}/priv-app/GmsCore/lib/arm64"
+
+ ./utils/scripts/add_to_fs.sh system_a "${lib_name}" system/lib64
+ ./utils/scripts/add_to_fs.sh product_a "${lib_name}" priv-app/GmsCore/lib/arm64
+
+ echo -e "\t[+] ${lib}"
+ done
+
+ echo "[*] Installing microG libraries (32-bit)"
+
+ for lib in "${RES_DIR}"/system/lib/armeabi-v7a/*; do
+ lib_name=$(basename "$lib")
+
+ cp -L "${lib}" "${SYSTEM_DIR}/system/lib/"
+ ./utils/scripts/add_to_fs.sh system_a "${lib_name}" system/lib
+
+ echo -e "\t[+] ${lib}"
+ done
+}
+
+install_files() {
+ echo "[i] Installing microG files"
+
+ cp -L "${RES_DIR}/permissions/priv-apps/privapp-permissions-org.microG.xml" "${PRODUCT_DIR}/etc/permissions/privapp-permissions-org.microG.xml"
+ ./utils/scripts/add_to_fs.sh product_a "privapp-permissions-org.microG.xml" etc/permissions
+
+ cp -L "${RES_DIR}/permissions/apps/permissions-com.google.android.gms.xml" "${PRODUCT_DIR}/etc/default-permissions/permissions-com.google.android.gms.xml"
+ ./utils/scripts/add_to_fs.sh product_a "permissions-com.google.android.gms.xml" etc/default-permissions
+
+ cp -L "${RES_DIR}/permissions/priv-apps/com.google.android.maps.xml" "${SYSTEM_DIR}/system/etc/permissions/com.google.android.maps.xml"
+ ./utils/scripts/add_to_fs.sh system_a "com.google.android.maps.xml" system/etc/permissions
+
+ cp -L "${RES_DIR}/system/framework/com.google.android.maps.jar" "${SYSTEM_DIR}/system/framework/com.google.android.maps.jar"
+ ./utils/scripts/add_to_fs.sh system_a "com.google.android.maps.jar" system/framework
+}
+
+install_sync() {
+ echo "[i] Installing Google Sync"
+
+ cp -L "${RES_DIR}/permissions/apps/permissions-google-sync.xml" "${SYSTEM_DIR}/system/etc/permissions/permissions-google-sync.xml"
+ ./utils/scripts/add_to_fs.sh system_a "permissions-google-sync.xml" system/etc/permissions
+
+ cp -L "${RES_DIR}/apks/apps/GoogleCalendarSyncAdapter.apk" "${APK_RES_DIR}/apps"
+ cp -L "${RES_DIR}/apks/apps/GoogleContactsSyncAdapter.apk" "${APK_RES_DIR}/apps"
+}
+
+mkdir -p "$WORK_DIR"
+download_latest_microg
+
+if [[ $INSTALL_SU == 0 ]]; then
+ patch_microg
+else
+ echo "[i] Root installation enabled. MicroG will not be patched to accept default signatures."
+ sleep 1
+fi
+
+install_files
+install_lib
+install_sync
+
+echo "[i] microG setup complete!" \ No newline at end of file
diff --git a/scripts/permissions/install_permissions.sh b/scripts/permissions/install_permissions.sh
new file mode 100755
index 0000000..e802cc7
--- /dev/null
+++ b/scripts/permissions/install_permissions.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+ echo "Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR> <SRC_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+SRC_DIR=$2
+PERMISSIONS_APPS_SRC="${SRC_DIR}/permissions/apps"
+PERMISSIONS_PRIV_APPS_SRC="${SRC_DIR}/permissions/priv-apps"
+PERMISSIONS_APPS_DST="${BASE_DIR}/product_a/etc/default-permissions"
+PERMISSIONS_PRIV_APPS_DST="${BASE_DIR}/product_a/etc/permissions"
+
+install_permissions() {
+ local src_dir=$1
+ local dst_dir=$2
+ local label=$3
+
+ for file in "${src_dir}"/*.xml; do
+ file_name=$(basename "$file")
+
+ cp -L "$file" "${dst_dir}/${file_name}"
+ ./utils/scripts/add_to_fs.sh product_a "$file_name" "etc/$label"
+ done
+}
+
+install_permissions "$PERMISSIONS_APPS_SRC" "$PERMISSIONS_APPS_DST" "default-permissions"
+install_permissions "$PERMISSIONS_PRIV_APPS_SRC" "$PERMISSIONS_PRIV_APPS_DST" "permissions"
+
+echo -e '<?xml version="1.0" encoding="utf-8"?>\n<permissions>\n\t\t<privapp-permissions package="org.fdroid.fdroid.privileged">\n\t\t\t\t<permission name="android.permission.DELETE_PACKAGES"/>\n\t\t\t\t<permission name="android.permission.INSTALL_PACKAGES"/>\n\t\t</privapp-permissions>\n</permissions>' > "${PERMISSIONS_PRIV_APPS_DST}/org.fdroid.fdroid.privileged.xml"
+./utils/scripts/add_to_fs.sh product_a org.fdroid.fdroid.privileged.xml etc/permissions
+
+# sed -i '$d' ${BASE_DIR}/system_a/system/etc/permissions/privapp-permissions-platform.xml
+# echo -e '\n\t<privapp-permissions package="org.fdroid.fdroid.privileged">\n\t\t<permission name="android.permission.DELETE_PACKAGES"/>\n\t\t<permission name=" android.permission.INSTALL_PACKAGES"/>\n\t</privapp-permissions>\n' >> ${BASE_DIR}/product_a/etc/permissions/org.fdroid.fdroid.privileged.xml >> ${BASE_DIR}/system_a/system/etc/permissions/privapp-permissions-platform.xml
+# sed -i '$a</permissions>' ${BASE_DIR}/system_a/system/etc/permissions/privapp-permissions-platform.xml \ No newline at end of file
diff --git a/scripts/permissions/main.sh b/scripts/permissions/main.sh
new file mode 100755
index 0000000..4584f64
--- /dev/null
+++ b/scripts/permissions/main.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR> <TMP_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+TMP_DIR=$2
+SCRIPT_DIR=$(dirname "$(realpath "${BASH_SOURCE[0]}")")
+
+"${SCRIPT_DIR}"/remove_permissions.sh "$BASE_DIR"
+"${SCRIPT_DIR}"/install_permissions.sh "$BASE_DIR" "$TMP_DIR/res" \ No newline at end of file
diff --git a/scripts/permissions/remove_permissions.sh b/scripts/permissions/remove_permissions.sh
new file mode 100755
index 0000000..053f12a
--- /dev/null
+++ b/scripts/permissions/remove_permissions.sh
@@ -0,0 +1,154 @@
+#!/bin/bash
+
+if [ "$#" -ne 1 ]; then
+ echo "[-] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR>"
+ exit 1
+fi
+
+BASE_DIR=$1
+SYSTEM_DIR="${BASE_DIR}/system_a"
+PRODUCT_DIR="${BASE_DIR}/product_a"
+SYSTEM_EXT_DIR="${BASE_DIR}/system_ext_a"
+
+REMOVE_GOOGLE_APP_PERMISSIONS=(
+ "com.google.android.apps.restore"
+ "com.google.android.apps.assistant"
+ "com.google.android.apps.actionsservice"
+ "com.google.android.apps.tachyon"
+ "com.google.android.apps.photos"
+)
+
+REMOVE_GOOGLE_PRIVAPP_PERMISSIONS=(
+ "com.google.android.apps.nbu.files"
+ "com.google.android.apps.messaging"
+ "com.google.android.apps.restore"
+ "com.google.android.apps.safetyhub"
+ "com.android.vending"
+ "com.google.android.apps.actionsservice"
+ "com.google.android.apps.assistant"
+ "com.google.android.gms"
+ "com.google.android.gms.supervision"
+ "com.google.android.googlequicksearchbox"
+ "com.android.hotwordenrollment.okgoogle"
+)
+
+REMOVE_CONFIG_PERMISSIONS=(
+ # app permissions
+ "${PRODUCT_DIR}/etc/default-permissions/default-permission-com.motorola.timeweatherwidget.xml"
+
+ "${SYSTEM_EXT_DIR}/etc/default-permissions/default-permission-com.motorola.ccc.notification.xml"
+ "${SYSTEM_EXT_DIR}/etc/default-permissions/default-permission-com.motorola.installer.xml"
+
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permission-com.glance.lockscreenM.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permission-com.motorola.motoota.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permission-com.telcel.contenedor.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-com.aura.oobe.motorola.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-com.claro.contenedor.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-com.dti.motorola.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-com.handmark.expressweather.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-com.ironsource.appcloud.oobe.hutchison.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-com.motorola.gamemode.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-meta.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/default-permissions-sysdll.xml"
+ "${SYSTEM_DIR}/system/etc/default-permissions/pregranted-notification-permission-orange.xml"
+
+ # priv-app permissions
+ "${PRODUCT_DIR}/etc/permissions/privapp-permissions-com.motorola.help.xml"
+ "${PRODUCT_DIR}/etc/permissions/privapp-permissions-google-comms-suite.xml"
+ "${PRODUCT_DIR}/etc/permissions/split-permissions-google.xml"
+ "${PRODUCT_DIR}/etc/permissions/com.motorola.gamemode_cli_games.xml"
+ "${PRODUCT_DIR}/etc/permissions/com.motorola.gamemode.xml"
+ "${PRODUCT_DIR}/etc/permissions/com.motorola.help.xml"
+ "${PRODUCT_DIR}/etc/permissions/com.motorola.timeweatherwidget.xml"
+ # "${PRODUCT_DIR}/etc/permissions/feature-com.motorola.securevault.xml"
+ "${PRODUCT_DIR}/etc/permissions/permission_ignite_com.dti.motorola.xml"
+ "${PRODUCT_DIR}/etc/permissions/privapp-permissions-com.motorola.gamemode.xml"
+ "${PRODUCT_DIR}/etc/permissions/privapp-permissions-com.payjoy.access.xml"
+
+ "${SYSTEM_EXT_DIR}/etc/permissions/afw-com.motorola.livewallpaper.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/feature-com.motorola.securityhub.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.livewallpaper.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.installer.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.paks.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.motocare.xml"
+ # "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.securevault.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.securityhub.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.ccc.devicemanagement.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.ccc.notification.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.demo.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.launcher3.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/com.motorola.launcher3.delete.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/com.motorola.launcher3_feature.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/com.motorola.launcher3.swipe2stream.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/com.motorola.launcher3.twoline.xml"
+ "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-com.motorola.coresettingsext.xml"
+
+ "${SYSTEM_DIR}/system/etc/permissions/co.sitic.pp.powersave.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/feature-com.glance.lockscreenM.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/feature-com.taboola.ody.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/permission_ignite_com.motorola.genie.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/permission_SM_com.claroColombia.contenedor.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/permission_SM_com.telcel.contenedor.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.amazon.appmanager.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.android.providers.partnerbookmarks.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.ape.setupwizard.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.aura.oobe.motorola.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.glance.lockscreenM.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.ironsource.appcloud.oobe.hutchison.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.motorola.android.providers.chromehomepage.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.motorola.brapps.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.motorola.enterprise.adapter.service.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.motorola.enterprise.service.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-co.sitic.pp.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-meta.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-orange.xml"
+
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-orange.xml"
+
+ "${SYSTEM_DIR}/system/etc/permissions/com.motorola.enterpriseinternal.xml"
+ # "${SYSTEM_DIR}/system/etc/permissions/com.motorola.enterprise.xml"
+ # "${SYSTEM_DIR}/system/etc/permissions/com.motorola.motosignature.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/com.motorola.software.guideme.xml"
+ # "${SYSTEM_DIR}/system/etc/permissions/moto-core_services.xml"
+ # "${SYSTEM_DIR}/system/etc/permissions/moto-enterprise-internal.xml"
+ # "${SYSTEM_DIR}/system/etc/permissions/moto-enterprise.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.motorola.motoota.xml"
+ "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-com.motorola.spaces.xml"
+)
+
+xml_remove_app_permission() {
+ local pkg=$1
+ local dst_file=$2
+
+ echo -e "\t[-] App permission: ${pkg}"
+ xml ed -L -d "/exceptions/exception [@package='${pkg}']" "${dst_file}"
+}
+
+xml_remove_privapp_permission() {
+ local pkg=$1
+ local dst_file=$2
+
+ echo -e "\t[-] Privapp permission: ${pkg}"
+ xml ed -L -d "/permissions/privapp-permissions [@package='${pkg}']" "${dst_file}"
+}
+
+echo "[i] Removing Google App permissions..."
+for pkg in "${REMOVE_GOOGLE_APP_PERMISSIONS[@]}"; do
+ xml_remove_app_permission "${pkg}" "${PRODUCT_DIR}/etc/default-permissions/default-permissions-google.xml"
+done
+
+echo "[i] Removing Google Priv-App permissions..."
+for pkg in "${REMOVE_GOOGLE_PRIVAPP_PERMISSIONS[@]}"; do
+ xml_remove_privapp_permission "${pkg}" "${PRODUCT_DIR}/etc/permissions/privapp-permissions-google-product.xml"
+done
+
+echo "[i] Removing config permissions..."
+for config in "${REMOVE_CONFIG_PERMISSIONS[@]}"; do
+ echo -e "\t[-] ${config}"
+ rm -rf "$config"
+done
+
+xml_remove_privapp_permission "com.google.android.apps.setupwizard.searchselector" "${SYSTEM_DIR}/system/etc/permissions/privapp-permissions-google-system.xml"
+xml_remove_privapp_permission "com.google.android.gsf" "${SYSTEM_EXT_DIR}/etc/permissions/privapp-permissions-google-system_ext.xml"
+xml_remove_privapp_permission "com.google.android.apps.searchlite" "${PRODUCT_DIR}/etc/permissions/privapp-permissions-google-product.xml"
diff --git a/scripts/props.sh b/scripts/props.sh
new file mode 100755
index 0000000..fd1bd0c
--- /dev/null
+++ b/scripts/props.sh
@@ -0,0 +1,115 @@
+#!/bin/bash
+
+if [ "$#" -ne 1 ]; then
+ echo "[x] Incorrect arguments!"
+ echo " Using: $0 <BASE_DIR>"
+ exit 1
+fi
+
+source .config
+
+BASE_DIR=$1
+BUILD_PROP="${BASE_DIR}/system_a/system/build.prop"
+
+ADD_PROP_LIST=(
+ "persist.camera.HAL3.enabled=1"
+
+ "debug.hwui.render_dirty_regions=false"
+ "debug.sf.skip_dirty_regions=1"
+ "debug.sf.nobootanimation=1"
+ "ro.max.fling_velocity=18000"
+ "ro.min.fling_velocity=12000"
+ "debug.sf.hw=1"
+
+ "ro.telephony.call_ring.delay=0"
+ "ro.media.enc.jpeg.quality=100"
+ "ro.audio.silent=0"
+
+ # Skip SetupWizard (required without GAPPS)
+ "ro.setupwizard.enable_bypass=1"
+ "ro.setupwizard.enterprise_mode=0"
+ "ro.setupwizard.mode=DISABLED"
+ "ro.setupwizard.network_required=false"
+ "ro.setupwizard.wifi_required=false"
+)
+
+EDIT_PROP_LIST=(
+ "persist.sys.zram_wb_enabled=false"
+ "persist.sys.zram_wb_ai_enabled=false"
+ "ro.zygote.preload.enable=1"
+ "ro.moto.general.feature.ota=false"
+ "ro.moto.general.clientid=false"
+ "ro.moto.general.motosecure=false"
+ "ro.moto.general.motofeedback=false"
+ "ro.moto.general.motohelp=false"
+ "ro.moto.general.time_weather=false"
+ "ro.moto.general.feature.ironsource=false"
+)
+
+append_prop() {
+ if ! grep -q "${1}" "$BUILD_PROP"; then
+ echo -e "\t[+] Adding prop '${1}' to '${2}'"
+ sed -i "$ a ${1}" "$BUILD_PROP"
+ else
+ echo -e "\t[i] Prop '${1}' is already present in '${2}'"
+ fi
+}
+
+remove_prop() {
+ if grep -q "^${1}" "${2}"; then
+ echo -e "\t[-] Removing prop '${1}' from '${2}'"
+ sed -i "/^${1}/d" "${2}"
+ else
+ echo -e "\t[i] Prop '${1}' is not present in '${2}'"
+ fi
+}
+
+edit_prop() {
+ prop_name="${1%%=*}"
+ new_value="${1#*=}"
+ if grep -q "${prop_name}=" "${2}"; then
+ current_value=$(grep "^${prop_name}=" "${2}" | cut -d'=' -f2)
+ if [ "$current_value" != "$new_value" ]; then
+ echo "[=] Editing prop '${prop_name}' in '${2}'"
+ sed -i "s/${prop_name}=.*/${prop_name}=${new_value}/" "${2}"
+ else
+ echo "[*] Prop '${prop_name}' already has the desired value (${new_value}) in '${2}'"
+ fi
+ else
+ echo "[i] Prop '${prop_name}' is not present in '${2}'"
+ fi
+}
+
+
+if [[ $ENABLE_INSECURE_ADB == 1 ]]; then
+ ADD_PROP_LIST+=(
+ "persist.adb.notify=0"
+ "persist.service.adb.enable=1"
+ "persist.service.debuggable=1"
+ "persist.sys.usb.config=mtp,adb"
+ "ro.adb.secure=0"
+ "ro.debuggable=1"
+ "ro.force.debuggable=1"
+ "ro.control_privapp_permissions=log"
+ )
+fi
+
+if [[ $DISABLE_MOTO_HELLO_UI == 1 ]]; then
+ EDIT_PROP_LIST+=("ro.moto.general.feature.enable_systemui_hello_ui=false")
+else
+ if [[ $DISABLE_MOTO_HELLO_UI_BLUR == 1 ]]; then
+ ADD_PROP_LIST+=(
+ "ro.sf.blurs_are_expensive=1"
+ "ro.surface_flinger.supports_background_blur=0"
+ "persist.sysui.disableBlur=true"
+ )
+ fi
+fi
+
+for prop in "${EDIT_PROP_LIST[@]}"; do
+ edit_prop "$prop" "${BUILD_PROP}"
+done
+
+for prop in "${ADD_PROP_LIST[@]}"; do
+ append_prop "$prop" "${BUILD_PROP}"
+done