2016-01-04 11 views
11

Kürzlich machte ich einige Forschungsarbeiten an Android Dependencies und eine Frage fest in meinen Gedanken. Frage ist, können wir eine Liste der Abhängigkeiten mit Java-Code bekommen?Get Liste der Abhängigkeiten Laufzeit

Zum Beispiel Abhängigkeiten in meiner build.gradle Datei

dependencies { 
    compile 'com.google.android.gms:play-services:+' 
    compile 'com.facebook.android:facebook-android-sdk:4.1.0' 
} 

Nun, wenn ich Namen dieser Abhängigkeiten wollen, während die App läuft, können wir es bekommen?

+0

Nr. Alles, was Sie aus den Abhängigkeiten herausholen, sobald der Build abgeschlossen ist, sind die Klassen. – njzk2

Antwort

3

Nicht wirklich. Sie sind Kompilierzeitabhängigkeiten. In kompilierten APK, gibt es keinen signifikanten Unterschied zwischen:

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

  • compile project(':facebook'), wo man einem GitHub Repo oder etwas geklont Ihnen ein lokales Bibliothek-Projekt zu geben, wie von einem zu referenzieren einen Artefakt gegen Repository

  • eine Reihe von Klassen mit Facebook Namen und Paket in Ihrer App mit, die Sie (dito einen Haufen von Ressourcen) schrieben

Wenn Sie die App schreiben, und Sie sind mit verschiedenen Build-Typen und/oder Produkt Aromen, und Sie haben unterschiedliche Abhängigkeiten für jeden, können Sie BuildConfig zu erkennen, benutzen, die bauen Variante Sie ausgeführt werden.

Wenn Sie eine Bibliothek schreiben und während der Laufzeit feststellen möchten, ob der Entwickler eine bestimmte Abhängigkeit hinzugefügt hat, ist es am besten, zu prüfen, ob bestimmte Dinge aus dieser Abhängigkeit bestehen und ob sie Ihren Erwartungen entsprechen. Die Details dazu hängen von der Abhängigkeit ab (z. B. um zu sehen, ob Play Services vorhanden ist, würde es einen Satz fest programmierter Checks geben; zu sehen, ob das Facebook SDK existiert, würde einen separaten Satz fest programmierter Checks haben). Dies wird nicht zwischen meinen drei oben genannten Kugeln unterscheiden, aber es ist das Beste, was Sie tun können.

+0

ja das ist, was ich versuche zu tun, eine Bibliothek zu schreiben und wissen wollen, was andere Abhängigkeiten Entwickler hinzugefügt haben. –

0

Um einige Codes @ Bemerkungen des CommonsWare setzt etwa zur Laufzeit

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'); 
    } 
} 

Könnte Ausgang so etwas, mit dem Sie die jar Liste bekommen konnten jar Abhängigkeiten zu finden:

Using classloader: [email protected] 

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: [email protected] 

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 
+0

'Haupt'? das wäre für eine Java-App, keine Android-App. – njzk2

+0

Ja, aber das gleiche Konzept gilt. Hol den 'ClassLoader' und sieh dir den Pfad an, den er enthält. Dann überprüfen Sie den übergeordneten 'ClassLoader' für seinen Pfad. Der Code hat keine Java-App oder Android-spezifisch. (außer der Hauptmethode) – JBirdVegas

+0

Nicht wirklich, weil alle Ihre Abhängigkeiten in der gleichen Dex-Datei verpackt sind. Sie erhalten nur den Klassenpfad des Systems, der die Frage des OP nicht beantwortet. – njzk2