2017-02-26 5 views
1

Wir haben die Methode 'buildConfigField' in BuildTypes verfügbar, die eine statische letzte Variable in der BuildConfig-Klasse erstellt. Auch wenn wir der xml-Datei irgendeine Ressource hinzufügen, erzeugt Android standardmäßig eine ID-Konstante in der R.java-Datei. Ich möchte die Implementierung dahinter verstehen.

Ich möchte eine Methode in android-Projekt in der build.gradle-Datei erstellen, die die JSON-Datei lesen und die Klasse und die zugehörigen statischen letzten Elementvariablen erstellen wird.So erstellen Sie eine Kompilierzeit-Config-Klasse aus build.gradle

{ 
    "Config": [ 
    { 
     "name": "usernameType", 
     "type": "String", 
     "value": "text" 
    } 
    ] 
} 

die wie folgt erstellt werden:

public static final Class Config { 

    public static final Item username = new Item("<item_type>","<item_name>","<item_value>"); 

    public class Item { 
    public String name, type, value; 
    public Item(String name, String type, String value){ 
     this.name=name; 
     this.type=type; 
     this.value; 
    } 

} 

Ich habe keine Ahnung, wie kann ich diese Idee umzusetzen, die im Grunde die Konfigurationsdatei bei der Kompilierung schaffen.

Antwort

1

Sie können ein Gradle-Plugin erstellen, das eine Gradle-Task definiert, die in JSON lesen kann, und dann JavaPoet verwenden, um Ihre Java-Datei zu schreiben.

Sie wind up mit einem:

  • Gradle Plugin Objekt, das weiß, wie man sich an der richtigen Stelle auf den Android-Build-Prozess zu befestigen und eine schafft ...

  • Gradle DefaultTask Objekt, das konfigurieren und ausführen können ...

  • einige Ebene (nicht-Android) Java-Code, der in der JSON liest (zB über Gson) und verwendet JavaPoet

This sample project zeigt die Grundlagen der Einstellung in this chapter von my book ein Gradle Plugin, mit einer vollständigen Erklärung oben. This sample project macht ziemlich genau das, was Sie wollen, obwohl mein JSON und Java etwas anders sind als Ihres. Es ist ausführlich in this chapter aus meinem Buch abgedeckt.

Im Prinzip könnten Sie dies alles in Gradle tun, obwohl die Menge an Code, die benötigt wird, um das zu erreichen, übertrifft, was ich normalerweise in build.gradle Skripten sehe.

Verwandte Themen