Obtenir une liste des dépendances en cours d'exécution

Récemment, je faisais un travail de recherche sur Android Dependencies et une question m'a coincé. La question est-elle que nous pouvons obtenir une liste de dépendances en utilisant le code java?

Par exemple, les dépendances dans mon fichier build.gradle

  • ProGuard peut provoquer des calculs incorrects
  • Dois-je déclarer toutes les activités dans un fichier manifeste?
  • Impossible de mettre à jour la dépendance Firebase (com.google.firebase)
  • Il existe des erreurs irrécupérables qui doivent d'abord être corrigées
  • Le projet n'a aucun objectif défini. Modifiez les propriétés du projet pour définir un
  • Mon application Google Play a été suspendue - comment la réactiver?
  •  dependencies { compile 'com.google.android.gms:play-services:+' compile 'com.facebook.android:facebook-android-sdk:4.1.0' } 

    Maintenant, si je veux le nom de ces dépendances pendant que l'application est en cours d'exécution, pouvons-nous l'obtenir?

  • Changer la couleur de la barre d'état avec AppCompat ActionBarActivity
  • Le lien devrait être ouvert dans la même vue Web en Android
  • Quelle est la logique de conception derrière Fragments en tant que classes internes statiques par rapport à des classes publiques autonomes?
  • TextView se coupe dans certaines résolutions
  • Affichage de la mise en cache de la version web sur Android
  • ListView de ListFragment lance NullPointerException lorsque j'utilise mon propre ListAdapter
  • 2 Solutions collect form web for “Obtenir une liste des dépendances en cours d'exécution”

    Pas vraiment. Ce sont des dépendances de temps de compilation. Dans votre APK compilé, il n'y a pas de différence significative entre:

    • compile 'com.facebook.android:facebook-android-sdk:4.1.0'

    • compile project(':facebook') , où vous avez cloné un compte GitHub ou quelque chose pour vous donner un projet de bibliothèque locale par opposition à référencer un artefact d'un dépôt

    • Avoir un tas de classes avec le nom de Facebook et le paquet dans votre application que vous avez écrit (ditto un tas de ressources)

    Si vous écrivez l'application et que vous utilisez différents types de construction et / ou des saveurs de produits, et que vous avez différentes dépendances pour chacun, vous pouvez utiliser BuildConfig pour détecter la variante de construction que vous utilisez.

    Si vous écrivez une bibliothèque et que vous souhaitez déterminer au moment de l'exécution si le développeur a ajouté une certaine dépendance, le mieux que vous pouvez faire est de renifler pour voir si certaines choses existent de cette dépendance et si elles correspondent à vos attentes. Les détails pour cela varieront selon la dépendance (par exemple, si les services de Play existent, il y aurait un ensemble de contrôles codés en dur, car si le SDK de Facebook existe, il y aurait un ensemble distinct de chèques codés). Cela ne fera pas de distinction entre mes trois balles ci-dessus, mais c'est le meilleur que vous allez pouvoir faire.

    Pour mettre un certain code sur les commentaires de @ CommonsWare sur la recherche de dépendances jar au moment de l'exécution

     import org.kohsuke.args4j.CmdLineParser; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; public class RuntimeDependenciesExample { public static void main(String[] args) { // just to add some dependency for our list CmdLineParser parser = null; RuntimeDependenciesExample main = new RuntimeDependenciesExample(); main.findRuntimeDependencies(); main.checkSystemClassPath(); } private void checkSystemClassPath() { System.out.println("System classpath:\n" + System.getProperty("java.class.path").replace(':', '\n')); } private void findRuntimeDependencies() { ClassLoader classloader = Thread.currentThread().getContextClassLoader(); do { System.out.println("Using classloader: " + classloader.toString()); URL[] urls = ((URLClassLoader) classloader).getURLs(); List<String> jars = new ArrayList<>(); for (URL url : urls) { jars.add(url.getFile()); } printFiltered(jars); classloader = classloader.getParent(); } while (classloader != null); } private void printFiltered(List<String> jars) { System.out.println("\nFiltered jar list:"); for (String jarPath : jars) { if (!jarPath.contains("jre") && !jarPath.contains("jdk")) { System.out.println(jarPath); } } System.out.println('\n'); } } 

    Pourriez-vous générer quelque chose comme ça, que vous pourriez obtenir la liste de jar:

     Using classloader: sun.misc.Launcher$AppClassLoader@29453f44 Filtered jar list: /Users/someUser/dev/test-code/build/classes/main/ /Users/someUser/dev/test-code/build/resources/main/ /Users/someUser/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-all/2.3.11/f6b34997d04c1538ce451d3955298f46fdb4dbd4/groovy-all-2.3.11.jar /Users/someUser/.gradle/caches/modules-2/files-2.1/args4j/args4j/2.32/1ccacebdf8f2db750eb09a402969050f27695fb7/args4j-2.32.jar /Applications/IntelliJ%20IDEA%2016%20EAP.app/Contents/lib/idea_rt.jar Using classloader: sun.misc.Launcher$ExtClassLoader@266474c2 Filtered jar list: /usr/local/Cellar/subversion/1.8.10_2/lib/libsvnjavahl-1.0.dylib /System/Library/Java/Extensions/MRJToolkit.jar System classpath: /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/charsets.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/deploy.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/cldrdata.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/dnsns.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/jaccess.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/jfxrt.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/localedata.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/nashorn.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/sunec.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/zipfs.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/javaws.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jce.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jfr.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jfxswt.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jsse.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/management-agent.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/plugin.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/resources.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/rt.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/ant-javafx.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/dt.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/javafx-mx.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/jconsole.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/packager.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/sa-jdi.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/tools.jar /Users/someUser/dev/test-code/build/classes/main /Users/someUser/dev/test-code/build/resources/main /Users/someUser/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-all/2.3.11/f6b34997d04c1538ce451d3955298f46fdb4dbd4/groovy-all-2.3.11.jar /Users/someUser/.gradle/caches/modules-2/files-2.1/args4j/args4j/2.32/1ccacebdf8f2db750eb09a402969050f27695fb7/args4j-2.32.jar /Applications/IntelliJ IDEA 16 EAP.app/Contents/lib/idea_rt.jar 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.