Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

你好。目前解压so时候,是根据宿主决定只能使用32位或者64位。请问能否我自己改成即使宿主使用64位,插件也可以用32位?

Open cyberau opened this issue 3 years ago • 3 comments

目前解压so时候,是根据宿主决定使用32位还是64位。能否我自己改成即使宿主使用64位,插件也可以用32位? 我想在有些插件中只使用32位的so,减少体积。在当前加载逻辑上,再加一个查找32位so的逻辑。 这样64位宿主在查找64位so没找到的时候,可以继续在32位也查找一次,这样可以使用32位。 不知道这样是否有其他的问题。

cyberau avatar Sep 17 '22 11:09 cyberau

   @Throws(InstallPluginException::class)
    override fun getPluginPreferredAbi(pluginSupportedAbis: Array<String>, apkFile: File): String? {
        try {
            SafeZipFile(apkFile).use { zipFile ->
                //找出插件apk中lib目录下都有哪些子目录
                val subDirsInLib: MutableSet<String> = LinkedHashSet()
                val entries = zipFile.entries()
                while (entries.hasMoreElements()) {
                    val entry = entries.nextElement()
                    val name = entry.name
                    if (name.startsWith("lib/")) {
                        val split = name.split("/").toTypedArray()
                        if (split.size == 3) { // like "lib/arm64-v8a/libabc.so"
                            subDirsInLib.add(split[1])
                        }
                    }
                }
                //**64位系统下,如果没有64位so,则继续取一次32位的so**
                for (supportedAbi in Build.SUPPORTED_32_BIT_ABIS) {
                    if (subDirsInLib.contains(supportedAbi)) {
                        return supportedAbi
                    }
                }
                return ""
            }
        } catch (e: IOException) {
            throw InstallPluginException("读取apk失败,apkFile==$apkFile", e)
        }
    }

cyberau avatar Sep 17 '22 11:09 cyberau

在so是32位还是64位这个问题上,插件的so就相当于宿主作为一个普通的app在运行时下载的额外的so。你自己学习和调试一下在没有shadow的应用中混用32位和64位so。如果可行的话,你就可以在issue中给出在混用的用例,我们再讨论下Shadow怎么样以同样的原理支持。

shifujun avatar Sep 17 '22 12:09 shifujun

image

你好,我打印日志。在BasePluginManager类getPluginSupportedAbis方法中,instructionSet获取到都是 “arm”。所以is64BitInstructionSet方法返回到都是false,这样得到的都是32位。是我这边的问题吗?我换了麒麟970、麒麟990、通骁龙8 Gen1处理器的手机都是这样。

cyberau avatar Sep 17 '22 13:09 cyberau

instructionSet获取到都是 “arm”。所以is64BitInstructionSet方法返回到都是false,这样得到的都是32位。是我这边的问题吗?我换了麒麟970、麒麟990、通骁龙8 Gen1处理器的手机都是这样。

在64位CPU的手机上得到当前宿主app在使用32为so,只能说明宿主在使用32位so,处于一种兼容模型。这不是问题。

除非说宿主确实在使用64位so,但是instructionSet获取到的是“arm”,那才是Bug。

如果有问题再打开吧。

shifujun avatar Dec 08 '22 10:12 shifujun