Abilitare le funzioni EasyAR in un'applicazione Android
Questo capitolo presenta come configurare un progetto Android di EasyAR in Android Studio senza usare un 3D engine come Unity.
Preparazione
Prima di iniziare, è necessario preparare:
L'ultima versione di Android Studio
JDK 8/11/17
Android Gradle Plugin 4.0 o superiore
Android NDK r28 o superiore
Ottenere una licenza di autorizzazione EasyAR
Selezionare una versione di rilascio e scaricare EasyAR Sense
Nota
Non tutti i dispositivi Android supportano tutte le funzioni di EasyAR Sense. Alcune funzioni dipendono da hardware o configurazioni aggiuntive. Per i dettagli, consultare la lista dei dispositivi supportati dalla funzione corrispondente.
Importare EasyAR Sense for Android
Questa sezione presenta come importare EasyAR Sense SDK in un progetto Android non Unity. EasyAR Sense fornisce API Java e C++ e supporta Kotlin, quindi è possibile sviluppare con il linguaggio più familiare.
Poiché i metodi di configurazione dei diversi IDE possono variare, qui viene descritto solo il metodo di configurazione tipico basato su Android Studio + Gradle.
Scegliere il metodo di utilizzo dell'API
EasyAR Sense for Android fornisce due metodi di utilizzo API:
- Usare solo la Java API
- Usare le API Java e C++
Scegliere una delle due configurazioni in base ai requisiti del progetto.
Usare solo la Java API
Quando si usa solo la Java API di EasyAR, non è necessaria la configurazione NDK.
Mettere EasyAR.aar in app/libs/ o nella directory specificata da Gradle.
Usare le API Java e C++
Quando è necessario usare contemporaneamente la C++ API di EasyAR, è necessario configurare sia le dipendenze Java sia le librerie native.
File del layer Java
Mettere
EasyAR.jarinapp/libs/o nel percorso specificato da Gradle.Librerie native (
.so)Mettere le librerie native fornite da EasyAR in base all'ABI nel seguente percorso o nel percorso specificato da Gradle.
app/src/main/jniLibs/ ├── armeabi-v7a/ │ └── libEasyAR.so └── arm64-v8a/ └── libEasyAR.soFile header C++
Copiare la cartella
easyarsotto la directoryincludein EasyAR SDK nel seguente percorso o nel percorso specificato daAndroid.mk/CMakeLists.txt.app/src/main/jni/easyar/Il percorso dei file header deve essere specificato esplicitamente in
Android.mkoCMakeLists.txt.
Note di configurazione Gradle
Quando si usa la C++ API, è necessario abilitare Native Build in Gradle. Se si usa solo la Java API, non è richiesta alcuna configurazione. È possibile configurarlo con ndk-build (Android.mk).
Aggiungere quanto segue in app/build.gradle:
android {
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
}
Se si usa CMake, fare riferimento alla documentazione ufficiale Google per la configurazione.
Configurazione NDK
Dichiarare EasyAR come libreria precompilata
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)
Collegare EasyAR e le librerie di sistema
LOCAL_SHARED_LIBRARIES += EasyAR
# OpenGL ES (required)
LOCAL_LDLIBS += -lGLESv3
EasyAR richiede almeno OpenGL ES 2.0 a runtime. OpenGL ES 3.0 (
GLESv3) è consigliato.
Specificare le architetture ABI
Specificare esplicitamente ABI in app/build.gradle per evitare di pacchettizzare architetture non valide:
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
}
Se serve una sola architettura, mantenere solo l'elemento corrispondente.
Configurazione dei permessi AndroidManifest
EasyAR Sense richiede i seguenti permessi. Permessi mancanti causeranno errore di inizializzazione o schermo nero:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
Esempio 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>
Inizializzare EasyAR
Chiamare Engine.initialize all'avvio dell'applicazione per eseguire l'inizializzazione.
Esempio (Java):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Engine.initialize(this, key);
}
Nota
L'inizializzazione deve essere completata prima di usare funzionalità relative a EasyAR.
Configurazione aggiuntiva
Sulla piattaforma Android, a seconda della versione del sistema e delle funzioni usate, potrebbe essere necessario prestare attenzione anche alle seguenti configurazioni e limitazioni.
Configurare l'uso di ARCore
Se il progetto usa ARCore, fare riferimento alla documentazione ufficiale per completare la configurazione relativa di AndroidManifest.xml e build.gradle.
Inoltre, prima di inizializzare EasyAR, è necessario caricare esplicitamente la native library di ARCore:
System.loadLibrary("arcore_sdk_c");
Nota
Quando si usano versioni precedenti ad ARCore v1.19.0, ARCore non può essere rilevato su Android 11.
Questo perché Android 11 ha introdotto restrizioni di app visibility e il nome package di ARCore deve essere dichiarato in AndroidManifest.xml.
<queries>
<package android:name="com.google.ar.core" />
</queries>
Configurare obfuscation (ProGuard)
Se l'obfuscation è abilitata per il codice Java, è necessario escludere il namespace cn.easyar.
EasyAR Sense usa a runtime class name reflection per ottenere Java types tramite JNI.
Se le classi sotto cn.easyar vengono obfuscated o rinominate, può verificarsi undefined behavior.
Regole di base
-keep class cn.easyar.** { *; }
Regole precise consigliate
-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
Le regole ProGuard sopra sono già incluse nella aar library di EasyAR, quindi di solito non è necessario configurarle di nuovo.
Scoped Storage
Il meccanismo Scoped Storage introdotto da Android 10 influisce su alcune API che dipendono da file paths. Ciò è dovuto al fatto che non-media paths sotto /sdcard, come directory personalizzate, non possono essere accessibili direttamente su Android 10. L'impatto su EasyAR è che alcune API che richiedono file paths, come screen recording, su Android 10 non supportano lettura e scrittura diretta di media paths, ma funzionano normalmente su Android 11.
Soluzioni:
Soluzione semplice (Android 10) Disabilitare Scoped Storage in
AndroidManifest.xml:<application android:requestLegacyExternalStorage="true" ... > </application>Soluzione consigliata
- Usare solo app internal storage
- Oppure scambiare dati con media paths tramite MediaStore
Android Gradle Plugin e NDK
A partire da NDK r22, viene usato di default il linker LLD e deve essere usato insieme a llvm-strip; questo non è compatibile con lo strumento strip integrato nelle versioni di Android Gradle Plugin precedenti alla 4.0.
Soluzioni:
- Aggiornare a Android Gradle Plugin 4.0 o successivo
- Oppure usare
doNotStripinpackagingOptionsper disabilitare stripping (non consigliato)
Limite di lunghezza del path su Windows
Su Windows, se la lunghezza assoluta del path di qualsiasi file nel progetto, inclusi i file temporanei generati durante il build, supera 260 caratteri, il build di Android Studio può fallire.
Soluzioni:
- Posizionare il progetto in un path più breve, ad esempio
C:\user\project - Evitare livelli di directory troppo profondi