Есть ли способ заставить Android Instant App работать с собственной библиотекой C++?
Я пытаюсь опубликовать приложение с мгновенным запуском Android на устройстве/симуляторе, но столкнулся с проблемами с моей родной библиотекой C++. Он отлично публикуется как устанавливаемое приложение, но не может найти библиотеку при публикации как мгновенное приложение.
Чтобы устранить любые другие проблемы, я начал новый проект в Android Studio 3.0 (Canary 1 171.4010489) с помощью мастера создания нового проекта и выберите следующие настройки:
Первая страница:
- Включить поддержку C++ проверено
Вторая страница:
- Выбраны телефон и планшет
- Включить поддержку Android Instant App проверено
Шестая страница:
- Стандарт С++ установлен на «С++ 11»
- Поддержка исключений (-fexceptions) отмечена
- Поддержка информации о типе среды выполнения (-frtti) отмечена
Полученный проект будет опубликован как устанавливаемое приложение (показывающее экран «Привет с C++»), но не мгновенное приложение... оно выдает следующую ошибку, что не может найти библиотеку, что является той же ошибкой, которую я получаю в проект моего фактического приложения:
couldn't find "libnative-lib.so"
Полная ошибка:
05-24 17:48:30.316 7519-7519/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mycompany.instantapp, PID: 7519
java.lang.UnsatisfiedLinkError: byc[DexPathList[[zip file "/data/user/0/com.google.android.instantapps.supervisor/files/atom-cache/com.mycompany.instantapp/atom-download--feature-1495662507463/feature.jar"],nativeLibraryDirectories=[/data/user/0/com.google.android.instantapps.supervisor/files/native-lib/com.mycompany.instantapp, /system/lib, /vendor/lib]]] couldn't find "libnative-lib.so"
...
Я вставляю соответствующие файлы Gradle ниже (все сгенерированы Android Studio):
приложение/build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0 rc2"
defaultConfig {
applicationId "com.mycompany.instantapp"
minSdkVersion 23
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation project(':feature')
implementation project(':base')
}
база/build.gradle:
apply plugin: 'com.android.feature'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0 rc2"
baseFeature true
defaultConfig {
minSdkVersion 23
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
feature project(':feature')
compile 'com.android.support:appcompat-v7:25.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
}
feature/build.gradle:
apply plugin: 'com.android.feature'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0 rc2"
defaultConfig {
minSdkVersion 23
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation project(':base')
testCompile 'junit:junit:4.12'
}
instantapp/build.gradle:
apply plugin: 'com.android.instantapp'
dependencies {
implementation project(':feature')
implementation project(':base')
}
Обновления:
Я подал заявку в Google:
Ссылка: система отслеживания ошибок Google.
Хотя я чувствую, что инструменты для этого уже доступны (Gradle, CMake, NDK и т. д.)
Также спасибо @Anirudh за то, что сообщили мне, что это известная проблема на Android N.
Работает ли публикация приложения с мгновенным запуском без библиотеки C++ на моем устройстве?
Да... если я создаю новый проект Android Studio только с Include Android Instant App support
, он публикуется на моем Samsung Galaxy 7S и показывает "Hello World!" экран.
Работает ли публикация подписанного APK?
Генерация подписанного APK работает, и после проверки собственная библиотека C++ связана с feature-debug.apk
, но не с base-debug.apk
. Это то, что я ожидал, учитывая конфигурацию Gradle, но не объясняет, почему он не будет опубликован на устройстве/симуляторе.
Я не пробовал загружать эти APK-файлы... но я скептически отношусь к тому, что это возможно, учитывая, что мгновенное приложение никогда не устанавливается... например: как бы вы вообще запустили его после загрузки (щелкните URL-адрес?)
Работает ли добавление библиотеки C++ в оба APK?
Я попытался добавить свойства externalNativeBuild
gradle как в файлы base/build.gradle
, так и в файлы feature/build.gradle
, но все равно возникает та же ошибка. Я убедился, что нативная библиотека C++ затем включается в оба APK, проверив как feature-debug.apk
, так и base-debug.apk
после создания подписанного APK.
измененная база/build.gradle:
apply plugin: 'com.android.feature'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0 rc2"
baseFeature true
defaultConfig {
minSdkVersion 23
targetSdkVersion 25
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "../feature/CMakeLists.txt"
}
}
}
dependencies {
feature project(':feature')
compile 'com.android.support:appcompat-v7:25.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
}