Android-Tablets per ADB klonen/verwalten

Hallo zusammen,

hat jemand Erfahrung mit dem Klonen von Tablets mittels Android Debug Bridge (adb)?

Die Situation:
Wir haben einen Klassensatz Tablets angeschafft. Da unsere Schule nur 6 Klassen hat, war die Idee, jedem Tablet eine Nummer (gleich Schülernummer) zu vergeben und für jede Klasse einen Standardbenutzer einzurichten. So hat jeder Schüler lokal sein eigenes Profil. Mit eingeschränkten Nutzerprofilen kann kein Google-Konto eingerichtet werden. Die Apps werden vom hauseigenen F-Droid App-Store bezogen.

Das Problem:
Wenn ich nun ein Mustertablet mit diesen 6 Benutzern (mit Klassennamen) einrichte und mittels adb versuche zu klonen, so sind auf den geklonten Tablets zwar die WLAN-Schlüssel hinterlegt, aber keine Benutzer vorhanden, außerdem ist das Profil des Hauptbenutzers (mit ID 0) nicht identisch mit dem Original. Der verwendete adb Befehl ist:

adb backup "-apk -shared -all -system -f backup.ab"

Und entsprechend adb restore .

Ohne Anführungszeichen macht der backup-Befehl gar nichts. Mein Betriebssystem ist Ubuntu 16.04.3 und ich habe android-tools-adb als Paket auf dem Rechner installiert.

Wie macht ihr das?

Viele Grüße

Christian

Hej Christian,

Ich benutze adb für das accounting auf Android Tablets. Aber adb backup habe ich dafür noch nicht ausprobiert. Ein Backup so zu erstellen und zurückzuspielen dauert vermutlich ziemlich lang.

Ich habe einen Verleihwagen Tablets und benutze adb um Benutzer zu löschen und neu anzulegen. Mein Besitzeraccount ist passwort-geschützt, adb-debugging ist eingeschaltet. Die Schüler arbeiten unter dem Gäste-Account und (derzeit noch) unter “normalen” Benutzeraccounts. Die werden angelegt mit:

adb shell pm create-user Schueler1

Vielleicht reicht das ja schon für dein Szenario…? Der PlayStore ist für die Schüler dadurch nicht unerreichbar. Aber es ist kein Account eingetragen. Unsere Nutzungsordnung untersagt das Benutzen von Google Play. Da die SuS die Geräte nur während dem Unterricht nutzen, reicht mir das…

Für meinen Verleihwagen sind die normalen Benutzer ein wenig unhandlich, weil die SuS beim erstmaligen Benutzen den Einrichtungsassistent durchlaufen müssen. Deshalb will ich eigentlich weg vom Normalbenutzer…

Hübsch ist: Es ist zwar nirgendwo dokumentiert, aber create-user funktioniert auch für eingeschränkte Benutzer und den Gastaccount

adb shell pm create-user --guest Gast
adb shell pm create-user --restricted  EingeschraenkterBenutzer

Den eingeschränkten Benutzer kann man im Prinzip weiter konfigurieren, indem man ihm Zugriff auf (ausgewählte / alle) 3rd-party-apps erlaubt.
Der Befehl

abd shell pm list packages -3 	

listet diese auf und

adb shell pm enable --user <user-id> package.name

sollte eigentlich den Benutzer berechtigen, eine App zu benutzen…
Eigentlich… Denn für den letzten Befehl werden root-Rechte benötigt. Zum Rooten konnte ich mich noch nicht durchringen. Bin mir noch nicht klar, welche Sicherheitsprobleme ich mir dadurch einhandle .:thinking:

Das letzte ist also bisher Zukunftsmusik :frowning_face:
Wenn man sich aber zum Rooten durchringt, hätte man tolle Möglichkeiten. Man könnte das Zurücksetzen des Tablets recht zügig erledigen, weil man nur den Befehl vom Rechner abschicken muss. Der Rest passiert auf dem Gerät.
Oder für mein Szenario: Man setzt die Geräte beim Reboot zurück - Über Termux Boot sollte das eigentlich gehen…

Viele Grüße
Michael

Hallo zusammen.
Interessante Diskussion!

Ich frage mich, ob man mit den adb-Befehlen ein halbwegs gescheites MDM realisieren kann oder ob das letztlich Hackerei bleibt bzw nicht zufriedenstellend klappt?

Für den praktischen Einsatz wäre es gut, wenn man auf den Schüler-Tablets per remote-Befehl z.B.
die Kamera deaktieren könnte oder aber nur eine einzige App erlauben kann. Geht auch so etwas via adb? Es ist nicht für diesen Zweck gemacht … aber wer weiß…

Und wo wir schon wieder beim Thema MDM angekommen sind: Hat jemand mal diese freien Programme ausprobiert?

Schöne Grüße,
Michael

Hallo Michael und Michael,

eingeschränkte Benutzer anlegen klappt schonmal mit
adb shell pm create-user --restricted EingeschraenkterBenutzer

Aber für diese Benutzer erscheint dann kein F-Droid App-Store. Das ist wirklich blöd. Meine Idee war ja, dass die Schüler schnell noch nachinstallieren können, was fehlt.

Im Prinzip sind die Möglichkeiten von adb gut. Man kann Benutzer anlegen, Programmpakete installieren, Profile von Benutzern kopieren, Backups erstellen … aber nur im Prinzip. Das Backup hätte mir gereicht, aber da werden bei mir nur die apk-Dateien und die WLAN-Schlüssel gesichert, das Restore auf einem anderen Tablet sieht komplett anders aus als das Original. Vielleicht ist es auch von Tablet zu Tablet unterschiedlich (Samsung Galaxy A 6 mit S Pen, Typ P580).

WSO2 iotserver habe ich aufgesetzt, aber da ich eine inkombatible Java-Version installiert hatte und es Probleme gab, erst einmal abgewartet. Vor ein paar Tagen kam aber die passende Java-Version, so dass ich nun damit weiter probieren kann.

Miradore Online hatte ich mal ausprobiert und auf Anhieb hat da die Installation von Apps geklappt, mal schauen, ob in der kostenlosen Version genug Funktionen drin sind.

Ich berichte weiter.

Das Hauptprofil mit dem eingerichteten F-Droid App-Store habe ich mit der Samsung Cloud synchronisiert.

VG Christian

Hej Christian,

Die eingeschränkten Benutzer lassen sich ja vom Besitzeraccount aus fine-tunen:
Du kannst für jeden eingeschränkten Nutzer einstellen, welche Apps er benutzen darf - Das geht unter Android 7 über Einstellungen > Cloud und Konten > Benutzer.

Soweit der manuelle Weg… Das geht eigentlich auch über adb, wie oben beschrieben. Dummerweise halt nur mit root-Berechtigung. :cry:

Das ist das Dilemma: Entweder rooten oder aufwändig händisch rangehen.

Viele Apps muss man IMHO den Schülern nicht bereitstellen. Neben den Systemapps wären das hauptsächlich F-Droid und ein QR-Scanner um das F-Droid-Repo einfach einzubinden…

Bin gespannt auf deine Tests - auch mit den freien MDMs… Da kenne ich mich nur mäßig aus.
Grüße
Michael

Hallo,

was passiert denn, wenn Du mit
adb root
die ADB mit root-Rechten neu startest ?

Gruß Christoph G.

Hej Christoph, danke für die Idee,
funktioniert leider auch nicht: adbd cannot run as root in production builds
Wenn ich es richtig verstehe, will der adb daemon auf dem Tablet nicht als root arbeiten.
Die Lösung wäre, ihn durch einen adbd zu ersetzen, der das kann. Und das - tada - geht nur auf einem gerooteten Gerät.

Oder verstehe ich das falsch.
Grüße
Michael

Um die Apps auch bei anderen Usern verfügbar zu machen, probier mal

adb shell pm install -r --user $USERID $(adb shell pm path org.fdroid.fdroid |grep -o "/.*")

Ausprobiert habe ich das jetzt an meinem Smartphone (Moto G 2014 mit Lineage OS 15.1, root nur für adb).
Mit dieser Zeile wird FDroid auch bei einem anderen Benutzer (restricted) sichtbar. Das ist schon mal gut. Aber die Einstellungen von FDroid könnten von mir aus auch gerne noch übernommen werden :wink: dann müsste ich unser FDroid Repo im orangen Netz nicht von Hand eingeben.
Was macht der Befehl denn nun anders als der vorherige? Ich möchte gerne verstehen, was hier passiert. Was bedeutet die Option -r?
VG Christian

Hallo Christian!

Was bedeutet die Option -r?

Gefunden auf:

https://developer.android.com/studio/command-line/adb.html

install [options] package Push packages to the device and install them. Possible options are the following:

  • -l: Forward lock app.
  • -r: Replace the existing app.
  • -t: Allow test packages. If the APK is built using a developer preview SDK (if the targetSdkVersion is a letter instead of a number), you must include the -t option with the install command if you are installing a test APK. For more information see -t option.

Beste Grüße

Thorsten

-r bedeutet reinstall, das heißt: wenn die apk schon auf dem Tablet liegt (hier: im Kontext des Besitzeraccounts installiert ist) , wird sie auch unter den Benutzeraccounts installiert. Schöner Nebeneffekt…
So mache ich das, wenn ich normale Benutzeraccounts mit den Standard-Apps versehen will.

Ein erster Test für einen eingeschränkten Benutzer mit meinem Samsung Stock ROM auf dem alten Tab A (SM-P550) mit Android 7.1.1 führte leider nicht zum Erfolg.

Der reinstall meldet zwar success, aber die App ist trotzdem nicht zu sehen. Ich befürchte man kommt um pm enable bei eingeschränkten Benutzer nicht herum. Ich teste aber weiter.

Das ist mir bisher nicht gelungen, ist aber IMHO auch nicht unbedingt nötig. Wir haben den QR-Code des Repos (wie ihn F-Droid ausspuckt, mit Fingerprint etc.) ausgedruckt auf dem Tabletwagen kleben. Den muss man nur mit einem QR-Code-Reader lesen und mit F-Droid öffnen. Works for me.

rm fdroid
until $(sqlite3 fdroid "select _id from fdroid_repo;" 1>/dev/null); do
  adb shell ls /data/user/$USERID/org.fdroid.fdroid/databases/fdroid && adb pull /data/user/$USERID/org.fdroid.fdroid/databases/fdroid
  sleep 1
done
adb shell am force-stop org.fdroid.fdroid
push_and_assign_dir_owner /data/user/$USERID/org.fdroid.fdroid/shared_prefs/org.fdroid.fdroid_preferences.xml
cat fdroid.sql | sqlite3 fdroid || true
push_and_assign_dir_owner /data/user/$USERID/org.fdroid.fdroid/databases/fdroid
adb shell am startservice org.fdroid.fdroid/.UpdateService

so kannst du automatisch die fdroid repos konfigurieren

1 „Gefällt mir“

ah, du brauchst noch:

function push_and_assign_dir_owner {
  _push_and_assign_dir_owner $(basename "$1") "$1"
}

function _push_and_assign_dir_owner {
  adb push "$1" "$2"
  copy_permissions "$(dirname "$2")" "$2"
  adb shell chmod o-rw $2
}

function copy_permissions {
  adb shell chown $(adb shell ls -ld "$1" | awk 'NR==1 {print $3}'):$(adb shell ls -ld "$1" | awk 'NR==1 {print $4}') "$2"
  adb shell chcon "$(adb shell ls -ldZ "$1" | awk 'NR==1 {print $5}')" "$2"
  adb shell chmod o-rw "$2"
}

Ja, Mensch, Yannik,
Du machst da ja interessante Dinge…
Welche Geräte verwaltest Du mit den Skripten?

Grüße
Michael

Hi Michael,
ich verwalte damit Redmi Note 4 mit LineageOS. Komplett ohne Google Dienste und mit mehreren Benutzerkonten pro Gerät.

Ich habe die gesamte Einrichtung per adb automatisiert.

Bei MDM muss man bedenken, dass die meisten Funktionen nur mit Android for Work (setzt Google Dienste voraus) funktionieren. Ich sehe jedoch nicht ein, Google Dienste zu installieren und die Nutzer damit überwachen zu lassen, wenn diese noch nicht mal gebraucht werden, da apps über F-Droid und playmaker zur Verfügung gestellt werden.

Hallo Yannik und alle anderen,

vielen Dank für deine Skripte. Sie funktionieren bei mir leider nicht. Ich vermute, es liegt am fehlenden “root”. Ich habe (noch) nicht vor, in der Garantiezeit die Geräte zu rooten oder ein Recovery (TWRP) aufzuspielen, obwohl das natürlich alles erleichtern würde.

Im Moment halte ich mal folgendes fest:

Was mit adb an den Samsung Galaxy A6 mit S Pen (sm-p580) funktioniert:

  • Pakete (aus apk) installieren
  • Benutzer (vollwertige und auch eingeschränkte) anlegen
  • diesen Benutzern bereits installierte Pakete freischalten
  • im Falle des FDroid-Paketes (vermutlich, weil ein Konto angelegt wird) eine Installation für jeden einzelnen Benutzer durchführen
  • für den Hauptbenutzer die Einstellungen des FDroid-Paketes (eigentlich nur die Paketquellen) mittels adb restore aufspielen

Was mir noch fehlt

  • die Einstellungen des FDroid-Paketes auch auf eingeschränkte Profile (Benutzer) übertragen

Aber das wäre auch eine schöne Aufgabe für meine Schüler. Vielleicht müsste ich mal einen Tabletdienst (wie Tafeldienst) einführen, der das dann macht.

Danke mal so weit für die Hilfe.
Im nächsten Schritt will ich aber noch vertiefen, was mit WSO2 iotserver alles möglich ist.

VG Christian

Hallo zusammen,

OT: @Yannik eine Frage zu playmaker, da ich kürzlich darüber gestolpert bin und das auch mal testen möchte.

Hast du dort dann einen Google-Account hinterlegt, der Apps aus dem Playstore herunerlädt und dir dann als f-droid Repo bereitstellt?

Da ich privat auf meinem Telefon auch keine gapps installiert habe, wollte ich fragen wie deine Erfahrungen sind. Da ja einige Apps aus dem Playstore ohne Googledienste nicht funktionieren. Ich denke z.B. an die car2go App oder die Moovel App.

Beste Grüße

Christoph

Ich würde sagen, dass maximal 20% der Apps nicht gehen ohne google Play. Hält sich also im Rahmen. Wenn du dennoch solche Apps benutzen willst: mit microg (https://lineage.microg.org/) geht auch das.

1 „Gefällt mir“

Tatsächlich verzichte ich dann bewusst auf diese Apps. Bzw. aktuell auf alle Apps aus dem Playstore. Muss sagen, dass ich schon mehrere Jahre so meine mobile devices kaufe:

  1. läuft CM bzw. jetzt lineage drauf und dann wird als aller erstes der Bootloader aufgemacht und auf ein ordentliches OS migriert :wink:

MicroG ist dennoch sehr spannend. Hatte es auch mal gehört aber nie Nähers damit befasst. Habe mir jetzt mal die Seite durchgelesen. Danke für’s darauf schubsen.
Mal schauen ob ich mein Device in nächster Zeit migriere. Mir war nicht bewusst, dass man einige Dinge wie Geolocation via GSM/WLAN auch ohne Google-Dienste nutzen kann (entweder mit lokaler Datenbank oder Mozilla) - großartig! :smiley:

Man kann sogar ganz ohne Datenverlust zu MicroG-LineageOS wechseln:

I am running a custom build of LineageOS, but yours is way cooler! How can I migrate to it without losing my data?
Replace the LineageOS official keys in our migration ZIP with your keys (or follow the suggestions in the LineageOS migration guide).

Folgendes nutze ich übrigens zur Konfiguration von Firefox (DuckDuckGo als Suchmaschine u.ä.):

# start once to create pref files and dismiss data submission notification
_push_and_assign_dir_owner GeckoApp.xml.defaults /data/user/$USERID/org.mozilla.firefox/shared_prefs/GeckoApp.xml
adb shell am start org.mozilla.firefox
while [ ! $(adb shell "ls /data/user/$USERID/org.mozilla.firefox/files/mozilla/*.default/search.json.mozlz4" 2> /dev/null) ]; do
  sleep 1
done
adb shell am force-stop org.mozilla.firefox
moz_profile_dir=$(adb shell "realpath /data/user/$USERID/org.mozilla.firefox/files/mozilla/*.default")
adb pull $moz_profile_dir/search.json.mozlz4
python3 mozlz4a.py -d search.json.mozlz4 search.json
jq '.metaData.current = "DuckDuckGo"' search.json > search.json.new
python3 mozlz4a.py search.json.new search.json.mozlz4
push_and_assign_dir_owner $moz_profile_dir/search.json.mozlz4
adb shell pm grant --user $USERID org.mozilla.firefox android.permission.ACCESS_FINE_LOCATION

Was die Einrichtung von F-Droid angeht: Mit am start <activity>, adb shell input text u.ä. lässt sich sowas auch sehr stark automatisieren. Mit adb shell input tap x y, monkeyrunner (monkeyrunner  |  Android Studio  |  Android Developers) u.ä. sogar vollständig ohne user interaction.