Получить список зависимостей во время выполнения
Недавно я занимался исследовательской работой Android Dependencies
и один вопрос застрял у меня в голове. Вопрос в том, можем ли мы получить список зависимостей, используя код Java?
Например, зависимости в моем файле build.gradle
dependencies {
compile 'com.google.android.gms:play-services:+'
compile 'com.facebook.android:facebook-android-sdk:4.1.0'
}
Теперь, если мне нужно имя этих зависимостей во время работы приложения, можем ли мы его получить?
2 ответа
На самом деле, нет. Это зависимости времени компиляции. В вашем скомпилированном APK нет существенной разницы между:
compile 'com.facebook.android:facebook-android-sdk:4.1.0'
compile project(':facebook')
где вы клонировали репозиторий GitHub или что-то, чтобы дать вам проект локальной библиотеки, а не ссылаться на артефакт из репозиторияиметь кучу классов с именем и пакетом Facebook в вашем приложении, которое вы написали (то же самое, что куча ресурсов)
Если вы пишете приложение и используете разные типы сборки и / или разновидности продукта, и у вас есть разные зависимости для каждого, вы можете использовать BuildConfig
чтобы определить, какой вариант сборки вы используете.
Если вы пишете библиотеку и хотите во время выполнения определить, добавил ли разработчик определенную зависимость, лучшее, что вы можете сделать, - это понюхать, чтобы увидеть, существуют ли определенные вещи из этой зависимости и соответствуют ли они вашим ожиданиям. Подробная информация об этом будет зависеть от зависимости (например, проверка наличия сервисов Play будет иметь один набор жестко заданных проверок; проверка наличия SDK Facebook будет иметь отдельный набор проверенных кодов). Это не будет отличать мои три пули выше, но это лучшее, что вы сможете сделать.
Чтобы добавить код в комментарии @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: 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