你好。目前解压so时候,是根据宿主决定只能使用32位或者64位。请问能否我自己改成即使宿主使用64位,插件也可以用32位?
目前解压so时候,是根据宿主决定使用32位还是64位。能否我自己改成即使宿主使用64位,插件也可以用32位? 我想在有些插件中只使用32位的so,减少体积。在当前加载逻辑上,再加一个查找32位so的逻辑。 这样64位宿主在查找64位so没找到的时候,可以继续在32位也查找一次,这样可以使用32位。 不知道这样是否有其他的问题。
@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)
}
}
在so是32位还是64位这个问题上,插件的so就相当于宿主作为一个普通的app在运行时下载的额外的so。你自己学习和调试一下在没有shadow的应用中混用32位和64位so。如果可行的话,你就可以在issue中给出在混用的用例,我们再讨论下Shadow怎么样以同样的原理支持。

你好,我打印日志。在BasePluginManager类getPluginSupportedAbis方法中,instructionSet获取到都是 “arm”。所以is64BitInstructionSet方法返回到都是false,这样得到的都是32位。是我这边的问题吗?我换了麒麟970、麒麟990、通骁龙8 Gen1处理器的手机都是这样。
instructionSet获取到都是 “arm”。所以is64BitInstructionSet方法返回到都是false,这样得到的都是32位。是我这边的问题吗?我换了麒麟970、麒麟990、通骁龙8 Gen1处理器的手机都是这样。
在64位CPU的手机上得到当前宿主app在使用32为so,只能说明宿主在使用32位so,处于一种兼容模型。这不是问题。
除非说宿主确实在使用64位so,但是instructionSet获取到的是“arm”,那才是Bug。
如果有问题再打开吧。