Activar funciones EasyAR en una aplicación Android
Este capítulo presenta cómo configurar un proyecto Android de EasyAR en Android Studio sin usar un 3D engine como Unity.
Preparación
Antes de empezar, debe preparar:
La versión más reciente de Android Studio
JDK 8/11/17
Android Gradle Plugin 4.0 o superior
Android NDK r28 o superior
Obtener una licencia de autorización EasyAR
Seleccionar una versión de lanzamiento y descargar EasyAR Sense
Nota
No todos los dispositivos Android admiten todas las funciones de EasyAR Sense. Algunas funciones dependen de hardware o configuración adicional. Para más detalles, consulte la lista de dispositivos compatibles con la función correspondiente.
Importar EasyAR Sense for Android
Esta sección presenta cómo importar EasyAR Sense SDK en un proyecto Android que no usa Unity. EasyAR Sense proporciona API Java y C++ y admite Kotlin, por lo que puede desarrollar con el lenguaje con el que se sienta más cómodo.
Como los métodos de configuración pueden variar entre IDE, aquí solo se describe el método de configuración típico basado en Android Studio + Gradle.
Elegir el método de uso de la API
EasyAR Sense for Android proporciona dos métodos de uso de API:
- Usar solo la Java API
- Usar las API de Java y C++
Elija una de ellas para configurarla según los requisitos del proyecto.
Usar solo la Java API
Cuando solo se usa la Java API de EasyAR, no se requiere configurar NDK.
Coloque EasyAR.aar en app/libs/ o en el directorio especificado por Gradle.
Usar las API de Java y C++
Cuando necesite usar también la C++ API de EasyAR, debe configurar tanto las dependencias Java como las bibliotecas nativas.
Archivos de la capa Java
Coloque
EasyAR.jarenapp/libs/o en la ruta especificada por Gradle.Bibliotecas nativas (
.so)Coloque las bibliotecas nativas proporcionadas por EasyAR según ABI en la siguiente ruta o en la ruta especificada por Gradle.
app/src/main/jniLibs/ ├── armeabi-v7a/ │ └── libEasyAR.so └── arm64-v8a/ └── libEasyAR.soArchivos de cabecera C++
Copie la carpeta
easyardel directorioincludede EasyAR SDK en la siguiente ruta o en la ruta especificada porAndroid.mk/CMakeLists.txt.app/src/main/jni/easyar/La ruta de los archivos de cabecera debe especificarse explícitamente en
Android.mkoCMakeLists.txt.
Notas de configuración de Gradle
Cuando usa la C++ API, debe habilitar Native Build en Gradle. Si solo usa la Java API, no se requiere configuración. Puede configurarlo con ndk-build (Android.mk).
Agregue lo siguiente en app/build.gradle:
android {
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
}
Si usa CMake, consulte la documentación oficial de Google para la configuración.
Configuración de NDK
Declarar EasyAR como biblioteca precompilada
include $(CLEAR_VARS)
# Make sure this path points to the current ABI directory in jniLibs
LOCAL_PATH := $(LOCAL_PATH_TOP)/../jniLibs/$(TARGET_ARCH_ABI)
LOCAL_MODULE := EasyAR
LOCAL_SRC_FILES := libEasyAR.so
include $(PREBUILT_SHARED_LIBRARY)
Enlazar EasyAR y bibliotecas del sistema
LOCAL_SHARED_LIBRARIES += EasyAR
# OpenGL ES (required)
LOCAL_LDLIBS += -lGLESv3
EasyAR requiere al menos OpenGL ES 2.0 en tiempo de ejecución. Se recomienda OpenGL ES 3.0 (
GLESv3).
Especificar arquitecturas ABI
Especifique ABI explícitamente en app/build.gradle para evitar empaquetar arquitecturas no válidas:
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
}
Si solo necesita una arquitectura, conserve solo el elemento correspondiente.
Configuración de permisos de AndroidManifest
EasyAR Sense requiere los siguientes permisos. La ausencia de permisos provocará fallo de inicialización o pantalla negra:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
Ejemplo completo:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.easyar.samples.helloar">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
Inicializar EasyAR
Llame a Engine.initialize al iniciar la aplicación para inicializar.
Ejemplo (Java):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Engine.initialize(this, key);
}
Nota
La inicialización debe completarse antes de usar funciones relacionadas con EasyAR.
Configuración adicional
En la plataforma Android, según la versión del sistema y las funciones utilizadas, también puede ser necesario prestar atención a las siguientes configuraciones y restricciones.
Configurar el uso de ARCore
Si el proyecto usa ARCore, consulte su documentación oficial para completar la configuración relacionada de AndroidManifest.xml y build.gradle.
Además, antes de inicializar EasyAR, debe cargar explícitamente la native library de ARCore:
System.loadLibrary("arcore_sdk_c");
Nota
Al usar versiones anteriores a ARCore v1.19.0, ARCore no se podrá detectar en Android 11.
Esto se debe a que Android 11 introdujo restricciones de app visibility, y es necesario declarar el nombre de package de ARCore en AndroidManifest.xml.
<queries>
<package android:name="com.google.ar.core" />
</queries>
Configurar obfuscation (ProGuard)
Si se habilita obfuscation para el código Java, debe excluir el namespace cn.easyar.
EasyAR Sense usa reflection de nombres de clase para obtener Java types mediante JNI en runtime.
Si las clases bajo cn.easyar se obfuscate o renombran, puede producirse undefined behavior.
Reglas básicas
-keep class cn.easyar.** { *; }
Reglas precisas recomendadas
-dontwarn javax.annotation.Nonnull
-dontwarn javax.annotation.Nullable
-keepattributes *Annotation*
-keep class cn.easyar.RefBase { native <methods>; }
-keepclassmembers class cn.easyar.* {
<fields>;
protected <init>(long, cn.easyar.RefBase);
}
-keep,allowobfuscation interface cn.easyar.FunctorOf* { *; }
-keep class cn.easyar.Buffer { native <methods>; }
-keep class cn.easyar.Engine { native <methods>; }
-keep class cn.easyar.JniUtility { native <methods>; }
-keep class cn.easyar.engine.** { *; }
-keep class cn.easyar.CameraParameters
-keep interface cn.easyar.FunctorOfVoidFromInputFrame
Las reglas ProGuard anteriores ya están incluidas en la aar library de EasyAR, por lo que normalmente no es necesario configurarlas de nuevo.
Scoped Storage
El mecanismo Scoped Storage introducido a partir de Android 10 afecta a algunas API que dependen de file paths. Esto se debe a que las rutas non-media bajo /sdcard, como directorios personalizados, no pueden accederse directamente en Android 10. En EasyAR, el impacto se refleja en que algunas API que requieren file paths, como screen recording, no soportan lectura y escritura directa de media paths en Android 10, pero funcionan normalmente en Android 11.
Soluciones:
Solución simple (Android 10) Deshabilite Scoped Storage en
AndroidManifest.xml:<application android:requestLegacyExternalStorage="true" ... > </application>Solución recomendada
- Usar solo app internal storage
- O intercambiar datos con media paths mediante MediaStore
Android Gradle Plugin y NDK
Desde NDK r22, se usa por defecto el linker LLD y debe trabajar con llvm-strip; esto no es compatible con la herramienta strip integrada en Android Gradle Plugin anterior a 4.0.
Soluciones:
- Actualizar a Android Gradle Plugin 4.0 o superior
- O usar
doNotStripenpackagingOptionspara deshabilitar stripping (no recomendado)
Límite de longitud de ruta en Windows
En Windows, si la longitud absoluta de la ruta de cualquier archivo del proyecto, incluidos archivos temporales generados durante el build, supera 260 caracteres, el build de Android Studio puede fallar.
Soluciones:
- Colocar el proyecto en una ruta más corta, como
C:\user\project - Evitar niveles de directorio demasiado profundos