Ich versuche, apk stillschweigend im System zu installieren. Meine App befindet sich in / system / app und hat erfolgreich die Berechtigung "android.permission.INSTALL_PACKAGES" erhalten.
Ich kann jedoch nirgendwo finden, wie ich diese Berechtigung verwenden kann. Ich habe versucht, Dateien nach / data / app zu kopieren und hatte keinen Erfolg. Ich habe auch versucht, diesen Code zu verwenden
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(
Uri.parse("file:///sdcard/app.apk"),
"application/vnd.android.package-archive");
startActivity(intent);
Dieser Code öffnet jedoch den Standardinstallationsdialog. Wie kann ich App ohne Root mit gewährtem Hintergrund still installieren android.permission.INSTALL_PACKAGES
?
PS Ich schreibe eine App, die beim ersten Start viele Apks aus dem Ordner auf dem System installiert (Setup-Assistent ersetzen). Ich brauche es, um die Firmware leichter zu machen.
Wenn Sie denken, dass ich einen Virus schreibe: Alle Programme sind in / data / app installiert. Berechtigung Install_packages kann nur Programmen auf Systemebene erteilt werden, die sich in / system / app befinden oder mit dem Systemschlüssel signiert sind. Viren können also nicht dorthin gelangen.
Wie bereits erwähnt, können Apps unter http://www.mail-archive.com/[email protected]/msg06281.html unbeaufsichtigt installiert werden, wenn sie über die Berechtigung install_packages verfügen. Darüber hinaus benötigen Sie keine Install_packages-Berechtigung, um Pakete nicht unbeaufsichtigt zu installieren. Plus http://www.androidzoom.com/android_applications/tools/silent-installer_wgqi.html
Antworten:
Ihre erste Wette besteht darin, sich den nativen PackageInstaller von Android anzusehen . Ich würde empfehlen, diese App nach Ihren Wünschen zu ändern oder einfach die erforderlichen Funktionen zu extrahieren.
Insbesondere, wenn Sie sich PackageInstallerActivity und seine Methode ansehen
onClickListener
:Dann werden Sie feststellen, dass sich das eigentliche Installationsprogramm in der InstallAppProgress- Klasse befindet. Wenn Sie diese Klasse untersuchen, werden Sie feststellen, dass dies
initView
die Kernfunktion des Installationsprogramms ist, und als letztes wird sie aufgerufenPackageManager
‚sinstallPackage
Funktion:Der nächste Schritt besteht darin, PackageManager zu überprüfen , eine abstrakte Klasse. Dort finden Sie
installPackage(...)
Funktion. Die schlechte Nachricht ist, dass es mit @hide markiert ist. Dies bedeutet, dass es nicht direkt verfügbar ist (Sie können mit dem Aufruf dieser Methode nicht kompilieren).Sie können jedoch über Reflexion auf diese Methoden zugreifen.
Wenn Sie in , wie interessiert
PackageManager
‚sinstallPackage
Funktion implementiert wird, schauen Sie sich PackageManagerService an .Zusammenfassung
Sie müssen das Paketmanager-Objekt über
Context
's abrufengetPackageManager()
. Dann rufen Sie dieinstallPackage
Funktion über Reflexion auf.quelle
LogCat
berechtigungsbezogene Protokolle.Ich habe überprüft, wie ADB Apps installiert.
- Es kopiert die APK nach / data / local / tmp.
- Es wird 'shell: pm install /data/local/tmp/app.apk' ausgeführt.
Ich habe versucht, dieses Verhalten zu replizieren, indem ich Folgendes getan habe: (auf einem PC mit USB-Kabel)
adb push app.apk /sdcard/app.apk
adb shell
$ pm install /sdcard/app.apk
Dies funktioniert. Die App ist installiert.
Ich habe eine Anwendung (mit dem Namen AppInstall) erstellt, die die andere App installieren soll.
(normal installiertes, nicht gerootetes Gerät)
Es tut:
Runtime.getRuntime().exec("pm install /sdcard/app.apk").waitFor();
Aber dies gibt den Fehler:
java.lang.SecurityException: Neither user 10019 nor current process has android.permission.INSTALL_PACKAGES.
Es scheint, als würde der Fehler von pm und nicht von AppInstall ausgelöst.
Weil die SecurityException nicht von AppInstall abgefangen wird und die App nicht abstürzt.
Ich habe dasselbe auf einem gerooteten Gerät (gleiche App und AppInstall) versucht und es hat wie ein Zauber funktioniert.
(Auch normalerweise installiert, nicht in / system oder so)
AppInstall hat nicht einmal nach der Root-Erlaubnis gefragt.
Aber das liegt daran, dass sich die Shell immer
#
statt$
auf diesem Gerät befindet.Übrigens, Sie benötigen root, um eine App in / system zu installieren, richtig?
Ich habe versucht, adb remount auf dem nicht gerooteten Gerät durchzuführen und habe Folgendes erhalten:
remount failed: Operation not permitted.
Deshalb konnte ich das / system-Ding auf dem nicht nicht ausprobieren.
Fazit: Sie sollten ein gerootetes Gerät verwenden
Hoffe das hilft :)
quelle
su
)Ich habe kürzlich die Installation ohne Zustimmung des Benutzers implementiert - es war eine Kiosk-Anwendung für API Level 21+, bei der ich die volle Kontrolle über die Umgebung hatte.
Die Grundvoraussetzungen sind
Die folgende Methode liest und installiert APK aus InputStream:
Der folgende Code ruft die Installation auf
Damit das Ganze funktioniert, benötigen Sie dringend eine
INSTALL_PACKAGES
Erlaubnis, sonst schlägt der obige Code stillschweigend fehlUm diese Berechtigung zu erhalten, müssen Sie Ihre APK als Systemanwendung installieren, für die root erforderlich ist ( nachdem Sie jedoch Ihre Updater-Anwendung installiert haben, scheint sie OHNE root zu funktionieren).
Zur Installation als Systemanwendung habe ich ein signiertes APK erstellt und mit gepusht
und dann verschoben nach
system/priv-app
- was das erneute Mounten von FS erfordert (aus diesem Grund ist der Root erforderlich)Aus irgendeinem Grund funktionierte es nicht mit der einfachen Debug-Version, aber logcat zeigt nützliche Informationen an, wenn Ihre Anwendung in
priv-app
aus irgendeinem Grund nicht abgeholt wird.quelle
Sie sollten definieren
Wenn Sie sich in Ihrem Manifest in einer Systempartition (/ system / app) befinden oder Ihre Anwendung vom Hersteller signiert haben, verfügen Sie über die Berechtigung INSTALL_PACKAGES.
Mein Vorschlag ist, ein kleines Android-Projekt mit einer Kompatibilitätsstufe von 1,5 zu erstellen, mit dem installPackages über Reflection aufgerufen und ein JAR mit Methoden zum Installieren von Paketen und zum Aufrufen der realen Methoden exportiert wird. Durch Importieren des JARs in Ihr Projekt können Sie dann Pakete installieren.
quelle
Ich habe gerootetes Android 4.2.2 ausprobiert und diese Methode funktioniert für mich:
quelle
Ich hatte keine Ahnung, wie ich das machen sollte, weil diesmal niemand antwortete und ich keine Dokumentation über diese Erlaubnis fand. Also habe ich meine eigene Lösung gefunden. Es ist schlimmer als deins, aber dies ist trotzdem eine Lösung.
Ich habe eine Busybox installiert, die die 777-Berechtigung auf / data / app gesetzt hat (die Sicherheit ist mir egal). Dann einfach "Busybox Install" von der App ausgeführt. Dies funktioniert, hat aber ein großes Sicherheitsleck. Wenn Sie die Berechtigungen 777 festlegen, ist kein Root erforderlich.
quelle
Process install; install = Runtime.getRuntime().exec("/system/bin/busybox install " + myAPK.getAbsolutePath()); int iSuccess = install.waitFor();
Sie können die versteckte API
android.content.pm.IPackageInstallObserver
durch Reflektion verwenden:android.content.pm.IPackageInstallObserver
In Ihr Projekt importieren . Ihre App muss ein System sein. Sie müssen die Berechtigungandroid.permission.INSTALL_PACKAGES
in Ihrer Manifestdatei aktivieren .quelle
Sie können einfach den Befehl adb install verwenden, um APK unbeaufsichtigt zu installieren / aktualisieren. Beispielcode ist unten
quelle
Voraussetzung:
Ihre APK muss vom System signiert werden, wie bereits erwähnt. Eine Möglichkeit, dies zu erreichen, besteht darin, das AOSP-Image selbst zu erstellen und den Quellcode zum Build hinzuzufügen.
Code:
Nach der Installation als System-App können Sie die APK-Methoden mithilfe der Paketmanager-Methoden wie folgt installieren und deinstallieren:
Installieren:
Deinstallieren:
Um einen Rückruf zu erhalten, sobald Ihr APK installiert / deinstalliert ist, können Sie Folgendes verwenden:
===> Getestet auf Android 8.1 und hat gut funktioniert.
quelle
Ich habe eine Test-App für unbeaufsichtigte Installationen mit der PackageManager.installPackage-Methode erstellt.
Ich erhalte die installPackage-Methode durch Reflektion und habe die android.content.pm.IPackageInstallObserver-Schnittstelle in meinem src-Ordner erstellt (da sie im android.content.pm-Paket versteckt ist).
Wenn ich installPackage ausführe, erhalte ich SecurityException mit der Angabe einer Zeichenfolge, dass meine App keine android.permission.INSTALL_PACKAGES hat, aber in AndroidManifest.xml definiert ist.
Ich denke, es ist nicht möglich, diese Methode zu verwenden.
PS. Ich habe in Android SDK 2.3 und 4.0 getestet. Vielleicht funktioniert es mit früheren Versionen.
quelle
Versuchen Sie dies
LD_LIBRARY_PATH=/vendor/lib:/system/lib
vor der Installation. Es funktioniert gut.quelle
Eine Drittanbieteranwendung kann eine Android-App nicht ohne weiteres installieren. Eine Drittanbieteranwendung kann jedoch das Android-Betriebssystem auffordern, eine Anwendung zu installieren.
Sie sollten dies also definieren:
Sie können auch versuchen, es als System-App zu installieren, um die Berechtigung zu erteilen und diese Definition zu ignorieren. (Root erforderlich)
Sie können den folgenden Befehl auf Ihrer Drittanbieter-App ausführen, um eine App auf dem gerooteten Gerät zu installieren.
Der Code lautet:
Ich hoffe, dass diese Antwort für Sie hilfreich ist.
quelle
Es ist möglich, eine stille Installation unter Android 6 und höher durchzuführen. Ignorieren Sie mit der in der Antwort von Boris Treukhov angegebenen Funktion alles andere im Beitrag. Root ist ebenfalls nicht erforderlich.
Installieren Sie Ihre App als Geräteadministrator. Sie können den vollständigen Kioskmodus mit der unbeaufsichtigten Installation von Updates im Hintergrund nutzen.
quelle
Ich habe alle Antworten überprüft. Die Schlussfolgerung scheint zu sein, dass Sie zuerst Root-Zugriff auf das Gerät haben müssen, damit es funktioniert.
Aber dann fand ich diese Artikel sehr nützlich. Da mache ich "firmeneigene" Geräte.
So aktualisieren Sie die Android App lautlos ohne Benutzerinteraktion
Android-Gerätebesitzer - Minimal App
Hier ist die Dokumentation von Google über "Managed Device".
Vollständig verwaltetes Gerät
quelle
! / bin / bash
Das funktioniert bei mir. Ich führe dies auf Ubuntu 12.04 auf dem Shell-Terminal aus.
quelle