使用“重建项目”与“运行”时不同的APK内容

时间:2019-08-22 09:00:22

标签: android android-studio

我目前正在开发一个使用Affectiva SDK的应用程序

implementation "com.affectiva.android:affdexsdk:3.2"

它包含平台特定的文件lib/armeabi-v7a/libaffdexface_jni.so

当我使用Android Studio中的“重建项目”或控制台中的gradlew assembleDebug来构建应用程序时,我得到了一个〜10MB的APK,其中包含此文件,并且可以在我的设备上正常运行。但是,当我只使用Android Studio中的“运行”按钮时,我得到的文件大小约为6MB。然后,该应用会崩溃

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.test.facial.recognition.debug-rkAp4fGhSFRMATj614orZw==/base.apk"],nativeLibraryDirectories=[/data/app/com.test.facial.recognition.debug-rkAp4fGhSFRMATj614orZw==/lib/arm64, /system/lib64]]] couldn't find "libaffdexface_jni.so"

我的猜测是,出于速度方面的考虑,“运行”会构建设备专用的APK。我使用的是Pixel 2,它是ARMv8,而不是ARMv7a,因此文件可能被跳过了。 ARMv8与ARMv7a向后兼容,因此这不是问题。 (因为使用“重建项目”或控制台并手动安装时,它运行良好)

有没有办法解决这个问题?我可以使“运行”使用通用APK而不是设备专用的吗?还是我可以告诉它在ARMv8版本中包含ARMv7a二进制文件?

1 个答案:

答案 0 :(得分:0)

当我加入

android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters "armeabi-v7a", "x86", "armeabi"
        }
    }
}

build.gradle中有效。 documentation

  

指定Gradle应该使用的应用程序二进制接口(ABI)   为您的APK构建输出并打包。

但是我什至不使用NDK,所以我不知道为什么这样。如果有人知道为什么,请发表评论。此外,非常欢迎使用比这更清洁的解决方案。