2016-01-04 3 views
11

Недавно я занимался исследовательской работой на Android Dependencies, и один вопрос застрял у меня в голове. Вопрос: можем ли мы получить список зависимостей с помощью java-кода?Получить список зависимостей runtime

Например зависимости в моем build.gradle файл

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

Теперь, если я хочу имя этих зависимостей в то время как приложение работает, мы можем получить его?

+0

нет. все, что вы получаете из зависимостей после завершения сборки, - это классы. – njzk2

ответ

3

Не совсем. Они зависят от времени компиляции. В скомпилированный APK, нет существенной разницы между:

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

  • compile project(':facebook'), где вы клонированных репо GitHub или что-то, чтобы дать вам местный проект библиотеки, а не ссылки на артефакт из хранилище

  • имея кучу классов с именем Facebook и пакетом в вашем приложении, что вы написали (Ditto куча ресурсов)

Если вы пишете приложение, и вы используете разные типы сборки и/или продукты, и у вас разные зависимости для каждого, вы можете использовать BuildConfig, чтобы определить, какой вариант сборки вы используете.

Если вы пишете библиотеку и хотите определить ее во время выполнения, если разработчик добавил определенную зависимость, то лучше всего потрудиться, чтобы увидеть, существуют ли определенные вещи от этой зависимости и соответствуют ли они вашим ожиданиям. Детали для этого будут зависеть от зависимости (например, если у Play Services существует один набор жестко запрограммированных чеков, то, если существует SDK для Facebook, будет отдельный набор жестко запрограммированных проверок). Это не будет отличать мои три пули выше, но это лучшее, что вы сможете сделать.

+0

Да, это то, что я пытаюсь сделать, написав одну библиотеку и хочу узнать, что добавил другой разработчик dependecy. –

0

Чтобы поместить некоторый код @ комментарий CommonsWare об обнаружении зависимостей фляги во время выполнения

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

Мог бы вывести что-то подобное, что вы могли бы получить список банки:

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

'main'? это будет для приложения java, а не для приложения для Android. – njzk2

+0

Да, но такая же концепция применяется. Возьмите 'ClassLoader' и посмотрите на его путь. Затем проверьте родительский класс ClassLoader на его путь. В коде ничего нет приложения java или андроида. (кроме основного метода) – JBirdVegas

+0

Не совсем, потому что все ваши зависимости упакованы в один и тот же файл dex. Вы получите только системный путь к классам, который не отвечает на вопрос OP. – njzk2

Смежные вопросы