Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cómo compilar su propia aplicación de Android en una imagen del sistema?

¿Cómo compilar su propia aplicación de Android en una imagen del sistema?

1. Cree el entorno de compilación

Entorno de compilación: Ubuntu 10.10

Versión de Android: Android 2.2

Durante el proceso de compilación, es posible que necesite instalar el software necesario en Se instaló el siguiente software en Ubuntu, que puede diferir en diferentes sistemas:

jdk6 (Android recomienda oficialmente instalar jdk5, pero encontré un problema de cobertura de Java al compilar y no hubo problema si lo cambié. a 6), bison, lib64z1-dev, libasound2-dev, flex, gperf, libncurses5-dev

2. Directorio de almacenamiento de aplicaciones

SimpleJNI es un programa escrito con Android NDK y Java. , incluido apk y otros archivos de bibliotecas cuyo código fuente se encuentra en el directorio desarrollo/samples/ del árbol fuente.

De hecho, no existe un límite claro en el directorio del paquete compilado. La ubicación del apk compilado está determinada por el tipo de compilación especificado por Android.mk en el directorio, por ejemplo: <. /p>

SimpleJNI Android.mk en el directorio raíz tiene una línea que incluye $(BUILD_PACKAGE), lo que indica que el código fuente se encuentra en el directorio desarrollo/samples/ del árbol de código fuente.

Android.mk en el directorio SimpleJNI/jni tiene una línea que incluye $(BUILD_SHARED_LIBRARY), lo que significa que los módulos en este directorio se han compilado en paquetes, es decir, archivos apk, que se almacenan en /system/ aplicación de forma predeterminada. El archivo nativo.cpp en este directorio se compila en el archivo de biblioteca ***enjoy, es decir, el archivo La ubicación predeterminada es /system/lib

Por lo tanto, si queremos compilar nuestro programa en una imagen. , simplemente copie todo el proyecto completado en Eclipse a un directorio en el árbol del código fuente. Normalmente lo pongo en el directorio paquetes/aplicaciones.

3. Agregue Android.mk

Después de completar el paso anterior, podemos ver que Android.mk juega un papel vital en el proceso de compilación. En realidad, son los archivos de compilación de Android. en el medio ambiente. Android.mk sigue el modelo de Android.mk de SimpleJNI, pero con ligeras modificaciones. Primero echemos un vistazo al contenido de los dos archivos Android.mk en el directorio SimpleJNI:

El archivo Android.mk en el directorio raíz

Android.mk.

Contenido en mk:

TOP_LOCAL_PATH:= $(call my-dir)

# Actividad de compilación

LOCAL_PATH:= $(TOP_LOCAL_PATH)

incluir $(CLEAR_VARS)

LOCAL_MODULE_TAGS := muestras

LOCAL_SRC_FILES := $(llamar a todos los archivos subdir-java)

LOCAL_PACKAGE_NAME : = SimpleJNI

LOCAL_JNI_SHARED_LIBRARIES := libsimplejni

LOCAL_PROGUARD_ENABLED := deshabilitado

incluye $(BUILD_PACKAGE)

# ====== == ================================================= == ==

# También cree todos los subobjetivos bajo este objetivo: bibliotecas compartidas.

incluir $(call all-makefiles-under,$(LOCAL_PATH))

Android.mk en el directorio raíz determina la configuración de toda la compilación del proyecto, entre los cuales

LOCAL_PATH define el directorio actual

LOCAL_MUDULE_TAGS define el tipo del módulo actual El compilador compilará de manera diferente según el tipo. Algunas etiquetas del módulo ni siquiera se compilarán. el sistema. LOCAL_MUDULE_TAGS incluye principalmente los siguientes tipos: usuario depuración pruebas de ingeniería muestras opcionales shell_ash shell_mksh. Opcional significa que se compilará en una imagen bajo las condiciones de compilación de todas las versiones, y el resto significa que se compilará en una imagen solo en esta versión. Por ejemplo, usuario significa que se compilará en un archivo de imagen únicamente. en la versión de usuario.

Esto es opcional de forma predeterminada para archivos mk que contienen LOCAL_PACKAGE_NAME, consulte build/core/package.mk. No estoy seguro de qué papel desempeñan las muestras en SimpleJNI, pero mis propias aplicaciones generalmente se definen como opcionales solo para estar seguro.

LOCAL_SRC_FILES define el directorio de código java requerido para compilar el apk

LOCAL_PACKAGE_NAME debe cambiarse a su propio nombre de paquete aquí

LOCAL_JNI_SHARED_LIBRARIES define el archivo que se incluirá Nombre de la biblioteca, esta línea no es necesaria si su programa no usa JNI.

LOCAL_PROGUARD_ENABLED define el método de compresión ProGuard desarrollado en Java, que se utiliza principalmente para analizar programas comprimidos. No agregué esta línea en mi aplicación.

include $(BUILD_PACKAGE) Esta línea es la clave para la compilación, lo que significa compilar el código java actual en apk

include $(call all-makefiles-under,$(LOCAL_PATH) significa que los archivos de este directorio son necesarios para crear subdirectorios, de modo que el sistema de compilación busque Android.mk en los subdirectorios del directorio actual para crear otros programas como este.

Basado en el contenido anterior, creé mi propio Android.mk, de la siguiente manera:

TOP_LOCAL_PATH:= $(call my-dir)

# Compilación actividad

LOCAL_PATH:= $(TOP_LOCAL_PATH)

LOCAL_PATH:= $(call my-dir)

# Actividades de compilación

El La siguiente es la lista de subdirectorios del directorio actual.

incluir $(CLEAR_VARS)

LOCAL_MODULE_TAGS := Opcional

LOCAL_SRC_FILES := $(llamar a todos los subdirectorios-java-files)

LOCAL_PACKAGE_ NAME := TestJniApp

LOCAL_JNI_SHARED_LIBRARIES := libtestjniapp

incluye $(BUILD_PACKAGE)

# ============ = =============== =================================

# También cree todos los subobjetivos bajo este objetivo: bibliotecas compartidas.

include $(call all- makefiles-under,$(LOCAL_PATH))

Parece simple y básicamente no requiere cambios.

Android.mk en el directorio Jni

Dado que nuestra TestJniApp se realiza usando JNI y contiene código fuente C, también necesitamos agregar Android.mk en el directorio jni. Verifique nuevamente el contenido de Android.mk en el directorio jni en SimpleJNI:

LOCAL_PATH := $(call my-dir)

incluir $(CLEAR_VARS)

LOCAL_MODULE_TAGS := muestras

# Este es el objetivo que se está construyendo.

LOCAL_MODULE:= libsimplejni

# Todos los archivos fuente que compilaremos.

LOCAL_SRC_FILES:= /

nativo.

LOCAL_SHARED_LIBRARIES := /

libutils

# Sin biblioteca estática .

LOCAL_STATIC_ LIBRARIES := /

# También requiere archivos de encabezado JNI.

LOCAL_C_INCLUDES += /

$(JNI_H_INCLUDE)

# Sin indicadores especiales del compilador. LOCAL_CFLAGS +=

# No previncular esta biblioteca. Para mejorar la eficiencia del código, es posible que desee

# agregar esta biblioteca al mapa de prevínculo y establecerlo en verdadero. Sin embargo, esto es

# difícil de hacer con aplicaciones que no se envían como parte de la imagen del sistema.

LOCAL_PRELINK_MODULE := false

LOCAL_PRELINK_MODULE := false# No previncular esta biblioteca.

MODULE := false

incluye $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE El nombre del módulo actual, es decir, el nombre del archivo compilado

LOCAL_SRC_FILES El archivo a compilar

LOCAL _SHARED_LIBRARIES, LOCAL_STATIC_LIBRARIES Bibliotecas dinámicas y estáticas que se vincularán con este módulo.

LOCAL_C_INCLUDES Archivos de encabezado para incluir

LOCAL_CFLAGS Opciones de compilación del lenguaje C

LOCAL_PRELINK_MODULE Define si se utiliza la herramienta de prevínculo. Las herramientas de prevínculo aceleran la carga al vincularlas con bibliotecas que disfrutamos de antemano en lugar de vincularlas en tiempo de ejecución, lo que no solo acelera el inicio sino también el proceso. No sólo acelera el inicio, sino que también reduce la sobrecarga de memoria.

Después de la modificación, Android.mk en el directorio jni de mi propia TestJniApp es el siguiente:

LOCAL_PATH := $(call my-dir)

incluir $ (CLEAR_VARS)

LOCAL_MODULE := libtestjniapp

LOCAL_SRC_FILES := com_test_app_Jni.c

LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)

LOCAL_PRELINK_MODULE : = false

include $(BUILD_SHARED_LIBRARY)

Una cosa a tener en cuenta aquí es que si desea compilar el archivo so en un archivo de imagen, debe modificar LOCAL_MODULE_TAGS y cambiar el valor original de las muestras para el usuario o elimínelo directamente. La razón es que para los archivos mk que contienen LOCAL_MODULE, si no se especifica LOCAL_MODULE_TAGS, el valor predeterminado será usuario. Solo si se define como usuario, el archivo so se compilará en una imagen. Su definición específica se puede encontrar en build/. core/base_rule.mk.

4. Modifique /bulid/target/product/generic.mk y compile el proyecto en el sistema

En este momento, queda una última tarea. Para compilar el proyecto en la imagen, también debe agregar el nombre del paquete en el archivo /bulid/target/product/generic.mk

PRODUCT_PACKAGES := /

AccountAndSyncSettings /

p>

CarHome /

DeskClock /

......

SyncProvider /

TestJniApp

Después de completar los pasos anteriores, compile la imagen en el directorio raíz del árbol del código fuente.