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

  • Android Studio Update 0.4.0 n'a pas pu trouver buildConfig ()
  • Android - Taille du tampon MediaPlayer dans ICS 4.0
  • Erreur lors de la séquence de lancement finale Impossible d'exécuter la commande MI -gdb-set target-async off
  • Quelles sont les différences entre R.styleable, R.style et R.attr?
  • Comment changer la couleur de la police Spinner?
  • Comment faire une mise en page avec des coins arrondis ...?
  •  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?

  • Eclipse avec Android SDK éléments de menu manquants
  • Comment ajouter -Xlint: débloqué sur mon projet basé sur Android Gradle?
  • NoClassDefFoundError pour le code dans une bibliothèque Java sur Android
  • Moto 360 Déploiement sur Android Studio extrêmement lent
  • Comment supprimer l'onglet de TabHost
  • Comment utiliser View Stub dans Android
  • 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.