#!/system/bin/sh # ===================================================================== # alexa-tablet-debloat.sh - Version 1.0 (2026-10-20) # Debloat-Skript fuer das Amazon Alexa Tablet 12 Pro (Alexa Tablet UI 16.1.10, Android 16) # https://minnallab.de/guides/alexa-tablet-12-pro-debloaten/ | Lizenz: MIT | Nutzung auf eigene Gefahr # # Das Skript laeuft direkt auf dem Tablet. Es funktioniert deshalb # gleich unter Windows, macOS und Linux. Benoetigt wird nur ADB, kein Root. # # Nutzung: # adb push alexa-tablet-debloat.sh /data/local/tmp/ # adb shell sh /data/local/tmp/alexa-tablet-debloat.sh --dry-run # adb shell sh /data/local/tmp/alexa-tablet-debloat.sh [Optionen] # # Ohne Optionen (sicher fuer jeden): # - Werbung, Empfehlungen, Demo-/Ladenmodus und SIM-Reste entfernen # - Amazon-Telemetrie deaktivieren # # Optionen (beliebig kombinierbar): # --amazon-apps Prime Video, Music, Audible, Kindle, Shopping, Photos, # Appstore, Silk, Luna, Amazon Kids # --alexa Alexa komplett entfernen und das Alexa-Symbol im # Fire-Launcher ausblenden (haelt nur bis zum Neustart) # --no-account kontogebundene Amazon-Funktionen (nur sinnvoll ohne # Amazon-Konto): Profile, Kaufschutz, Whispersync, # Universal Search # --google doppelte Google-Apps: Gmail, Drive, Fotos, Kalender, # Google TV, YouTube Kids/Music, Meet # --a11y Google-Bedienungshilfen (TalkBack, Schalterzugriff, # Voice Access) # --keyboard Fire-Tastatur deaktivieren (nur wenn eine andere # Tastatur aktiv ist) # --free-space Updates der entfernten Systemapps loeschen # (gibt Speicher unter /data frei) # --all = --amazon-apps --alexa --no-account --google # --dry-run nur anzeigen, nichts veraendern # --restore alles rueckgaengig machen # --force auch auf anderen Geraeten ausfuehren (nicht empfohlen) # # Nach jedem Systemupdate einfach erneut ausfuehren: Bereits entfernte # Pakete werden uebersprungen. # Der Fire-Launcher wird bewusst NICHT angefasst, weil ohne ihn die # Home-Geste nicht funktioniert. # ===================================================================== # ---------- Paketgruppen ---------- ADS="com.amazon.kindle.kso com.amazon.firespotlight com.amazon.hedwig com.amazon.dags.tableteducation com.amazon.wallpaper com.amazon.partnerbrowsercustomizations" DEMO="com.amazon.d3 com.amazon.cx_offline com.amazon.tablet.chameleon com.amazon.kindle.otter.oobe.forced.ota com.amazon.samplewifiapp com.amazon.csapp com.amazon.ods.kindleconnect" AOSP="com.android.egg com.android.traceur com.android.stk com.android.simappdialog" TELEMETRY="com.amazon.client.metrics com.amazon.metrics com.amazon.device.crashmanager com.amazon.device.logmanager com.amazon.diode com.amazon.vdropbox" AMAZON_APPS="com.amazon.avod com.amazon.mp3 com.audible.application.kindle com.amazon.kindle com.amazon.windowshop com.amazon.clouddrive.photos com.amazon.venezia com.amazon.cloud9 com.amazon.cloud9.kids com.amazon.spiderpork com.amazon.tahoe com.amazon.tahoe.grownups com.amazon.tahoe.platform com.amazon.fawkes" ALEXA="com.amazon.dee.app com.amazon.tablet.voiceassistant com.amazon.genai.edgeaiagent com.amazon.alexa.calendar.app" ACCOUNT="com.amazon.h2settingsfortablet com.amazon.tablet.junco com.amazon.device.sync.sdk.internal com.amazon.sharingservice.android.client.proxy com.amazon.tablet.voyager" GOOGLE="com.google.android.gm com.google.android.apps.docs com.google.android.apps.photos com.google.android.calendar com.google.android.videos com.google.android.apps.youtube.kids com.google.android.apps.youtube.music com.google.android.apps.tachyon com.google.android.gms.location.history com.google.android.feedback" A11Y="com.google.android.marvin.talkback com.google.android.accessibility.switchaccess com.google.android.apps.accessibility.voiceaccess" KEYBOARD="com.amazon.firekeyboard" LAUNCHER="com.amazon.firelauncher" EXPECTED_MODEL="ATSPWI" # ---------- Optionen ---------- DRY=0; FORCE=0; RESTORE=0 DO_APPS=0; DO_ALEXA=0; DO_ACCOUNT=0; DO_GOOGLE=0; DO_A11Y=0; DO_KB=0; DO_FREE=0 usage() { sed -n '2,43p' "$0" 2>/dev/null | sed 's/^#//' } for a in "$@"; do case "$a" in --dry-run) DRY=1 ;; --amazon-apps) DO_APPS=1 ;; --alexa) DO_ALEXA=1 ;; --no-account) DO_ACCOUNT=1 ;; --google) DO_GOOGLE=1 ;; --a11y) DO_A11Y=1 ;; --keyboard) DO_KB=1 ;; --free-space) DO_FREE=1 ;; --all) DO_APPS=1; DO_ALEXA=1; DO_ACCOUNT=1; DO_GOOGLE=1 ;; --restore) RESTORE=1 ;; --force) FORCE=1 ;; -h|--help) usage; exit 0 ;; *) echo "Unbekannte Option: $a"; echo "Hilfe: sh $0 --help"; exit 1 ;; esac done # ---------- Hilfsfunktionen ---------- N_DONE=0; N_SKIP=0; N_FAIL=0 # has : steht "package:" exakt in der Liste? has() { printf '%s\n' "$1" | grep -qxF "package:$2"; } ok() { echo " [OK] $1"; N_DONE=$((N_DONE+1)); } skip() { echo " [--] $1"; N_SKIP=$((N_SKIP+1)); } fail() { echo " [FEHLER] $1"; N_FAIL=$((N_FAIL+1)); } dry() { echo " [TEST] $1"; N_DONE=$((N_DONE+1)); } refresh_lists() { INSTALLED=$(pm list packages --user "$U" 2>/dev/null) KNOWN=$(pm list packages -u --user "$U" 2>/dev/null) } remove_group() { # $1 = Ueberschrift, $2 = Paketliste echo ""; echo "== $1" for p in $2; do if ! has "$KNOWN" "$p"; then skip "$p (auf diesem Geraet nicht vorhanden)"; continue; fi if ! has "$INSTALLED" "$p"; then skip "$p (bereits entfernt)"; continue; fi if [ "$DRY" = 1 ]; then dry "$p wuerde entfernt"; continue; fi out=$(pm uninstall -k --user "$U" "$p" 2>&1) case "$out" in *Success*) ok "$p entfernt" ;; *) fail "$p: $out" ;; esac done } disable_group() { # $1 = Ueberschrift, $2 = Paketliste, $3 = Benutzer-IDs echo ""; echo "== $1" for u in $3; do dis=$(pm list packages -d --user "$u" 2>/dev/null) inst=$(pm list packages --user "$u" 2>/dev/null) for p in $2; do if ! has "$inst" "$p"; then skip "$p (Benutzer $u: nicht installiert)"; continue; fi if has "$dis" "$p"; then skip "$p (Benutzer $u: bereits deaktiviert)"; continue; fi if [ "$DRY" = 1 ]; then dry "$p wuerde fuer Benutzer $u deaktiviert"; continue; fi out=$(pm disable-user --user "$u" "$p" 2>&1) case "$out" in *disabled*) ok "$p deaktiviert (Benutzer $u)" ;; *) fail "$p (Benutzer $u): $out" ;; esac done done } # ---------- Vorabpruefungen ---------- U=$(am get-current-user 2>/dev/null | tr -dc '0-9') [ -z "$U" ] && U=0 MODEL=$(getprop ro.product.model) BUILD=$(getprop ro.build.display.id) echo "Alexa Tablet Debloat 1.0" echo "Geraet: $MODEL | Build: $BUILD | aktiver Benutzer: $U" [ "$DRY" = 1 ] && echo ">>> TESTLAUF (--dry-run): Es wird nichts veraendert." if [ "$MODEL" != "$EXPECTED_MODEL" ] && [ "$FORCE" != 1 ]; then echo "" echo "Abbruch: Das Skript ist fuer das Alexa Tablet 12 Pro ($EXPECTED_MODEL) gedacht." echo "Gefunden wurde '$MODEL'. Mit --force trotzdem ausfuehren (auf eigene Gefahr)." exit 1 fi # Bei Headless System User Mode (Benutzer 0 ohne Oberflaeche) Telemetrie # zusaetzlich fuer Benutzer 0 deaktivieren. USERS="$U" [ "$U" != 0 ] && USERS="$U 0" refresh_lists # ---------- Wiederherstellen ---------- if [ "$RESTORE" = 1 ]; then echo ""; echo "== Wiederherstellen (Benutzer $U)" for p in $ADS $DEMO $AOSP $AMAZON_APPS $ALEXA $ACCOUNT $GOOGLE $A11Y; do has "$KNOWN" "$p" || continue if has "$INSTALLED" "$p"; then continue; fi if [ "$DRY" = 1 ]; then dry "$p wuerde wiederhergestellt"; continue; fi out=$(cmd package install-existing --user "$U" "$p" 2>&1) case "$out" in *installed*|*Success*) ok "$p wiederhergestellt" ;; *) fail "$p: $out" ;; esac done echo ""; echo "== Deaktivierte Pakete wieder einschalten" for u in $USERS; do dis=$(pm list packages -d --user "$u" 2>/dev/null) for p in $TELEMETRY $KEYBOARD $LAUNCHER; do has "$dis" "$p" || continue if [ "$DRY" = 1 ]; then dry "$p wuerde fuer Benutzer $u aktiviert"; continue; fi out=$(pm enable --user "$u" "$p" 2>&1) case "$out" in *enabled*) ok "$p aktiviert (Benutzer $u)" ;; *) fail "$p (Benutzer $u): $out" ;; esac done done if [ "$(settings get --user "$U" secure alexa_app_in_foreground 2>/dev/null)" = "1" ]; then if [ "$DRY" = 1 ]; then dry "Alexa-Symbol wuerde wieder eingeblendet" else settings delete --user "$U" secure alexa_app_in_foreground >/dev/null 2>&1 am force-stop "$LAUNCHER" >/dev/null 2>&1 ok "Alexa-Symbol im Launcher wieder eingeblendet"; fi fi echo "" echo "Fertig: $N_DONE geaendert, $N_FAIL Fehler. Hinweis: Wiederhergestellte Apps" echo "haben ggf. die Werksversion und muessen ueber den Store aktualisiert werden." exit 0 fi # ---------- Debloat ---------- remove_group "Werbung und Empfehlungen" "$ADS" remove_group "Demo-, Einrichtungs- und Support-Pakete" "$DEMO" remove_group "Android-Reste (SIM-Toolkit, Tracing, Easter Egg)" "$AOSP" [ "$DO_APPS" = 1 ] && remove_group "Amazon-Apps" "$AMAZON_APPS" [ "$DO_ALEXA" = 1 ] && remove_group "Alexa" "$ALEXA" [ "$DO_ACCOUNT" = 1 ] && remove_group "Kontogebundene Amazon-Funktionen" "$ACCOUNT" [ "$DO_GOOGLE" = 1 ] && remove_group "Google-Apps" "$GOOGLE" [ "$DO_A11Y" = 1 ] && remove_group "Google-Bedienungshilfen" "$A11Y" disable_group "Amazon-Telemetrie deaktivieren" "$TELEMETRY" "$USERS" # Alexa-Symbol im Fire-Launcher: Der Launcher blendet es nur aus, solange # er glaubt, dass Alexa im Vordergrund ist (Secure-Setting alexa_app_in_foreground). if [ "$DO_ALEXA" = 1 ]; then echo ""; echo "== Alexa-Symbol im Fire-Launcher ausblenden" if [ "$(settings get --user "$U" secure alexa_app_in_foreground 2>/dev/null)" = "1" ]; then skip "bereits ausgeblendet" elif [ "$DRY" = 1 ]; then dry "alexa_app_in_foreground wuerde auf 1 gesetzt" else settings put --user "$U" secure alexa_app_in_foreground 1 am force-stop "$LAUNCHER" >/dev/null 2>&1 ok "Alexa-Symbol ausgeblendet" echo " Hinweis: Alexa Tablet UI setzt diesen Wert bei jedem Neustart zurueck." echo " Dauerhaft per MacroDroid: Neustart -> 60 s warten -> Wert setzen." fi fi # Fire-Tastatur nur deaktivieren, wenn sie nicht die aktive Tastatur ist. if [ "$DO_KB" = 1 ]; then ime=$(settings get --user "$U" secure default_input_method 2>/dev/null) case "$ime" in com.amazon.firekeyboard*|""|null) echo ""; echo "== Fire-Tastatur" fail "Die Fire-Tastatur ist noch aktiv. Erst eine andere Tastatur (z. B. Gboard) installieren und auswaehlen." ;; *) disable_group "Fire-Tastatur deaktivieren (aktiv: ${ime%%/*})" "$KEYBOARD" "$U" ;; esac fi # Updates der entfernten Systemapps loeschen (gibt Speicher unter /data frei). if [ "$DO_FREE" = 1 ]; then echo ""; echo "== Speicher freigeben (Updates entfernter Systemapps loeschen)" refresh_lists FPATHS=$(pm list packages -f -u --user "$U" 2>/dev/null) for p in $ADS $DEMO $AOSP $AMAZON_APPS $ALEXA $ACCOUNT $GOOGLE $A11Y; do has "$KNOWN" "$p" || continue has "$INSTALLED" "$p" && continue # nur bei entfernten Apps upd=0 for line in $(printf '%s\n' "$FPATHS" | grep -F "=$p"); do case "$line" in "package:/data/app/"*"=$p") upd=1 ;; esac done [ "$upd" = 1 ] || continue if [ "$DRY" = 1 ]; then dry "Update von $p wuerde geloescht"; continue; fi out=$(pm uninstall-system-updates "$p" 2>&1) case "$out" in *Success*) ok "Update von $p geloescht" ;; *) fail "$p: $out" ;; esac done fi echo "" echo "Fertig: $N_DONE geaendert, $N_SKIP uebersprungen, $N_FAIL Fehler." [ "$DRY" = 1 ] && echo "Das war ein Testlauf. Ohne --dry-run ausfuehren, um die Aenderungen anzuwenden." [ "$DRY" = 0 ] && [ "$N_DONE" -gt 0 ] && echo "Empfehlung: Tablet neu starten (adb reboot)." exit 0