Installer des applications en silence, avec accordées INSTALL_PACKAGES autorisation
Je suis en train d'installer silencieusement apk dans le système.
Mon application se trouve dans /system/app et avec succès la permission "d'android.la permission.INSTALL_PACKAGES"
Cependant je ne peux pas trouver n'importe où comment utiliser cette autorisation. J'ai essayé de copier des fichiers vers /data/app et n'avait pas de succès. Aussi j'ai essayé en utilisant ce code
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(
Uri.parse("file:///sdcard/app.apk"),
"application/vnd.android.package-archive");
startActivity(intent);
Mais ce code ouvre standard de la boîte de dialogue d'installation. Comment puis-je installer l'application en silence, sans racine avec accordées android.permission.INSTALL_PACKAGES
?
PS je suis en train d'écrire une application qui va installer de nombreux apk à partir du dossier dans le système lors du premier démarrage (remplacer Assistant de Configuration). J'ai besoin de faire du firmware plus léger.
Si vous pensez que je suis en train d'écrire un virus: Tous les programmes qui sont installés dans /data/app. L'autorisation Install_packages ne peut être accordée à niveau du système de programmes qui se trouvent dans /system/app ou signés avec la clé du système. Donc, le virus peut pas y arriver.
Comme l'a dit http://www.mail-archive.com/[email protected]/msg06281.html les applications PEUVENT être silencieux installé si ils ont install_packages autorisation. En outre, vous n'avez pas besoin Install_packages l'autorisation d'installer des paquets qui ne sont pas en silence. Plus http://www.androidzoom.com/android_applications/tools/silent-installer_wgqi.html
- édité poste principal
- Supposons qu'il s'est fait un dispositif tel que fabricant d'équipement d'origine?
- Qui s'en soucie? C'est une question valable, comme dascandy décrit. Il est généralement improductif quand les gens répondent à des questions du genre "Vous ne devriez pas faire cela". Quelle compréhension sommes-nous gagner avec ce genre de réponse?
- En parlant de improductives.. vous êtes un peu plus de 2 ans de retard pour cette partie de Zach, et la question semble très différent de ce qu'il a fait à l'origine.
- LOL. Aussi, je peux confirmer que c'est encore à travailler dans le nouveau système d'exploitation android.
- Comment FDroid accomplir cette mission? Ou n'est-il pas installer les choses en silence?
- Je viens d'installer le F-Droid appli: Ils n'installez pas les choses en silence, Ils ont juste invite le Android avais le Gestionnaire de Package.
Vous devez vous connecter pour publier un commentaire.
Votre premier pari est de se pencher sur Android natif PackageInstaller. Je recommande la modification de l'application comme vous le souhaitez, ou tout simplement extraire de la fonctionnalité.
Plus précisément, si vous regardez dans les PackageInstallerActivity et sa méthode
onClickListener
:Puis vous remarquerez que l'installation réelle est situé dans InstallAppProgress classe. L'inspection de cette catégorie, vous trouverez que
initView
est au cœur de l'installateur de la fonction, et la dernière chose qu'elle ne fait appel àPackageManager
'sinstallPackage
fonction:Prochaine étape consiste à inspecter PackageManager, qui est une classe abstraite. Vous trouverez
installPackage(...)
y fonctionner. La mauvaise nouvelle est qu'il est marqué par @cacher. Cela signifie qu'il n'est pas directement disponible (vous ne serez pas en mesure de compiler avec l'appel à cette méthode).Mais vous serez en mesure d'accéder à cette méthode par réflexion.
Si vous êtes intéressé par la façon dont
PackageManager
'sinstallPackage
fonction est implémentée, jetez un oeil à PackageManagerService.Résumé
Vous aurez besoin pour obtenir le gestionnaire de package de l'objet via
Context
'sgetPackageManager()
. Ensuite, vous appelezinstallPackage
fonction via la réflexion.LogCat
la permission logs.J'ai vérifié comment la BAD installe les applications.
- Copier le fichier APK dans /data/local/tmp
- il lance un " shell:pm installer /data/local/tmp/app.apk'
J'ai essayé de reproduire ce comportement en faisant: (sur pc, à l'aide d'un câble usb)
adb push app.apk /sdcard/app.apk
adb shell
$ pm install /sdcard/app.apk
Les travaux de cette. L'application est installée.
J'ai fait une demande (nommé AppInstall) qui doivent installer l'application d'autres.
(installé normalement, non-dispositif enracinée)
Il n':
Runtime.getRuntime().exec("pm install /sdcard/app.apk").waitFor();
Mais cela donne l'erreur:
java.lang.SecurityException: Neither user 10019 nor current process has android.permission.INSTALL_PACKAGES.
Il semble que l'erreur est levée par pm, pas par AppInstall.
Parce que le SecurityException n'est pas piégé par AppInstall et de l'application ne plante pas.
J'ai essayé la même chose sur un dispositif enracinée (même application et AppInstall) et cela a fonctionné comme un charme.
(Normalement installé, pas dans /system ou quoi que ce soit)
AppInstall n'ai même pas demander à la racine de l'autorisation.
Mais c'est parce que la coquille est toujours
#
au lieu de$
sur cet appareil.Btw, vous avez besoin de root pour installer une application dans /system, correct?
J'ai essayé adb remount sur la non-dispositif enracinée et a obtenu:
remount failed: Operation not permitted.
C'est pourquoi je ne pouvais pas essayer de le /système de chose sur la non-dispositif enracinée.
Conclusion: vous devez utiliser un dispositif enracinée
Espérons que cela aide 🙂
su
)J'ai été la mise en œuvre de l'installation sans le consentement de l'utilisateur récemment, il a été un kiosque application de l'API de niveau 21+ où j'ai eu le plein contrôle sur l'environnement.
Les exigences de base sont
La méthode suivante lit et installe l'APK de InputStream:
Le code suivant appelle l'installation
pour le tout pour travail vous avez désespérément besoin d'
INSTALL_PACKAGES
autorisation, ou le code ci-dessus échoue silencieusementpour obtenir cette autorisation, vous devez l'installer APK comme Système d'application qui NÉCESSITE racine (cependant, APRÈS que vous avez installé votre programme de mise à jour de l'application, il semble fonctionner SANS racine)
À installer dans le système de l'application, j'ai créé un signé APK et poussé avec
et ensuite déplacée à
system/priv-app
- ce qui nécessite de remonter FS (c'est pourquoi le root est requis)pour une raison quelconque, il ne fonctionne pas avec une simple version de débogage, mais logcat montre infos utiles si votre application dans
priv-app
n'est pas retenue pour une raison quelconque.Vous devez définir
dans votre manifeste, alors si vous êtes dans la partition système (/system/app) ou vous avez votre demande signée par le fabricant, vous allez avoir INSTALL_PACKAGES autorisation.
Ma suggestion est de créer un petit projet android avec 1,5 niveau de compatibilité utilisé pour appeler installPackages par la réflexion et à l'exportation d'un bocal avec des méthodes pour installer des paquets et d'appeler les méthodes réelles.
Ensuite, par l'importation du bocal dans votre projet, vous serez prêt à installer des paquets.
J'ai essayé sur enracinée Android 4.2.2 et cette méthode fonctionne pour moi:
Je n'avais aucune idée de comment le faire, parce que personne ne répondait à l'époque, et je n'ai trouvé aucune documentation sur cette autorisation. Donc j'ai trouvé ma solution. Il est worser que le vôtre, mais c'est une solution de toute façon.
J'ai installé busybox, l'ensemble autorisation 777 dans /data/app (je ne se soucient de la sécurité). Alors juste exécuté "busybox installer" à partir de l'app. Cela fonctionne, mais a une grosse faille de sécurité. Si vous définissez des autorisations 777, pas de racine nécessaire.
Process install; install = Runtime.getRuntime().exec("/system/bin/busybox install " + myAPK.getAbsolutePath()); int iSuccess = install.waitFor();
Vous pouvez utiliser le caché API
android.content.pm.IPackageInstallObserver
par la réflexion:Importation
android.content.pm.IPackageInstallObserver
dans votre projet. Votre application doit être du système. Vous devez activer l'autorisationandroid.permission.INSTALL_PACKAGES
dans votre fichier manifest.Vous pouvez simplement utiliser adb install pour installer/mettre à jour APK en silence. Exemple de code est ci-dessous
J'ai fait une application de test pour le silence s'installe, à l'aide de PackageManager.installationprogiciel méthode.
- Je obtenir installationprogiciel méthode par réflexion, et de fait android.contenu.pm.IPackageInstallObserver interface dans mon dossier src (car il est caché dans android.contenu.h package).
Quand je lance installationprogiciel, j'ai eu SecurityException avec de la ficelle indication, que mon application n'a pas android.la permission.INSTALL_PACKAGES, mais dans une AndroidManifest.xml.
Donc, je pense, il n'est pas possible d'utiliser cette méthode.
PS. Je l'ai testé sur du kit SDK d'Android 2.3 et 4.0. Peut-être qu'il va travailler avec les versions antérieures.
Essayer cette
LD_LIBRARY_PATH=/vendor/lib:/system/lib
avant de pm installer. Il fonctionne bien.Une application 3ème partie ne peut pas installer une Application Android sliently.
Toutefois, une application 3ème partie peut demander au système d'exploitation Android pour installer une application.
Donc, vous devez définir ce:
Vous pouvez également essayer de l'installer comme une application système d'octroi de l'autorisation et d'ignorer cette définir. (Root Requis)
Vous pouvez exécuter la commande suivante sur votre 3ème partie application à installer une application sur le dispositif enracinée.
Le code est:
J'espère que cette réponse est utile pour vous.
Préalable:
Votre APK doit être signé par le système comme l'a relevé plus haut. Un moyen d'y parvenir est la construction de l'AFST image de vous-même et en ajoutant le code source dans le build.
Code:
Une fois installé comme une application système, vous pouvez utiliser le gestionnaire de paquets méthodes pour installer et désinstaller une APK comme suit:
Installer:
Désinstaller:
D'avoir un rappel une fois votre APK est installé/désinstallé, vous pouvez utiliser ceci:
===> Testé sur Android 8.1 et bien travaillé.
C'est possible de faire une installation silencieuse sur Android 6 et au-dessus. À l'aide de la fonction fournie dans la réponse de Boris Treukhov, ignorer tout le reste du post, racine n'est pas nécessaire non plus.
Installer votre application en tant que périphérique admin, vous pouvez avoir plein le mode kiosque avec l'installation automatique des mises à jour en arrière-plan.
J'ai vérifié toutes les réponses, la conclusion semble être que vous devez avoir accès à la racine de l'appareil, d'abord pour le faire fonctionner.
Mais ensuite, j'ai trouvé ces articles très utiles. Depuis que je suis en train de faire "appartenant à la société" les appareils.
Comment mettre à Jour Android App en silence, Sans Interaction de l'Utilisateur
Android Le Propriétaire De L'Appareil - Un Minimum D'Application
Ici est google la documentation au sujet de "gestion de périphérique"
Entièrement périphérique géré
!/bin/bash
Cela fonctionne pour moi.
Je l'exécute sur ubuntu 12.04, la coque du terminal.