studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-gradle aar

para - manual de programacion android pdf



Excluir activos para el tipo de compilación de versión (5)

Terminé haciendo lo siguiente:

android.applicationVariants.all { variant -> if (variant.name.contains(''Release'')) { // exclude source and sourcemap from release builds def noJsSourceTask = task("delete${variant.name}JsSource", type: Delete) { delete "${buildDir}/intermediates/assets/${variant.dirName}/js" delete "${buildDir}/intermediates/assets/${variant.dirName}/great.min.js.map" } variant.mergeAssets.finalizedBy noCeJsSourceTask } }

Funciona bien, pero hay algunas cosas que realmente no me gustan:

  • Estoy tocando los archivos producidos por una tarea después de que finaliza (el finalizedBy ), por lo que no funciona bien con la verificación "actualizada". Pero es solo para versiones de lanzamiento, estoy haciendo depuraciones con más frecuencia
  • la ruta de los archivos para eliminar se crea manualmente. No estoy seguro si es lo suficientemente genérico como para ser reutilizado en otros proyectos como está
  • Estoy seleccionando las variantes según su nombre. Me hubiera gustado algo más estructurado.

Estoy importando una biblioteca de Android en una aplicación creada con gradle, así:

dependencies { compile ''com.example:great-lib:0.1-SNAPSHOT'' }

Esta biblioteca solo contiene activos, js, css e imágenes para usar en una vista web, con un diseño como ese:

assets/ |-> great.css |-> great.min.js |-> great.min.js.map |-> js/ | |-> plop.js | |-> foo.js | ... |-> img/ | ...

La carpeta js contiene archivos fuente (para ser usados ​​con mapas fuente). Me gustaría incluirlo y el archivo .map para las construcciones de depuración, y solo tengo los js minificados en versiones de lanzamiento, pero no puedo encontrar una manera de hacerlo.

Hasta ahora lo he intentado:

android { // this doesn''t exclude anything packageOptions { exclude ''assets/js'' } buildTypes { release { // this does exclude the js folder, but in both release and debug aaptOptions { ignoreAssetsPattern "!js" } } } }

Alguna idea de si lo que quiero es posible lograr, y si es así, ¿cómo?

(También he pensado en publicar dos versiones de la librería ( great-lib y great-lib-debug ), y tengo la dependencia en debugCompile y releaseCompile , pero preferiría evitar eso y publicar una única versión)


Creo que puedes usar Proguard. Proguard es incluir con Android Studio, ofuscar código y eliminar clases no utilizadas, y si desea eliminar todos los recursos esa aplicación no se utiliza. Solo ponga en su build.gradle esto:

release { minifyEnabled true //remove classes, obfuscate code and zipalign shrinkResources true //remove resources proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''//autogenerated files }

Esta es la información del enlace sobre eso:

Puede personalizar, excluir archivos particulares o ignorar archivos particulares


No es posible a través de un filtro.

Sin embargo, puedes tener 2 carpetas de activos. uno principal (src / main / assets) utilizado para debug y release y uno (src / debug / assets) utilizado solo para la compilación de depuración.

fuente


Gradle proporciona "aaptOptions, ignoreAssetsPattern" para filtrar / excluir las carpetas de activos y los archivos de la versión de lanzamiento o depuración.

Ejemplo para la compilación de depuración (archivos js y great.css ):

debug { aaptOptions { ignoreAssetsPattern ''!js:!great.css:'' } }

Ejemplo para compilación de versión (archivos js y great.css ):

release { aaptOptions { ignoreAssetsPattern ''!js:!great.css:'' } }


Tuve éxito con este enfoque:

applicationVariants.all { variant -> if (variant.buildType.name == ''release'') { variant.mergeAssets.doLast { delete(fileTree(dir: variant.mergeAssets.outputDir, includes: [''**/js'', ''**/*.js.map''])) } } }

Esto debería abordar los problemas con la respuesta de @ Xavier:

  • La eliminación se realiza como parte de la tarea mergeAssets de la variante, mergeAssets lo que la eliminación se refleja en el resultado de la tarea y la verificación actualizada no se verá afectada.
  • Los caminos se calculan sin cadenas mágicas. Puede que necesite ajustar los patrones de inclusión en caso de que mi ejemplo sea demasiado permisivo.
  • La variante está siendo seleccionada por el nombre buildType , que es menos problemático que el nombre completo de la variante (aunque todavía está escrito a máquina).

Tenga en cuenta que este enfoque también funciona para archivos res lugar de assets : simplemente reemplace mergeAssets con mergeResources .

Otras respuestas que mencionan packagingOptions y aaptOptions están aaptOptions el árbol equivocado, ya que tienen un alcance para todas las variantes (están definidas en el alcance de android , no buildType o buildType ).