代码之家  ›  专栏  ›  技术社区  ›  snachmsm

Android ABI拆分迁移到应用程序包

  •  1
  • snachmsm  · 技术社区  · 6 年前

    我计划从ABI Split迁移到应用程序包功能。当前我正在使用此代码:

    def versionCodesAbi = ['x86': 1, 'x86_64': 2, 'armeabi-v7a': 3, 'arm64-v8a': 4]
    
        splits {
            abi {
                enable true
                reset()
                include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"
                // "armeabi", "mips", "mips64" last three not needed and not supported currently
                universalApk true
            }
        }
    
        android.applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def abi = versionCodesAbi.get(output.getFilter(OutputFile.ABI))
                if (abi != null) {
                    output.versionCodeOverride =
                            abi * 1000 + variant.versionCode
                }
            }
        }
    

    每个ABI提供4个APK(通用型)。使用此代码的原因是为了减少应用程序的大小,因为 PanoWidget (使用NDK)和

    renderscriptTargetApi 28
    renderscriptSupportModeEnabled true
    

    删除拆分配置后(+4001至 versionCode )我得到了一个.aab文件,它转换为.apks(使用 bundletool )包含文件夹 standalones/ . 我有四种APK,分别是x86、x86_64、Armeabi-v7a和Arm64-v8a ABIS。现在一切都很好。

    现在我注意到应用程序代码没有使用 RenderScript 总之,我认为这是多余的 supportMode targetApi . 我删除了这两行,在设备/模拟器上测试过,一切正常。所以接下来我要生产bundle,现在它在.apks存档中没有x86 apk版本…如果没有 渲染脚本 支持?我还在使用 VrPanoramaView 它可能对每个ABI都有一些特定的NDK代码(在GitHub上看不到)。遗憾的是,我没有用于测试的x86(32或64)设备,nom我害怕发布这个包…我是否缺少smth,我是否需要\64版本?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Pierre    6 年前

    编辑:

    删除build.gradle中的这两个选项将删除renderscript使用的本机库: librsjni.so libRSSupport.so . 这两个库将为所有ABI删除。

    由于禁用renderscript后,您仍有3个abi,因此您的应用程序似乎依赖于使用本机代码的其他库,但不为x86_64体系结构提供库,这就是x86_64目录消失的原因。这可能意味着您的应用程序以前从未在x86_64上正常工作过,因为平台将加载x86_64目录,但某些本机库将丢失。

    最后,您应该确定哪些库提供了这些本机库,并查看它们是否也可以构建64位版本,但从短期来看,不会有任何问题,因为x86_64设备也支持x86(32位)库。

    以前的职位:

    如果你有 *.bc APK中的文件,64位库将从APK中删除,因为这些renderscript文件仅为32位,无法在64位进程中加载。

    如果迁移到更新版本的renderscript,则 *公元前 将不会生成文件,并且64位本机库将再次出现在APK中。或者,如果根本不需要renderscript,则完全删除这些文件。