【问题标题】:android release app bundle build missing native lib .so filesandroid 发布应用程序包构建缺少本机 lib .so 文件
【发布时间】:2019-08-20 14:44:32
【问题描述】:

案例

我有一个应用程序

当我在调试模式下使用它时一切正常!

但是当我尝试构建用于发布的 apk 包并尝试通过 Play 商店安装应用程序时 缺少 .so 文件 我对 apk 进行了逆向工程,但找不到单个 .so 文件或任何 lib 文件夹

但是当我使用 play console 和 android studio 分析包时,它包含所有带有相应 .so 文件的 abi 文件夹

这是我的应用程序 gradle 文件

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.test"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 38
        versionName "3.0.8"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        // Enabling multidex support.
        multiDexEnabled true
        //render script
        renderscriptTargetApi 28
        renderscriptSupportModeEnabled true
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    packagingOptions {
        exclude 'META-INF/rxjava.properties'
        exclude "lib/mips/libRSSupport.so"
        exclude "lib/mips/librsjni.so"

    }
    compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }
}

dependencies {
    //custom modules here
    //libs and jars
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    //other dependencies
}

apply plugin: 'com.google.gms.google-services'

这里有一些图片

我无法截取整个页面,但它有所有可能的 abis

错误

Fatal Exception: java.lang.UnsatisfiedLinkError
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.test-1/base.apk"],nativeLibraryDirectories=[/data/app/com.test-1/lib/arm, /data/app/com.test-1/base.apk!/lib/armeabi, /vendor/lib, /system/lib]]] couldn't find "libnative-lib.so"

我都试过了

我已经尝试将 ndkFilters、splits、abis、禁用 progaurd 等放入 gradle 文件中

但没有运气

我认为

play 控制台无法将 lib 分发到相应的 abis

请求

任何人有任何线索请告诉我_/\_

谢谢

【问题讨论】:

标签: android android-studio android-ndk android-gradle-plugin android-bundle


【解决方案1】:

将以下内容添加到gradle.properties,应该会有所帮助:

android.bundle.enableUncompressedNativeLibs = false

【讨论】:

    【解决方案2】:

    使用 abifFilters 从您的包中删除过时的 ABI。你不需要armeabimips

    也许,您尝试在设备上安装 armeabi 拆分。这样做的问题是确实存在 armeabi 拆分(它包含来自某些依赖项的库),但较新的 NDK 没有构建 libnative-lib.so 的这种变体。

    【讨论】:

    • 但这不是我想要的
    • 如果您查看 android studio 分析,它没有任何内容,生成的文件夹中没有文件。所以这不是问题
    • 您在上面发布的列表包含 armeabi xhdpi 包,从表面上看,它不包括 libnative-lib.so,但可能包括您的应用所依赖的包中的一些 3rd 方本机库,例如崩溃分析
    • 谢谢你,我没试过你说的,但我可以想象你在说什么。它可能会解决问题。但是如果在这些 abis 上运行设备怎么办。还请告诉我我必须针对的所有 abis 以及我必须排除的内容。
    • @3c71 这里的问题不是没有安装本机库,而是系统选择(出于未知原因)在错误的 ABI 文件夹中查找本机库。也许,TS 试图在设备上安装 armeabi 拆分。这样做的问题是确实存在 armeabi 拆分,但较新的 NDK 没有构建 libnative-lib.so 的这种变体。
    【解决方案3】:

    试试这个:

    sourceSets.main.jniLibs.srcDirs = ['src/main/jniLibs']
    

    【讨论】:

    • 请添加一些解释以便其他人理解!
    • 这无济于事,因为生成的包已经包含所有 .so 文件。安装捆绑包时会出现问题。 Android Studio 或 Play Store 不安装任何库!
    【解决方案4】:

    如果以上解决方案都无效,可以尝试用依赖库的debug模式包构建一次,然后用release模式包替换。看了很多解决办法,发现这个方法行得通,可能和编译器缓存有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多