Есть ли способ заставить приложение Android Instant работать с нативной библиотекой C ++?
Я пытаюсь опубликовать Android Instant App на устройстве / симуляторе, но столкнулся с проблемами с моей родной библиотекой C ++. Он хорошо публикуется как устанавливаемое приложение, но не может найти библиотеку, когда публикуется как мгновенное приложение.
Чтобы устранить любые другие проблемы, я начал новый проект в Android Studio 3.0 (канарейка 1 171.4010489) с мастером нового проекта и выбрал следующие параметры:
Первая страница:
Вторая страница:
Шестая страница:
Полученный проект будет опубликован в виде устанавливаемого приложения (с экраном «Привет из 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 Issue Tracker
Хотя я чувствую, что инструменты для этого уже доступны (Gradle, CMake, NDK и т. Д.)
Также спасибо @Anirudh за сообщение, что это известная проблема на Android N.
Да … если я создаю новый проект Android Studio только с Include Android Instant App support
он публикуется на моем Samsung Galaxy 7S и показывает «Hello World!» экран.
Генерация подписанного APK работает, и после проверки встроенная библиотека C ++ поставляется вместе с feature-debug.apk
но не base-debug.apk
, Это то, что я ожидал, учитывая конфигурацию Gradle, но не объясняет, почему он не будет публиковаться на устройстве / симуляторе.
Я не пробовал загружать эти APK-файлы … но я скептически отношусь к этому, если это вообще возможно, учитывая, что приложение Instant не устанавливается … напр .: как бы вы запустили его после его загрузки (нажмите на ссылку?)
Я пытался добавить 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'
}
Работает ли публикация подписанного APK?
Android Studio 3.0 Предварительный просмотр Создание подписанного APK функция имеет ошибку в настоящее время, когда окончательный ZIP-файл не включает в себя все функции apks. Используйте Gradle SigningConfig в файле gradle каждого функционального модуля, чтобы подписать ваши файлы функций
Работает ли добавление библиотеки C ++ в оба APK?
Не требуется. Добавление в базовую функцию apk должно быть достаточно
Фактический сбой — известная проблема с поддержкой NDK для Android Instant Apps на Android M / N. Приложение работает на эмуляторе Android O
Других решений пока нет …