具有原生C++库的 Android 免安装应用不会发布到运行 Android N 的设备/模拟器
Android Instant App with Native C++ Library not publishing to device/simulator running Android N
有没有办法让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 是否有效?
我尝试将externalNativeBuild
gradle 属性添加到base/build.gradle
和feature/build.gradle
文件中,但仍然会出现相同的错误。我在生成签名的 APK 后检查了feature-debug.apk
和base-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模拟器
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- Android NDK:用于第三方Java库的静态或共享C++运行时
- 在Android中运行没有ART/Dalvik参与的代码
- Android Studio 3.1.2 - 无法运行C++子例程"No implementation found for Java.lang.String..."
- 在Android上运行openCL
- 具有原生C++库的 Android 免安装应用不会发布到运行 Android N 的设备/模拟器
- 在 OpenGL ES for Android 中运行时创建大型纹理的最有效方法
- 当从共享库运行时,为什么此Android NDK代码崩溃
- Android本机运行时无法加载符号,即使它们实际上是在加载的.so文件中找到的
- Qt如何在Android上运行
- 为什么我们需要使用android工具链(或NDK)来编译在android应用程序上下文中运行的c/c++代码
- QT 5.7对于Android Main C 线程不持续运行
- 在Qt Android应用程序中运行GDB服务器
- 您如何编译C 控制台程序以作为Android流程运行
- Android jni 和 opencv 运行时无法加载库
- 当应用在 Android 设备上运行时,具有 new 的 c++ 对象的内存分配将获得相同的地址
- 非常简单的C++代码在Android上崩溃,但在OS X上运行良好
- 64位Android编译,但在运行时出现问题
- 在android ndk上运行pjsip示例pjsua时出错
- Android上的Cocos2D-X未运行