Включение функций EasyAR в Android-приложении
В этой главе описывается, как настроить Android-проект EasyAR в Android Studio без использования 3D engine, такого как Unity.
Подготовка
Перед началом нужно подготовить:
Последнюю версию Android Studio
JDK 8/11/17
Android Gradle Plugin 4.0 или выше
Android NDK r28 или выше
Получить лицензию авторизации EasyAR
Выбрать версию выпуска и скачать EasyAR Sense
Примечание
Не все Android-устройства поддерживают все функции EasyAR Sense. Некоторые функции зависят от дополнительного hardware или конфигурации. Подробности см. в списке устройств, поддерживающих соответствующую функцию.
Импорт EasyAR Sense for Android
В этом разделе описывается, как импортировать EasyAR Sense SDK в Android-проект без Unity. EasyAR Sense предоставляет Java и C++ API и поддерживает Kotlin, поэтому вы можете разрабатывать на наиболее привычном языке.
Поскольку способы настройки в разных IDE могут отличаться, здесь описан только типичный способ настройки на основе Android Studio + Gradle.
Выбор способа использования API
EasyAR Sense for Android предоставляет два способа использования API:
- Использовать только Java API
- Использовать Java и C++ API
Выберите один из них для настройки в соответствии с требованиями проекта.
Использовать только Java API
При использовании только Java API EasyAR настройка NDK не требуется.
Поместите EasyAR.aar в app/libs/ или в каталог, указанный Gradle.
Использовать Java и C++ API
Если одновременно требуется использовать C++ API EasyAR, необходимо настроить как Java-зависимости, так и native-библиотеки.
Файлы Java-слоя
Поместите
EasyAR.jarвapp/libs/или в путь, указанный Gradle.Native-библиотеки (
.so)Поместите native-библиотеки, предоставленные EasyAR, по ABI в следующий путь или в путь, указанный Gradle.
app/src/main/jniLibs/ ├── armeabi-v7a/ │ └── libEasyAR.so └── arm64-v8a/ └── libEasyAR.soЗаголовочные файлы C++
Скопируйте папку
easyarиз каталогаincludeв EasyAR SDK в следующий путь или в путь, указанныйAndroid.mk/CMakeLists.txt.app/src/main/jni/easyar/Путь к заголовочным файлам должен быть явно указан в
Android.mkилиCMakeLists.txt.
Описание настройки Gradle
При использовании C++ API необходимо включить Native Build в Gradle. Если используется только Java API, настройка не требуется. Можно настроить через ndk-build (Android.mk).
Добавьте в app/build.gradle:
android {
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
}
Если используется CMake, см. официальную документацию Google по настройке.
Настройка NDK
Объявление EasyAR как предварительно собранной библиотеки
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)
Связывание EasyAR и системных библиотек
LOCAL_SHARED_LIBRARIES += EasyAR
# OpenGL ES (required)
LOCAL_LDLIBS += -lGLESv3
Для работы EasyAR требуется как минимум OpenGL ES 2.0. Рекомендуется OpenGL ES 3.0 (
GLESv3).
Указание архитектур ABI
Явно укажите ABI в app/build.gradle, чтобы избежать упаковки недопустимых архитектур:
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
}
Если нужна только одна архитектура, оставьте только соответствующий пункт.
Настройка разрешений AndroidManifest
EasyAR Sense требует следующие разрешения. Их отсутствие приведет к ошибке инициализации или черному экрану:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
Полный пример:
<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>
Инициализация EasyAR
Вызовите Engine.initialize при запуске приложения для инициализации.
Пример (Java):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Engine.initialize(this, key);
}
Примечание
Инициализация должна быть завершена до использования функций EasyAR.
Дополнительная конфигурация
На платформе Android, в зависимости от версии системы и используемых функций, также может потребоваться учитывать следующие конфигурации и ограничения.
Настройка использования ARCore
Если проект использует ARCore, обратитесь к его официальной документации, чтобы выполнить соответствующую настройку AndroidManifest.xml и build.gradle.
Кроме того, перед инициализацией EasyAR необходимо явно загрузить native library ARCore:
System.loadLibrary("arcore_sdk_c");
Примечание
При использовании версий до ARCore v1.19.0 ARCore не будет обнаруживаться на Android 11.
Это связано с тем, что начиная с Android 11 введены ограничения app visibility, и имя пакета ARCore нужно объявить в AndroidManifest.xml.
<queries>
<package android:name="com.google.ar.core" />
</queries>
Настройка obfuscation (ProGuard)
Если для Java-кода включена obfuscation, необходимо исключить namespace cn.easyar.
EasyAR Sense во время выполнения через JNI использует reflection имени класса для получения Java types.
Если классы в cn.easyar будут obfuscated или переименованы, может возникнуть undefined behavior.
Базовые правила
-keep class cn.easyar.** { *; }
Рекомендуемые точные правила
-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
Указанные выше правила ProGuard уже включены в aar library EasyAR, поэтому обычно повторная настройка не требуется.
Scoped Storage
Механизм Scoped Storage, введенный начиная с Android 10, влияет на некоторые API, зависящие от file paths. Это связано с тем, что non-media paths под /sdcard, например пользовательские каталоги, на Android 10 недоступны напрямую. Для EasyAR это проявляется в том, что некоторые API, требующие file paths, например screen recording, на Android 10 не поддерживают прямое чтение и запись media paths, но нормально работают на Android 11.
Решения:
Простой вариант (Android 10) Отключить Scoped Storage в
AndroidManifest.xml:<application android:requestLegacyExternalStorage="true" ... > </application>Рекомендуемый вариант
- Использовать только app internal storage
- Или обмениваться данными с media paths через MediaStore
Android Gradle Plugin и NDK
Начиная с NDK r22, по умолчанию используется linker LLD, и требуется совместное использование с llvm-strip; это несовместимо со встроенным tool strip в Android Gradle Plugin ниже версии 4.0.
Решения:
- Обновиться до Android Gradle Plugin 4.0 или выше
- Или использовать
doNotStripвpackagingOptions, чтобы отключить stripping (не рекомендуется)
Ограничение длины пути Windows
В Windows, если абсолютная длина пути любого файла в проекте, включая временные файлы, создаваемые во время build, превышает 260 символов, build в Android Studio может завершиться ошибкой.
Решения:
- Поместить проект в более короткий путь, например
C:\user\project - Избегать слишком глубоких уровней каталогов