具有原生C++库的 Android 免安装应用不会发布到运行 Android N 的设备/模拟器

Android Instant App with Native C++ Library not publishing to device/simulator running Android N

本文关键字:Android 运行 模拟器 C++ 原生 库的 应用 安装      更新时间:2023-10-16

有没有办法让Android Instant App与原生C++库配合使用?

我正在尝试将 Android 免安装应用发布到设备/模拟器,但本机C++库遇到了问题。它作为可安装应用程序发布正常,但在发布为免安装应用程序时找不到库。

为了消除任何其他问题,我使用新项目向导在Android Studio 3.0(Canary 1 171.4010489)中启动了一个新项目,并选择了以下设置:

第一页:

  • 包括C++支持已检查

第二页:

  • 已选择手机和平板电脑
  • 包括选中的安卓免安装应用支持

第六页:

  • 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生成):

app/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')
}

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')
}

更新:

我已经向谷歌提出了一个问题:

链接: 谷歌问题跟踪器

虽然我觉得实现这一目标的工具已经可用(Gradle,CMake,NDK等)

也感谢@Anirudh让我知道这是Android N上的已知问题。

发布没有C++库的免安装应用是否可以在我的设备上使用?

是的。。。如果我创建一个新的Android Studio项目,它只用Include Android Instant App support它发布到我的三星Galaxy 7S并显示"Hello World!"屏幕。

发布签名的 APK 有效吗?

生成已签名的APK有效,并且在检查时,本机C++库与feature-debug.apk捆绑在一起,而不是与base-debug.apk捆绑在一起。这是我在给定 gradle 配置时所期望的,但没有解释为什么它不会发布到设备/模拟器。

我还没有尝试旁加载这些APK...但我怀疑这是否可能,因为从未安装过即时应用程序......例如:旁加载后您将如何启动它(单击URL?

将C++库添加到两个 APK 是否有效?

我尝试将externalNativeBuildgradle 属性添加到base/build.gradlefeature/build.gradle文件中,但仍然会出现相同的错误。我在生成签名的 APK 后检查了feature-debug.apkbase-debug.apk,从而验证了原生C++库是否包含在两个 APK 中。

修改后的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"
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不包括所有功能apk。在每个功能模块的 gradle 文件中使用 Gradle 签名配置来对功能 apk 进行签名

将C++库添加到两个 APK 是否有效?

不需要。添加到基本功能apk应该就足够了

实际崩溃是 NDK 在 Android M/N 上支持 Android 免安装应用的已知问题。该应用程序适用于安卓O模拟器