lunes , julio 6 2020
Home / Desarrollo Android / Dependencias nativas en Android Studio 4.0

Dependencias nativas en Android Studio 4.0

Escrito por el ingeniero de software Dan Albert

Una cosa que los usuarios de NDK han encontrado es administrar dependencias nativas:

  • Los autores de la biblioteca necesitan mantener el soporte para ndk-build y CMake (y esperan que sus usuarios usen una de estas dos opciones y no la otra).
  • Las bibliotecas no siempre distribuyen binarios preconstruidos para Android, por lo que los usuarios deben compilar las bibliotecas ellos mismos o confiar en (posiblemente no confiables) binarios preconstruidos que se encuentran en otros lugares de la web.
  • Los scripts de compilación específicos de Android a menudo están desactualizados y ya no funcionan.
  • Las bibliotecas a veces se crean mediante sistemas de compilación que no son compatibles con Android.
  • La biblioteca puede fallar al construir en la computadora del usuario. Por ejemplo, los scripts de shell de Unix no se ejecutarán en Windows.
  • Las bibliotecas a menudo dependen de otras bibliotecas, por lo que los usuarios tienen que perseguirlas y reiniciar el proceso.

Usando el complemento Android Gradle versión 4.0, hemos agregado soporte para distribuir y exponer bibliotecas nativas usando el mismo mecanismo que la biblioteca Java, resolviendo así estos problemas: Android Archive (AAR).

Por ejemplo, así es como usas curl y jsoncpp (y obtienes automáticamente las dependencias implícitas de OpenSSL que curl tiene):

  // build.gradle
Dependencias {
Darse cuenta de & # 39; com.android.ndk.thirdparty: curl: 7.68.0-alpha-1 & # 39;
Darse cuenta de & # 39; com.android.ndk.thirdparty: jsoncpp: 1.8.4-alpha-1 & # 39;
}

Nota: El uso de AGP 4.0 sigue siendo experimental, por lo que para habilitar esta función, las siguientes propiedades deben establecerse en el archivo gradle.properties del proyecto:

 # Habilitar prefabricación
android.enablePrefab = true
#Solve https://issuetracker.google.com/149575364
android.enableParallelJsonGen = false
El valor predeterminado de # 4.0.0 canary 9 es Prefab 1.0.0-alpha3, que no es el último.
android.prefabVersion = 1.0.0-alpha5

Importa paquetes en tu compilación

Declara dependencias en tu build.gradle hará que Gradle descargue esas dependencias de Maven, pero aún tienes que instruir a CMake o ndk- Cómo construir debería depender de esas dependencias. Afortunadamente, la configuración del paquete CMake o el módulo ndk-build necesarios se generarán automáticamente en su nombre. Todo lo que necesitas hacer es importarlos y usarlos.

El siguiente es un ejemplo de CMake:

  cmake_minimum_required (versión 3.6)
Proyecto (versión de la aplicación 1.0.0 IDIOMAS CXX)

Find_package (requiere configuración de curl)
Find_package (requiere la configuración de jsoncpp)

Add_library (app.cpp para compartir aplicaciones)
Target_link_libraries (aplicación curl :: curl jsoncpp :: jsoncpp)

Este es el mismo ejemplo de ndk-build:

  LOCAL_PATH: = $ (llamar a mi-dir)

Incluir $ (CLEAR_VARS)
LOCAL_MODULE: = libapp
LOCAL_SRC_FILES: = app.cpp
LOCAL_SHARED_LIBRARIES: = jsoncpp curl
Incluir $ (BUILD_SHARED_LIBRARY)

(Llamar módulo de importación, prefab / curl)
$ (Llamar módulo de importación, prefab / jsoncpp)

Eso es todo. Ahora puede hacer lo siguiente en app.cpp :

  #include "curl / curl.h"
#include "json / json.h"

Un problema muy común que encuentran las personas es construir OpenSSL que funciona con curl. Aunque no se menciona explícitamente en el script de compilación anterior, el paquete curl se basa en OpenSSL, por lo que este soporte está disponible automáticamente.

Para un ejemplo completo, vea el ejemplo curl-ssl.

Prefab

Una herramienta que simplifica todo este trabajo se llama Prefab. Cada AAR que expone la biblioteca C ++ a sus usuarios empaqueta su biblioteca, encabezados y una pequeña cantidad de metadatos en el directorio prefabricado en el AAR. Si el directorio prefabricado se encuentra en las dependencias AAR, el complemento Android Gradle ejecuta Prefab automáticamente para generar un script de sistema de compilación basado en la información que contiene.

Cada AAR puede contener una gran cantidad de preconstrucciones para diferentes configuraciones, por lo que Prefab realizará muchas comprobaciones de compatibilidad para encontrar una biblioteca que se ajuste a su configuración de compilación. La biblioteca seleccionada coincidirá con el ABI de su compilación, minSdkVersion la selección STL, y se ajustará mejor a la versión de NDK que está utilizando.

¿Qué bibliotecas están disponibles?

Hemos lanzado las siguientes bibliotecas:

  • com.android.ndk.thirdparty: curl: 7.68.0-alpha-1
  • com.android.ndk.thirdparty: jsoncpp: 1.8.4-alpha-1
  • com.android.ndk.thirdparty: openssl: 1.1.1d-alpha-1
  • com.google.oboe: oboe: 1.3.0

Para obtener la lista más reciente, busque "com.android.ndk.thirdparty" en https://maven.google.com/web/index.html.

¿Cómo distribuyo mi biblioteca?

Para las bibliotecas distribuidas actualmente, escribimos ndkports. Si la biblioteca que está creando es un proyecto típico de Linux o multiplataforma, y ​​naturalmente no es adecuado para una compilación típica de Android, entonces es muy adecuado. Si se adapta a la biblioteca que desea, no dude en usar ndkports y considere enviarnos un parche.

Si desea solicitar a Google que mantenga y publique bibliotecas de código abierto en Prefab, utilice la plantilla de error "Solicitud de empaquetado" en https://github.com/google/prefab/issues. Tenga en cuenta que cada paquete tiene costos continuos, y agregaremos soporte de forma limitada, por lo que no podremos proporcionar todo el soporte.

El próximo soporte que viene es exponer su biblioteca en AAR usando el flujo de trabajo de publicación de la biblioteca de Android existente.

Enlace

Para obtener más información sobre el uso de dependencias nativas con el complemento Android Gradle, consulte la documentación. Para obtener más ejemplos, vea Ejemplos de NDK.

Si desea obtener más información sobre Prefab, consulte la documentación en GitHub.

Si encuentra algún problema, inicie sesión en nuestro rastreador de problemas.

Deja un comentario

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