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

Есть ли способ заставить 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'
}

person stephenspann    schedule 24.05.2017    source источник
comment
Под публикацией вы имели в виду развертывание в Google Play Store? Вы можете проверить zip-файл мгновенного приложения с помощью Apk Analyzer, чтобы убедиться, что ваши библиотеки связаны.   -  person Anirudh    schedule 25.05.2017
comment
@Anirudh под «публикацией» я имею в виду устройство или симулятор ... отредактировал вопрос, спасибо!   -  person stephenspann    schedule 25.05.2017
comment
@Anirudh Я могу создать подписанный APK, и после проверки библиотека связана с feature-debug.apk, но не с base-debug.apk. Это то, что я ожидал, учитывая конфигурацию gradle.   -  person stephenspann    schedule 25.05.2017
comment
Предварительный просмотр Android Studio 3.0 В функции «Создать подписанный APK» в настоящее время есть ошибка, из-за которой окончательный zip-файл не включает все APK-файлы функций. Используйте Gradle SigningConfig в файле gradle каждого функционального модуля, чтобы подписать ваши apk-файлы.   -  person Anirudh    schedule 25.05.2017
comment
@Anirudh Это приятно знать ... но на самом деле меня даже не беспокоит подписанный APK на данный момент ... Мне просто нужно протестировать мгновенное приложение на устройстве или симуляторе.   -  person stephenspann    schedule 25.05.2017
comment
Загрузите свой образец на Диск, и я посмотрю   -  person Anirudh    schedule 25.05.2017
comment
Давайте продолжим обсуждение в чате.   -  person stephenspann    schedule 25.05.2017
comment
есть новости по этому вопросу? у меня такая же проблема   -  person alexm    schedule 14.11.2018
comment
@alexm нет новостей ... Я только что попробовал те же шаги с последней студией Android, но получил тот же результат.   -  person stephenspann    schedule 15.11.2018


Ответы (1)


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

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

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

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

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

person Anirudh    schedule 25.05.2017