Cómo integrar la biblioteca Reflections en el estudio de Android usando gradle con guardar y recopilar

Mi pregunta está relacionada con elReflexiones biblioteca de @ronmamo en github e integrándolo en mi proyecto de Android para acceder dinámicamente a todas las clases que heredan de una determinada interfaz.

No estoy tan familiarizado con gradle o maven, así que este es un proceso de aprendizaje para mí, pero he llegado a un obstáculo y no sé cómo depurar / encontrar una respuesta a este.

Como sugiere @ronmamoaquí, Quiero generar un archivo xml en la compilación que contenga todos los metadatos escaneados y dejar que Reflections lo recopile más tarde cuando lo use en mi código:

Aunque el escaneo se puede realizar fácilmente en el tiempo de arranque de su aplicación, y no debería llevar mucho tiempo, a veces es una buena idea integrar Reflections en su ciclo de vida de compilación. Con la configuración simple de Maven / Gradle / SBT / cualquiera que sea, puede guardar todos los metadatos escaneados en archivos xml / json justo después del tiempo de compilación. Más adelante, cuando su proyecto sea bootstrapping, puede dejar que Reflections recopile todos esos recursos y vuelva a crear esos metadatos para usted, dejándolos disponibles en tiempo de ejecución sin volver a escanear el classpath, reduciendo así el tiempo de bootstrapping.

No estoy seguro de entender completamente dónde exactamente en todo el proceso se lleva a cabo este "arranque" (en términos del ciclo de vida de la aplicación de Android, etc., o incluso el tiempo de construcción), por lo que no estoy seguro de dónde llamar exactamente Reflections.collect (). Actualmente lo llamo en algún momento más adelante en mi aplicación cuando el usuario ha alcanzado un cierto punto en el programa.

A partir de varias publicaciones de stackoverflow y los archivos léame de git, se me ocurrió esto por ahora: ([...] significa que se eliminó el código no relacionado)

build.gradle (Módulo: aplicación):

dependencies {
    [...]
    compile 'org.reflections:reflections:0.9.11'
}

build.gradle (Proyecto: MyProject):

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'org.reflections:reflections:0.9.11'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task runReflections {
    doLast {        
        org.reflections.Reflections("f.q.n").save("${sourceSet.main.output.classesDir}/META-INF/reflections/myproject-reflections.xml")
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Y más adelante en mi código (esta clase se alcanza en algún momento a través de la entrada del usuario, no cargada al inicio de la aplicación):

Reflections reflections = Reflections.collect(); 
Set<Class<? extends MyInterface>> allClasses = reflections.getSubTypesOf(MyInterface.class);

Esto genera la siguiente excepción, ya que "reflexiones" no se instancia y tiene el valor de "nulo":

Attempt to invoke virtual method 'java.util.Set org.reflections.Reflections.getSubTypesOf(java.lang.Class)' on a null object reference

Entiendo que el archivo .xml generado reside en la computadora donde está ocurriendo la compilación, y no estoy seguro de si esto también se transfiere al dispositivo Android, por lo que supongo que es por eso que falla. Pero, ¿en qué momento mi código Java tiene acceso a este archivo antes de que la apk se transfiera y se ejecute en mi dispositivo Android?

He intentado buscar en Google esto de muchas maneras diferentes desde diferentes ángulos, pero parece que no puedo encontrar una solución para que los reflejos funcionen en Android. Entiendo el principio explicado aquí y parece mejor generar la información en un archivo xml en el momento de la compilación para tener la información de la clase disponible en tiempo de ejecución. Pero, ¿cómo puedo configurar esto correctamente?

Gracias

Respuestas a la pregunta(3)

Su respuesta a la pregunta