¡Desarrolladores de Android! Generemos nuestras propias cadenas JSON usando el complemento Gradle | autor: Volkan Şahin | Octubre de 2020

Primer componente: extensión del complemento (llave del automóvil)

public class StringGeneratorExtension {

public static final String NAME = "stringGenerator";

private File stringsJsonFile;

public File getStringsJsonFile() {
return stringsJsonFile;
}

@InputFile
public void setStringsJsonFile(@Nullable File stringsJsonFile) {
this.stringsJsonFile = stringsJsonFile;
}
}

Entonces, si alguna vez ha usado un complemento, probablemente haya visto algo así antes. Puede pensar en las dependencias como una clase de extensión y una palabra clave de implementación como una variable.

Así que básicamente estamos haciendo lo mismo. Si usa nuestras extensiones, tiene algo similar. Ambos son legales.

Segunda parte: el papel del complemento (motor de automóvil)

Bien, dijimos que queríamos un archivo JSON. Logramos tomarlo del desarrollador dentro de la extensión de gradle. Y lo que vamos a hacer es romper JSON en pedazos. Usé otro viejo amigo gson fácil de hacer. Aquí hay un JSON POJO simple.

/*
{
"string" : {
"true_music": "Long live heavy metal",
"my_repo": "https://github.com/volsahin",
"description" : "String generator plugin",
"done" : "done"
}
}
*/
public class StringsJsonEntity {

@SerializedName("string")
private Map<String, String> strings;

public Map<String, String> getStrings() {
return strings;
}
}

Por tanto, el análisis de piezas es sencillo.

@Nullable
private StringsJsonEntity createStringsJsonEntity() {
try {
JsonReader reader = new JsonReader(new FileReader(extension.getStringsJsonFile()));
return new Gson().fromJson(reader, StringsJsonEntity.class);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}

Ahora hemos analizado nuestro JSON en nuestro modelo. Y sabemos que queremos generar una clase con esta información. Gracias a nuestros amigos de la plaza, facilítalo porque hacen un uso intensivo de la generación de clases en sus proyectos. Puedes comprobar https://github.com/square/javapoet para su uso.

Primero creamos nuestra clase R. Pero en nuestro caso es la clase RR. Por qué no? Entonces, para generar una clase llamada RR, debe hacer algo similar

private static final String RESOURCE_CLASS_NAME = "RR";@TaskAction
public void execute() {
TypeSpec.Builder resourceClass = createResourceClass();
}
private TypeSpec.Builder createResourceClass() {
return TypeSpec.classBuilder(RESOURCE_CLASS_NAME)
.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
}

Está bien, tenemos una clase RR con nosotros. Aún no hemos creado al creador, pero pensamos que es de la forma en que él ya lo creó. Entonces quiero otra clase llamada cadena. Cuando usa strings.xml, llama a sus cadenas como R.string.megadeth, por lo que creamos nuestra clase RR.string.

private static final String STRING_CLASS_NAME = "string";@TaskAction
public void execute() {
TypeSpec.Builder resourceClass = createResourceClass();
TypeSpec.Builder stringClass = createStringClass();
}
private TypeSpec.Builder createStringClass() {
return TypeSpec.classBuilder(STRING_CLASS_NAME)
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL);
}

Luego queremos leer todos los pares clave-valor de la cadena y ponerlos como variables en la clase de cadena para llegar a ellos como RR.string.mustaine.

@TaskAction
public void execute() {
TypeSpec.Builder resourceClass = createResourceClass();
TypeSpec.Builder stringClass = createStringClass();
createKeyValueVariablesInClass(stringClass);
resourceClass.addType(stringClass.build());
}

Por último, pero no menos importante, necesitamos generar nuestro archivo. Es una parte fácil si sabe dónde generarla. Mencionaré esto en la siguiente sección, para que pueda generar dicho archivo. Aquí también imprimo la clase al terminal.

private void generateStringResourceFile(TypeSpec.Builder classBuilder) {
final JavaFile javaFile = JavaFile.builder(FILE_PACKAGE_NAME, classBuilder.build()).build();
try {
javaFile.writeTo(new File(generationPath));
javaFile.writeTo(System.out);
} catch (IOException e) {
e.printStackTrace();
}
}

Nunca pensé que escribir una publicación intermedia fuera tan agotador. Así que es hora de jugar a Megadeth.

Tercer componente: complemento (el propio automóvil)

Entonces ahora tiene nuestro complemento. Crea dos tareas llamadas generateStringResourceFileDebug y generateStringResourceFileRelease. Cuando complete estas tareas o simplemente cree su proyecto, verá su rostro orgulloso cuando se mire en el espejo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *