Menú
Es gratis
registro
casa  /  SOBRE/ Java - editar - estructura de manifiesto de Android. Nueva forma de publicar aplicaciones usando Android App Bundle Estructura de biblioteca de Android compilada

Java - edición - estructura de manifiesto de Android. Nueva forma de publicar aplicaciones usando Android App Bundle Estructura de biblioteca de Android compilada

Tengo un proyecto creado con Gradle en Android Studio v 0.3.2. Mi proyecto tiene dependencias en otros dos módulos (biblioteca naya). La estructura del proyecto está bien definida con archivos build.gradle. El problema es ... cuando ejecuto un proyecto en un dispositivo Android, instalo 3 en mi dispositivo. Uno de ellos es el proyecto principal (el único correcto) y los otros dos son módulos importados (estos dos no los quiero instalar). ¿Cómo puedo conseguir esto? ¿O qué estoy haciendo mal?

Estructura del proyecto:

  • MyLibModule
  • Proyecto principal
  • MainProject-> bibliotecas-> MyOtherModule

Donde MyLibModule está en la misma ruta que el proyecto principal porque también necesito este módulo en otro proyecto.

Para que quede claro: todo montaje el proyecto en orden todas las dependencias están bien, pero ¿por qué obtengo 3 APK en mi dispositivo?

Después de todo un día luchando con este problema, encontré la causa de este extraño comportamiento. El problema fue la manifestación del módulo de biblioteca. Antes de cambiar al estudio de Android, estaba usando Eclipse. Y tenía testActivity declarado en el manifiesto del proyecto de mi biblioteca. Eliminar todas las acciones de prueba del manifiesto de las unidades de mi biblioteca resolvió el problema. Ahora, Android Studio solo instala el APK de MainProject.

Algún código: manifiesto MyLibModule:

Cambiado a:

…. Y lo mismo ocurre con MyOtherModule.

NOTA. Nodo vacío Anexos debe permanecer en el manifiesto para evitar errores de compilación.

Eliminar el filtro de intención de ejecutar su biblioteca

Cambiado a

Esto se debe a que sus bibliotecas están definidas en sus archivos build.gradle como aplicaciones, no bibliotecas. Mira esta línea:

Aplicar complemento: "android"

Y reemplácelo con:

Aplicar complemento: "android-library"

Es posible que deba realizar otros cambios en el archivo de ensamblaje, ya que no todo lo relacionado con las aplicaciones se puede especificar en el archivo de ensamblaje de la biblioteca. Consulte http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-projects para obtener más información.

Introducción

La comodidad de un entorno de programación depende en gran medida de la cantidad de acciones secundarias que no están relacionadas con la programación que un programador necesita realizar, así como de la profundidad del estudio del propio entorno de desarrollo para configurarlo adecuadamente para sus propias necesidades. En este sentido, lo ideal, en mi opinión, es el entorno Delphi, afilado solo para el desarrollo más simple y rápido posible de aplicaciones para Windows (para ser justos, observo que con el desarrollo de aplicaciones para Android y otros sistemas aún no existe tan suave como me gustaría).

En este sentido, en el ámbito de Android no existen entornos de desarrollo lo suficientemente cómodos, como lo es, sin embargo, y se supone que son programas en el mundo de los sistemas operativos libres. Hasta hace poco, Eclipse con complementos especializados se consideraba la herramienta de desarrollo central. Sin embargo, en el verano de 2013, Google presentó al público un nuevo IDE, Android Studio, basado en el antiguo competidor de Eclipse, IntelliJ IDEA. Debo decir que a pesar de la primera versión del sistema, que ni siquiera ha entrado en la fase Beta, ya supera la comodidad de Eclipse.

Sin embargo, los programadores aún tienen que profundizar tanto en los numerosos matices de la configuración del entorno como en los pasos inusuales involucrados en la generación de archivos finales de la aplicación listos para su distribución. Y todo esto en el contexto de estudiar esas clases específicas que deben usarse para que la interfaz funcione correctamente con el código.

Después de una introducción tan larga, solo le diré cómo puede generar archivos apk finales listos para su distribución en Android Studio, porque hay algunos matices. Espero que mi artículo de alguna manera les facilite la vida a los usuarios novatos de este, quizás, el mejor IDE para la programación de Android en la actualidad.

Manera manual

  1. En la esquina inferior izquierda de Android Studio, hay un pequeño botón que controla la visualización de accesos directos especiales en los bordes de la pantalla. Los accesos directos abren varias ventanas auxiliares. Además, simplemente pasando el puntero del mouse sobre este botón, aparece una lista de todas estas ventanas para abrir rápidamente la deseada. Abra la ventana Build Variants y, frente a nuestro módulo, en el campo Build Variant, cambie el modo de compilación de debug a release.
  2. En el menú principal, abra Build → Generate Signed APK. Aparece un mensaje que, parafraseando un poco, se puede traducir así: “D Para proyectos que se crean con la utilidad Gradle, la información de la firma y el procedimiento para firmar archivos apk deben escribirse en un script especial. Configure el script como se describe en la guía del usuario: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Signing-Configurations. Luego ejecute "Gradle assembleRelease" y obtenga el archivo apk generado en la carpeta build / apk /"Esta publicación recomienda encarecidamente que usemos el segundo método para crear un archivo apk. Tomamos nota de la información, pero continuamos con el método manual haciendo clic en Aceptar.
  3. Se abre el asistente de generación de firmas para el archivo apk. Ya sabemos que todas las aplicaciones de Android redistribuibles deben estar firmadas digitalmente por el autor; de lo contrario, la aplicación no se instalará en los dispositivos de los usuarios. La firma generada debe almacenarse en un archivo de almacenamiento especial ubicado en su computadora, desde donde luego se extraerá para firmar archivos apk. Al mismo tiempo, un almacenamiento puede almacenar varias firmas para diferentes archivos apk. Además, la misma firma se puede utilizar para firmar diferentes archivos apk. Entonces, para crear un repositorio, haga clic en el botón Crear nuevo ... y complete los campos que se han abierto en la ventana:
    1. Ruta para colocar el archivo del repositorio
    2. Contraseña y confirmación para acceder a la bóveda.
    3. El nombre de la firma por la que se llamará
    4. Contraseña y confirmación de acceso a firma
    5. Período de validez de la firma (de forma predeterminada, 25 años, no se modifique)
    6. Al menos uno de los campos del certificado. Por lo general, ingrese el nombre y apellido, la ciudad y el país (RU).
  4. Haga clic en Aceptar. La ventana se cierra y vemos que todos los campos de la ventana anterior se completaron automáticamente con los datos que ingresamos. Marcamos el campo Recordar contraseña para que no tenga que escribir una contraseña cada vez y hacemos clic en Aceptar.
  5. En la siguiente ventana, controlamos la ruta y el nombre del archivo apk. Por defecto, es igual al nombre del módulo. Habilitamos la casilla de verificación Ejecutar ProGuard para que nuestro archivo esté optimizado, e incluso podemos cambiar el archivo de configuración proguard-android.txt a proguard-android-Optimize.txt para una optimización más estricta (aunque esto puede estar plagado de algunos teléfonos inteligentes exóticos). Haga clic en Finalizar y espere, mirando la barra de estado.
  6. Cuando finalice la compilación del proyecto, aparecerá una ventana pidiéndole que abra la carpeta con el archivo apk resultante. Lo abrimos y vemos nuestro archivo.

Diré de inmediato que a pesar de que puse una marca en la casilla Ejecutar ProGuard, por alguna razón no funciona para mí y el archivo apk permanece sin optimizar. Quizás estos sean restos de una versión anterior de Android Studio ( Tengo la versión 0.5.4). Pero la salida es bastante simple habilitando esta casilla de verificación directamente en el archivo de secuencia de comandos de la utilidad ProGuard. Busque el archivo build.gradle en la ventana del proyecto dentro de nuestro módulo. En la sección android → buildTypes → release responsable de generar la versión, cambie el parámetro runProguard de falso a verdadero.

Recuerde sincronizar su proyecto con él después de editar el archivo de secuencia de comandos. Para hacer esto, en la barra de herramientas, haga clic en el botón Sincronizar proyecto con archivos Gradle (flecha hacia abajo desde un círculo verde) o en el enlace Sincronizar ahora en la barra de mensajes amarilla que aparece en la parte superior de la fuente. Después de la sincronización, puede intentar compilar el archivo apk nuevamente, comenzando desde el segundo párrafo de nuestras instrucciones. Solo que esta vez, en lugar de generar un nuevo almacenamiento, usaremos el ya creado. Todas nuestras contraseñas y configuraciones han sido guardadas, por lo que solo tenemos que hacer clic en Aceptar-Siguiente-Finalizar en las ventanas emergentes. Tenga en cuenta que el archivo apk recién generado es un poco más pequeño que la última vez.

Manera automática

El método automático le permite generar un archivo apk sin ingresar contraseñas cada vez que se inicia la aplicación para su ejecución, así como el comando assembleRelease agregado a la lista de configuraciones y ejecutado por el mismo botón Ejecutar.

Para habilitar el modo automático, necesitamos agregar una nueva sección al archivo de script build.gradle ya familiar, que contiene información sobre la firma:


signingConfigs (release (storeFile file ("C: \\ Users \\ UserName \\ KEYSTORE.jks") storePassword "Repository Password" keyAlias ​​"SignatureName" keyPassword "SigningPassword") buildTypes (release (minEnabled true signingConfigDefigDesignConfigs.Flease proguard- android.txt ")," proguard-rules.pro ")))

En lugar del archivo de configuración "proguard-android.txt", puede ingresar un archivo de configuraciones aún más optimizadas "proguard-android-Optimize.txt". Esto reducirá un poco más el tamaño del archivo apk.

Para agregar esta sección a la configuración, abra el archivo build.gradle ubicado dentro de nuestro módulo y comente la sección buildTypes. En su lugar, insertemos la sección anterior. No olvide cambiar la ruta a su archivo de claves que creó en la primera parte del artículo al crear manualmente el archivo apk, así como ingresar el nombre correcto de la firma y ambas contraseñas.

Después de realizar cambios en el archivo, haga clic en el botón Sincronizar proyecto con archivos Gradle en la barra de herramientas (flecha hacia abajo desde el círculo verde) o en el enlace Sincronizar ahora en la franja de información amarilla que aparece en la parte superior para sincronizar la configuración modificada con el proyecto. . Eso es todo, ¡el modo automático está configurado!

Ahora, para poder generar un archivo apk sin iniciar la aplicación, agreguemos un comando separado para comenzar a generar un archivo apk en la lista de configuraciones (cuadro combinado en la barra de herramientas). Abramos la ventana de Tareas de Gradle haciendo clic en el acceso directo de Gradle en el borde derecho de la pantalla, o seleccionándolo de la lista emergente del botón ubicado en la esquina inferior izquierda de Android Studio. En la sección Todas las tareas, abra la lista de tareas para nuestro módulo y haga clic con el botón derecho en la tarea ensamblarRelacionar. En el menú contextual que aparece, seleccione el elemento Crear ... y la tarea seleccionada se agregará a la lista de configuraciones.

Ahora podemos generar un lanzamiento sin lanzar el programa para su ejecución, simplemente seleccionando el comando ensamblarRelease de la lista de configuraciones y presionando el botón Ejecutar. El resultado de la creación automática del archivo apk se ubicará en la carpeta build / apk /. Habrá dos archivos: ModuleName-release-unaligned.apk y ModuleName-release.apk. El primer archivo es un producto semiacabado. Ya está firmado pero aún no alineado. El segundo archivo ya está alineado. Este es nuestro archivo apk final, que ya podemos renombrar y redistribuir libremente.

Tenga en cuenta que la alineación de archivos garantiza que todos los datos sin comprimir comiencen en un múltiplo de 4 bytes desde el principio del archivo. Esto optimizará el rendimiento del programa en el dispositivo. Cuando un archivo está alineado, Android puede leer la información del archivo según sea necesario, en lugar de cargar todo el paquete en la memoria. Como resultado, la cantidad de RAM consumida por la aplicación en ejecución disminuye.

Los complementos instalados están en el menú Archivo | Configuración ... | Complementos... Botón Examinar repositorios ... le permite encontrar el complemento en el repositorio. Botón Instalar el complemento desde el disco ... le permite instalar el complemento desde el disco si lo descargó usted mismo.

Soportes de arco iris

Rainbow Brackets le permite marcar cada par de corchetes con su propio color individual. Esto le ayuda a ver visualmente dónde está el área de código.

Reemplaza todas las barras de progreso en el estudio con un lindo gato. Si eres un programador serio, solo tienes que instalar el complemento. Compatible con otros entornos de desarrollo basados ​​en IntelliJ IDEA: PhpStorm, WebStorm, PyCharm, RubyMine, AppCode, CLion, Gogland, DataGrip, Rider, MPS.

Aparece por todas partes. Por ejemplo, al cargar un proyecto.

Mientras trabaja mientras sincroniza algo.

RoboPOJOGenerator

Cómodo generador de clases POJO de Java y Kotlin listas para usar de JSON: GSON, FastJSON, AutoValue (GSON), Logan Square, Jackson.

Idea de ADB

Complemento para Android Studio / Intellij IDEA para operaciones rápidas de aplicaciones:

  • Desinstalar aplicación: desinstala una aplicación de un dispositivo
  • Kill App: mata la aplicación (eliminar de la memoria)
  • Iniciar aplicación: inicie la aplicación
  • Reiniciar la aplicación: reinicia la aplicación
  • Borrar datos de la aplicación: borrar datos
  • Borrar datos de la aplicación y reiniciar: borrar datos y reiniciar

Una vez instalados, estos comandos se pueden encontrar a través de Herramientas Android | IDEA ADB.

También puede llamar a la ventana de búsqueda de acciones usando el atajo de teclado Ctrl + Mayús + A y usando símbolos ADB encontrar rápidamente un equipo específico.

El complemento es conveniente para verificar el estado de la aplicación en diferentes estados. Por ejemplo, anteriormente creó una base de datos y decidió ver cómo se comportará la aplicación cuando la base de datos esté vacía. Con el complemento, puede borrar rápidamente los datos y ver el resultado.

Cuando hablamos de complementos y aplicaciones modulares, nos referimos principalmente al software de usuario común. Sin embargo, el diseño modular puede resultar igualmente útil a la hora de desarrollar rootkits y puertas traseras. El uso de medios convencionales para actualizar dicho software es demasiado pálido y no siempre es posible, pero la carga inadvertida de un módulo con nueva funcionalidad a través de la red es bienvenida. Y si extrae la funcionalidad clave en módulos y los elimina inmediatamente después de la carga, puede arruinar seriamente la vida del inversor.

En lugar de presentar

Java clásico tiene una clase llamada java.lang.ClassLoader. Su tarea es cargar el bytecode de la clase especificada (archivo con la extensión .class) en la máquina virtual durante la ejecución de la aplicación. Luego puede crear un objeto de esta clase y llamar a sus métodos usando la reflexión. Esta es la forma de cargar dinámicamente código que se puede usar para escribir aplicaciones con funcionalidad extensible o, más simplemente, compatibilidad con complementos.

Android no tiene una máquina virtual Java y no hay una clase ClassLoader, pero existe su DexClassLoader analógico, que realiza exactamente la misma función, pero con respecto al bytecode de Dalvik (y archivos .dex en lugar de .class, respectivamente). Y, a diferencia de Java de escritorio, donde es más fácil colocar el archivo jar requerido en CLASSPATH y no jugar con la carga dinámica, en Android este enfoque realmente ofrece muchas ventajas, la principal de las cuales es que la funcionalidad de la aplicación puede ser ampliado y actualizado sin que el usuario lo note y sin preguntarle nada. En cualquier momento, su aplicación puede descargar un archivo con una clase desde el servidor, descargar y luego eliminar el archivo.

Además, las clases se pueden almacenar directamente en el paquete APK y cargar al inicio de la aplicación. El beneficio aquí es que el código de las clases cargadas se separará del código de la propia aplicación y estará en el APK "en la dirección incorrecta"; herramientas como la apktool que a los inversores les encanta usar simplemente no se verán. Por otro lado, es más una protección infalible, ya que un inversor normal descubrirá rápidamente qué es qué.

Sea como fuere, la carga dinámica de clases es algo muy útil a la hora de escribir aplicaciones blanquecinas, por lo que cualquier especialista en seguridad debería saber cómo funciona este mecanismo y cómo se utiliza en troyanos.

El ejemplo mas simple

// Ruta al archivo jar con nuestra clase String modFile = "/sdcard/myapp/module.jar"; // Ruta al directorio privado de la aplicación String appDir = getApplicationInfo (). DataDir; // Cargar el archivo desde el disco DexClassLoader classLoader = new DexClassLoader (modFile, appDir, null, getClass (). GetClassLoader ()); // Cargue la clase, cree un objeto e intente llamar al método run () usando la reflexión try (Class c = classLoader.loadClass ("com.example.modules.simple.Module"); Método m = c.getMethod (" ejecutar ", nulo); m.invoke (c.newInstance (), nulo);) catch (Excepción e) (e.printStackTrace ();)

En general, todo es simple aquí: el código carga el archivo jar /sdcard/myapp/module.jar con nuestra clase, carga la clase com.example.modules.simple.Module, crea un objeto y llama a run () método. Preste atención a tres puntos:

  • DexClassLoader puede cargar tanto archivos .dex "simples" como archivos jar, este último es preferible debido a la compresión y la capacidad de usar una firma digital;
  • El segundo argumento del constructor DexClassLoader es el directorio que usa para almacenar el código de bytes optimizado (odex), para simplificar, especificamos el directorio privado de la propia aplicación;
  • el método loadClass siempre necesita especificar la dirección de la clase junto con el nombre del paquete como argumento.

Para probar el rendimiento de este código, creemos un módulo simple:

Paquete com.example.modules.simple.Module; importar android.util.Log; Módulo de clase pública (public void run () (Log.d ("Módulo", "¡¡¡Estoy vivo !!!");))

Tómese su tiempo para crear un nuevo proyecto en Android Studio, puede colocar este código en el bloc de notas y colocarlo en un archivo jar directamente desde la línea de comando:

Javac -classpath /path/to/SDK/platforms/android-23/android.jar Module.java /path/to/SDK/build-tools/23.0.3/dx --dex --output = module.jar Módulo. clase

Asegúrese de que existan los directorios platform / android-23 y build-tools / 23.0.3, en su caso, sus nombres pueden ser diferentes.

Si todo va bien, terminará con un archivo module.jar. Todo lo que queda es agregar el código del cargador a la aplicación, colocar el module.jar en la tarjeta de memoria, construir y ejecutar la aplicación.

Abajo con la reflexión

La reflexión es algo bueno, pero en este caso solo se interpone. No es difícil llamar a un método sin argumentos que lo usen, sin embargo, si queremos que nuestra aplicación tenga una API desarrollada de módulos con muchos métodos que toman varios parámetros, necesitamos encontrar algo más conveniente. Por ejemplo, use una interfaz predefinida que implementará cada módulo.

Aplicando este enfoque al ejemplo anterior, terminamos con los siguientes tres archivos:

  1. Archivo ModuleInterface.java con descripción API: paquete com.example.modules; Interfaz pública ModuleInterface (public void run ();)
  2. Archivo Module.java con nuestra implementación de módulo: paquete com.example.modules.simple.Module; importar android.util.Log; El módulo de clase pública implementa ModuleInterface (public void run () (Log.d ("Módulo", "¡¡¡Estoy vivo !!!");))
  3. Nuevo cargador de módulos (póngalo en su aplicación): String modFile = "/sdcard/myapp/module.jar"; String appDir = getApplicationInfo (). DataDir; DexClassLoader classLoader = nuevo DexClassLoader (modFile, appDir, null, getClass (). GetClassLoader ()); // Cargue la clase y cree un objeto con la interfaz ModuleInterface ModuleInterface module; probar (Claseclass = classLoader.loadClass ("com.example.modules.simple.Module"); módulo = (ModuleInterface) class.newInstance (); ) catch (Excepción e) (e.printStackTrace ();) module.run ()

Es todo. Ahora podemos trabajar con el módulo como con un objeto normal. Además, el propio sistema rechaza módulos (clases) que son incompatibles con la interfaz, incluso en la etapa de carga, por lo que no tenemos que preguntarnos si el módulo contiene el método que necesitamos.

Cuando hay muchos módulos

Hemos tratado con un módulo, pero ¿y si hay muchos? ¿Cómo hacer un seguimiento de estos módulos y no perderse entre ellos? De hecho, todo es simple: puede usar un mapa hash para esto. Cambiemos de nuevo el gestor de arranque:

La continuación está disponible solo para los participantes.

Opción 1. Únase a la comunidad del "sitio" para leer todos los materiales del sitio

La membresía en la comunidad dentro del período especificado le dará acceso a TODOS los materiales de Hacker, aumentará su descuento acumulativo personal y le permitirá acumular una puntuación Xakep profesional.



Android Studio: el módulo no se mostrará en "Edición de configuración" (13)

A veces existen errores en el manifiesto de Android debido a que hay una imagen en forma de cruz en la configuración de ejecución / depuración, así que intente buscar si el manifiesto de Android tiene algún error en un caso.

He importado un proyecto en Android Studio con varios subproyectos.

Quiero ejecutar un subproyecto.

He realizado con éxito estos subproyectos build.gradle como módulo.

Para ejecutarlo, fui a Ejecutar> Editar configuraciones> Aplicación de Android.

Problema. Cuando intento seleccionar un módulo, ninguno de ellos aparece en el menú desplegable.

¿Por qué es esto?

EDITAR: Aparece como un módulo en Groovy, pero no en la aplicación de Android. ¿Cómo puedo obtenerlo en mi aplicación de Android?

ir a Android >> Gradle Scripts >> Build Gradle (Módulo: aplicación)

asegúrese de que la primera línea de este archivo se vea así.

Aplicar complemento: "com.android.library"

Para mí, se solucionó con solo reiniciar Android Studio ... Como en los viejos tiempos de Eclipse

Para mi caso, novato, rugí con mi proyecto, no sé cómo, pero ya no funcionará y me quejé del manifiesto, R, todo. Me di cuenta de que algunos son como en mi entorno. Gradle no incluyó ": app", solo agregué esto, estaba en camino de nuevo.

Finalmente descubrí por qué el módulo no se muestra cuando agrego config para AndroidTests para el módulo com.android.library.

Si construye.gradle su módulo de biblioteca en build.gradle de su aplicación de esta manera:

Compilar proyecto (": yourlibrary")

Dado que está compilado con el modo de lanzamiento para un módulo de biblioteca de forma predeterminada, no puede ejecutar pruebas de Android en él, por lo que no aparecerá en la lista de módulos. Lo arreglé con la siguiente modificación:

Agregue la siguiente configuración al build.gradle de su módulo de biblioteca:

PublishNonDefault verdadero

build.gradle los siguientes cambios, puede depurar la compilación de su biblioteca editando el build.gradle de su módulo de aplicación, por ejemplo:

Proyecto de compilación (": yourlibrary") + proyecto debugCompile (ruta: ": yourlibrary", configuración: "debug") + proyecto releaseCompile (ruta: ": yourlibrary", configuración: "release")

Luego sincronícelo y lo encontrará en la lista.

Parece que diferentes soluciones funcionan para personas con diferencias, ya que simplemente cerré el proyecto e importarlo nuevamente resolvió el problema.

Tuve un problema similar, cuando seleccioné el directorio principal de mi proyecto, resolví Cerrar proyecto -> Eliminar proyecto de Android Studio -> Importar proyecto seleccionando el archivo a la derecha build.gradle .

Asegúrese de seleccionar el archivo build.gradle correcto durante la importación.

Asegúrese de que su build.gradle

Aplicar complemento: "com.android.application"

Una vez que haya cambiado, intente sincronizar nuevamente.

Esto sucede principalmente al copiar un proyecto de biblioteca y crearlo. La solución sería agregar

Aplicar complemento: "com.android.application"

en su archivo build.gradle, en lugar de

Aplicar complemento: "com.android.library"

Luego sincroniza el gradiente

orderEntry type = "library" exported = "" name = "appcompat-v7-19.1.0" level = "project" />

Arreglé esto agregando bordes en configuración del módulo... Ellos están perdidos. > abrir Configuración del módulo > Fronteras > Agregar caras(signo "+" en la parte superior)> Androide... Después de agregar caras, tendrá módulos.

ACTUALIZAR:

Para obtener la última versión del degradado Se han eliminado las facetas, ahora puede agregar módulos directamente. haga clic derecho en el proyecto > abrir la configuración del módulo > Agregar módulo(en la parte superior del signo "+")> Aplicación "Teléfono y tableta"(ahora puede crear un nuevo módulo y personalizarlo).

agregue su moudle a sus aplicaciones. archivo iml como: orderEntry type = "module" module-name = "yourmoudlename" exported = ""