L'ensemble de la réponse repose sur le fait que lorsque cette requête est faite (elle requiert adb ) :
adb shell pm list packages -3 -i
l'installateur d'une application est listé dans la sortie à côté du nom du paquet de l'application. Nous pouvons filtrer les noms d'installateurs dans cette sortie afin d'isoler les applications non installées depuis le Play Store.
Remarque : si vous avez un système d'exploitation Android enraciné, vous pouvez vérifier les points suivants /data/system/package.xml
puisque ladite commande expose les informations trouvées dans ce fichier, mais de manière plus lisible.
Automatisation
J'ai trouvé Tasker ( guide de l'utilisateur ) aptes ainsi que flexibles pour le travail. Créez une tâche nommée NonMarket et créez les actions suivantes dans celle-ci :
-
Tâche → Exécuter le shell
Cela permettra de stocker le nom du paquet de toutes les applications tierces actuellement installées, mais ne provenant pas du Play Store, dans la variable AllPkgs. Remplacer -ve
con -e
dans ladite commande si vous avez l'intention de lister les applications actuellement installées et qui ont été installées depuis le Play Store.
Toute ligne dans cette variable suivrait ce modèle :
package:PACKAGE_NAME installer=INSTALLER_NAME
Ici,
- PACKAGE_NAME → nom du paquet de l'application ;
- INSTALLER_NAME → nom du paquet de l'application d'installation, tel que com.Android.vending o com.google.Android.feedback pour Play Store, org.fdroid.fdroid pour F-Droid, null si elle est installée manuellement par adb ou à partir d'un gestionnaire de fichiers ordinaire, etc.
-
Variables → Recherche de remplacement de variables
- Variable :
%AllPkgs
- Recherche :
package:
- tick Multi-Line
- tique Remplacer les correspondances
- Remplacer par : ne rien changer puisque nous avons l'intention de supprimer la correspondance des lignes.
-
Variables → Recherche de remplacement de variables
Après l'exécution de cette étape, chaque ligne de la variable AllPkgs ne contiendra que le nom du paquetage d'une application.
-
Variables → Ensemble de variables
- Nom :
%ret
- Pour : appuyer une fois sur la touche Entrée de votre clavier
J'ai appris cette étape dans le post aquí par plepleus. Cette étape est nécessaire car nous avons l'intention de copier chaque ligne (a un nom de paquet d'une application) de AllPkgs dans une variable séparée. C'est pour faciliter l'utilisation.
-
Variables → Fractionnement des variables
- Nom :
%AllPkgs
- Séparateur :
%ret
Cette étape crée un tableau de AllPkgs et chaque ligne de l'ancien AllPkgs est assignée à un index de ce tableau. Ainsi, la taille du tableau est le nombre de lignes d'AllPkgs.
-
Variables → Ensemble de variables
Nous créons une variable nommée count et l'initialisons à 1, dans le but de boucler sur tous les éléments de AllPkgs.
-
App → Test App
- Type : Nom du paquet
- Données :
%All(%count)
- Stocker le résultat dans :
%Label(%count)
Cette étape trouve l'étiquette d'une application à partir du nom de son paquet et l'assigne à un élément du tableau Label. Voir Matrices variables dans l'ouvrage de Tasker Guide de l'utilisateur sur les variables si vous avez des doutes sur cette étape.
-
Variables → Ensemble de variables
- Nom :
%AllLabels
- A :
%Label(%count) - %AllPkgs(%count)%ret
- tick Append
La dernière étape, à chacune de ses exécutions dans n'importe quel cycle de la boucle, écraserait la valeur assignée à la variable mentionnée dans Stocker le résultat dans . Cette étape permet d'affecter cette valeur à une nouvelle variable appelée AllLabels et Append permet de s'assurer que le nouveau cycle ne fait qu'ajouter les modifications précédentes, sans les écraser.
À la fin de la boucle, AllLabels aura des lignes où chacune d'entre elles aura l'étiquette d'une application particulière et le nom du paquet.
-
Variables → Ajout de variables
Cette étape incrémente la variable Count, de sorte que nous pouvons passer au cycle suivant de la boucle.
-
Tâche → Goto
- Type : Numéro d'action
- Numéro :
7
- Si :
%count
<
%AllPkgs(#)+1
Cette étape met finalement en œuvre la boucle. Lorsque cette action est exécutée, elle vérifie si count est inférieur au nombre maximum d'éléments dans le tableau AllPkgs. Si oui, elle reste dans la boucle et crée un nouveau cycle, sinon, la boucle se termine et nous continuons avec le reste des actions en dessous.
-
Fichier → Écrire un fichier
- Dossier :
/sdcard/unknown_sources.txt
- Texte :
%AllLabels
Cette étape écrit toutes les lignes stockées dans la variable AllLabels dans un fichier nommé sources_inconnues.txt sous /sdcard
. Si vous êtes faire du remplacement dans la première action, assurez-vous de changer le nom du fichier dans cette action pour que les résultats soient stockés séparément.
-
Variables → Effacement de la variable → Nom : %Label
Vous obtiendrez des résultats bizarres si vous n'effacez pas un tableau créé manuellement par l'utilisateur et que vous l'utilisez dans une tâche.
-
Alerte → Flash → Texte : Task completed
.
Exécuter la tâche en utilisant le bouton de lecture. Une fois la tâche terminée, vérifiez le fichier pour trouver le contenu que vous recherchez.
Ligne de commande
Je ne pouvais pas ignorer la ligne de commande qui rend l'objectif si facile à atteindre dans ce cas particulier.
Dépendances
- Nécessite busybox outil. Si vous ne l'avez pas installé, reportez-vous à : Comment installer les outils de ligne de commande manquants sur un appareil Android ?
-
Nécessite aapt outil. Si vous utilisez une ROM CM ou une ROM dérivée, ignorez cette exigence. Sinon, pour Android 4.x, vous pouvez envisager de télécharger le binaire à partir de aquí . Pour l'installer sur votre appareil, suivez l'approche Root ou non-Root mentionnée. aquí de manière appropriée.
Utilisateurs d'Android 5.x : demandez de l'aide à Google.
Mon petit script
#!/system/bin/sh
# Check if the busybox binary exists under /data/local/tmp/ or /system/xbin.
# Set the detected binary's path into the variable busybox or exit if file
# doesn't exist or executable permission is not set
if \[\[ -x /data/local/tmp/busybox \]\]; then
busybox=/data/local/tmp/busybox;
elif \[\[ -x /system/xbin/busybox \]\]; then
busybox=/system/xbin/busybox;
else
date +'busybox binary not found or executable permission is not set. Exiting';
exit;
fi
# Check if the aapt binary exists under /data/local/tmp or /system/bin or /system/xbin.
# Set the detected binary's path into the variable aapt or exit if file
# doesn't exist or executable permission is not set
if \[\[ -x /data/local/tmp/aapt \]\]; then
aapt=/data/local/tmp/aapt;
elif \[\[ -x /system/bin/aapt \]\]; then
aapt=/system/bin/aapt;
elif \[\[ -x /system/xbin/aapt \]\]; then
aapt=/system/xbin/aapt;
else
date +'aapt binary not found or executable permission is not set. Exiting';
exit;
fi
# List third-party installed packages not installed from Play Store. Replace -ve with -e if you intend to list packages installed from Play Store.
pm list packages -3 -i | grep -ve "com.android.vending" -ve "com.google.android.feedback" | $busybox sed 's/package://g'| $busybox awk '{print$1}' > /sdcard/pkgs.txt
#$busybox printf "List of third-part installed apps not installed from Play Store:\\n\\n"
# For each package, get its label and print it with package name on standard output
while read line; do
path=$(pm path $line | $busybox sed 's/^package://g'); # retrieve path of package's APK. Required for finding app's label
label=$($aapt d badging $path 2>&1 | $busybox sed -ne '/application: label=/p' | $busybox cut -d "'" -f2); # Retrieve app's label using $path
printf "$label - $line\\n";
done < /sdcard/pkgs.txt
Enregistrez le script sous /sdcard
dans un fichier nommé nonplay.sh
et exécuter ce fichier depuis un émulateur de terminal de cette manière :
sh /sdcard/nonplay.sh
Sortie démo :
(Cliquez sur l'image pour l'agrandir)
( <strong>Note </strong>Ces applications listées dans l'image ont été téléchargées depuis Play Store il y a quelques temps dans ma ROM primaire. Puisqu'elles ont été sideloadées dans cette ROM secondaire, elles sont apparues dans la sortie. Si je réussis à mettre à jour l'une des applications sideloadées depuis Play Store, il sera considéré que l'application est installée depuis Play Store).
2 votes
Vous devriez demander au support de Sky comment l'installation d'une application à partir d'une "source inconnue" (par exemple pas Play Store) signifie que votre téléphone est rooté - ce n'est pas un indicateur de Root. Ces applications n'ont pas non plus l'autorisation de Root.
0 votes
@A--C Oui, je sais, mais la personne avec qui j'étais en IMing ne semblait pas prête à répondre à ce genre de questions. Je suppose que Sky a simplement une politique extrêmement conservatrice à ce sujet parce qu'ils ne peuvent pas être sûrs que les applications installées à partir d'autres sources ne font pas des choses contre lesquelles leurs licences les obligent à se protéger. Quel que soit le sens de cette politique. C'est comme ça que ça se passe maintenant, et c'est ce que je dois faire.