Comment puis-je vérifier si une application est un non-système application sur l'Android?
J'obtiens une liste de ApplicationInfo
Objets avec packageManager.getInstalledApplications(0) et de tenter de les classer selon qu'elles sont ou non un système d'application.
Pendant un moment j'ai été en utilisant la technique décrite ici, cependant après avoir vu que, dans mon application, certaines applications qui n'étaient pas dans le non-système liste des applications (telles que Facebook, qui lorsqu'elles sont disponibles demande au système de s'installer sur la carte SD). Après la lecture de la documentation disponible pour ApplicationInfo.FLAG_SYSTEM, et de la compréhension qu'il ne fait pas de système de filtrage des applications, je suis maintenant à la recherche d'une nouvelle approche.
Ma conjecture est qu'il y a un grand écart entre les Uides de Système et non au système des applications que je peux rassembler pour faire cette distinction, mais pour l'instant je n'ai pas trouvé de réponse. J'ai aussi regardé dans d'autres indicateurs, comme ApplicationInfo.FLAG_EXTERNAL_STORAGE
, cependant, je suis l'appui de l'API 1.5.
Quelqu'un a une vraie solution à ce (n'impliquant pas de FLAG_SYSTEM
)?
Vous devez vous connecter pour publier un commentaire.
FLAG_SYSTEM
ne fait pas de travail, donc ce n'est pas ce que je recherche.FLAG_SYSTEM
obtient tout simplement les applications qui sont installé dans le dispositif de l'image du système. Cela signifie qu'il n'obtiendra pas les applications installées sur la carte SD, etc. La meilleure façon d'obtenir tous applications est malheureusement de vérifier leur répertoire ("/data/apps").J'étais sous l'impression que toutes les applications dans le système de l'image du système apps (et normalement installé dans
/system/app
).Si
FLAG_SYSTEM
est défini uniquement pour les applications du système, cela fonctionne même pour les applications de stockage externe:Une alternative est d'utiliser le
pm
programme de ligne de commande dans votre téléphone.Syntaxe:
Code:
Alors:
Vous pouvez vérifier la signature de la demande qu'il a signée avec le système. Comme ci-dessous
Vous pouvez obtenir plus de code sur mon blog Comment faire pour vérifier si l'application système d'application ou non (En signature)
system/app
. Cette étape ne permet pas de rendre votre application en tant que système d'application (il y a trop d'API de votre application ne peut pas accéder, même si c'est dans le répertoire system). Pour cela, il doit être signé par le même certificat QUE VOUS faites, et l'emplacement doit être /system/app. Ne vous inquiétez pas au sujet de votre cas, vous faites de la bonne façon.Bien, c'est une solution bâclée à mon avis (si /data/app n'est pas le répertoire apps sur tous les appareils?), mais après une recherche approfondie, c'est ce que je suis venu avec:
/system/app/
ne signifie pas que, c'est le système d'application. Cela signifie que l'application est pré-chargé. Et pour l'application de mise à jour de doute, je peux deviner qu'ils ont écrit cette logique de garderfactory-reset
à l'esprit. Si l'application sera mise à jour au même endroit, il sera difficile de trouver de l'original de la demande de l'état, tandis que la réinitialisation d'usine./data/app/
Si une Application est un non-application du système, il doit avoir un lancement Intention par laquelle il peut être lancé. Si le lancement de l'intention est null alors ses une Application système.
Exemple de Système Apps: com.android.le navigateur.fournisseur", "com.google.android.voicesearch".
Pour les applications ci-dessus, vous obtiendrez la valeur NULL lorsque vous effectuez une requête pour lancer Intention.
Il y a un peu de malentendu ici. Pour Android la notion de "système d'application" est celui qui est installer sur le système de l'image, il est dit rien à propos de ce que les développeurs de il vient. Donc, si un fabricant OEM décide de précontrainte Facebook à l'image du système, c'est un système d'application et continuera de l'être, indépendamment de l'endroit où les mises à jour de l'application sont installées. Ils ne seront pas installés sur l'image du système, pour sûr, car il est en lecture seule.
Donc ApplicationInfo.FLAG_SYSTEM est correct, mais qui ne semble pas être la question que vous vous posez. Je pense que vous vous demandez si un paquet est signé avec le certificat de système. Ce qui n'est pas nécessairement un bon indicateur de rien, cela peut varier d'un appareil à l'autre et de surprenantes composants sur la vanille Android ne sont pas signé avec le certificat de système, même si vous pourriez vous attendre à être.
Dans les versions plus récentes d'Android il y a un nouveau chemin, /system/priv-app/qui tente d'être l'emplacement d'installation pour système "réel" des applications. Les applications qui sont pré-chargés sur le système de l'image, puis à la fin dans /system/app/. Voir PSBA Privilégié vs app du Système
Il y a 2 type de Non - système applications :
Ce code, vous obtiendrez une liste de toutes les applications ci-dessus:
Voici différentes manières de voir si l'application est un système d'application par son nom (utilisé certains des codes dans ce post)
Si avoir un fichier APK et que vous souhaitez vérifier est-il du Système d'application ou de l'Utilisateur installé
une logique Simple:-
Système de Fichiers d'application ne sont pas accessible en écriture
Voici un AppUtil j'ai écrit à cette fin.
Exemple d'utilisation:
AppsUtil.java