有没有办法让 Android Instant App 与原生 C++ 库一起工作?
我正在尝试将 Android Instant App 发布到设备/模拟器,但我的本机 C++ 库遇到了问题。它作为可安装应用程序发布很好,但在作为即时应用程序发布时找不到库。
为了消除任何其他问题,我使用新项目向导在Android Studio 3.0 (Canary 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'
}
即时应用程序/build.gradle:
apply plugin: 'com.android.instantapp'
dependencies {
implementation project(':feature')
implementation project(':base')
}
更新:
我已向 Google 提出问题:
链接:谷歌问题跟踪器
虽然我觉得实现这一点的工具已经可用(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……但我怀疑这是否可能,因为从未安装过 Instant App……例如:在侧载后你将如何启动它(点击一个 url?)
将 C++ 库添加到两个 APK 是否有效?
我尝试将externalNativeBuild
gradle 属性添加到文件base/build.gradle
和feature/build.gradle
文件中,但仍然出现相同的错误。通过检查生成签名的 APKfeature-debug.apk
和之后,我验证了本地 C++ 库是否包含在两个APK 中。base-debug.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'
}