Получить список запущенных зависимостей

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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