Android Instant App с собственной библиотекой C ++ не публикуется на устройстве / симуляторе под управлением Android N

Есть ли способ заставить приложение Android Instant работать с нативной библиотекой C ++?

Я пытаюсь опубликовать Android Instant App на устройстве / симуляторе, но столкнулся с проблемами с моей родной библиотекой C ++. Он хорошо публикуется как устанавливаемое приложение, но не может найти библиотеку, когда публикуется как мгновенное приложение.

Чтобы устранить любые другие проблемы, я начал новый проект в Android Studio 3.0 (канарейка 1 171.4010489) с мастером нового проекта и выбрал следующие параметры:

Первая страница:

  • Включить поддержку C ++ проверено

Вторая страница:

  • Телефон и планшет выбраны
  • Включить поддержку Android Instant App проверено

Шестая страница:

  • Стандарт C ++ установлен на «C ++ 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'
}

Функция / 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 Issue Tracker

Хотя я чувствую, что инструменты для этого уже доступны (Gradle, CMake, NDK и т. Д.)

Также спасибо @Anirudh за сообщение, что это известная проблема на Android N.

Работает ли на моем устройстве публикация Instant App без библиотеки C ++?

Да … если я создаю новый проект Android Studio только с Include Android Instant App support он публикуется на моем Samsung Galaxy 7S и показывает «Hello World!» экран.

Работает ли публикация подписанного APK?

Генерация подписанного APK работает, и после проверки встроенная библиотека C ++ поставляется вместе с feature-debug.apk но не base-debug.apk, Это то, что я ожидал, учитывая конфигурацию Gradle, но не объясняет, почему он не будет публиковаться на устройстве / симуляторе.

Я не пробовал загружать эти APK-файлы … но я скептически отношусь к этому, если это вообще возможно, учитывая, что приложение Instant не устанавливается … напр .: как бы вы запустили его после его загрузки (нажмите на ссылку?)

Работает ли добавление библиотеки 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'
}

5

Решение

Работает ли публикация подписанного APK?

Android Studio 3.0 Предварительный просмотр Создание подписанного APK функция имеет ошибку в настоящее время, когда окончательный ZIP-файл не включает в себя все функции apks. Используйте Gradle SigningConfig в файле gradle каждого функционального модуля, чтобы подписать ваши файлы функций

Работает ли добавление библиотеки C ++ в оба APK?

Не требуется. Добавление в базовую функцию apk должно быть достаточно

Фактический сбой — известная проблема с поддержкой NDK для Android Instant Apps на Android M / N. Приложение работает на эмуляторе Android O

3

Другие решения

Других решений пока нет …