Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

插件中集成高德地图sdk,地图显示黑屏,直接运行sample-app运行正常 #724

Closed
Hxh188 opened this issue Dec 21, 2021 · 20 comments · Fixed by #740
Closed

Comments

@Hxh188
Copy link

Hxh188 commented Dec 21, 2021

No description provided.

@shifujun
Copy link
Collaborator

@Hxh188
Copy link
Author

Hxh188 commented Dec 21, 2021

https://github.com/Hxh188/Shadow.git 这个工程,你download下来运行下

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

在TestActivityOnCreate 这个类里显示地图

@shifujun
Copy link
Collaborator

这回提供的复现代码就很棒。不过我没能复现:
image

我用的是API 28 x86_64的官方虚拟机。

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

直接运行sample-app是正常没错,你运行sample-host,就会黑屏。

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

image

@shifujun
Copy link
Collaborator

直接运行sample-app是正常没错,你运行sample-host,就会黑屏。

我当然不会搞错它们的区别。我前面截图的是sample-host的效果,也就插件模式下的效果。

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

我设备是系统android 10的,也就是API level 29, 难道是机型差异?
Uploading image.png…

@shifujun
Copy link
Collaborator

我又仔细看了一下。这个问题原因是因为这个SDK缺少arm64的so,而sample-host宿主没有so,所以在arm64的手机上默认的ABI是arm64。所以插件中解压不出来arm64的so,缺少so造成的。

所以问题难定位原因主要是因为这个SDK加载so失败而没有抛出异常。

解决办法可以是给sample-host添加一个arm64-v8a的so文件,让它被系统安装时使用兼容ABI就可以了。

image

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

https://github.com/Hxh188/Shadow.git 代码已经在sample-host添加了so库,目前在模拟器Pixel 4 API 29 上测试没问题,但在真机上测试还是一样是黑屏的==。
还有一个问题,是否后面插件包新增so库都要在宿主包中新增?

@shifujun
Copy link
Collaborator

你加的abiFilters只是一种编译期打包的参数,加了之后sample-host.apk中还是没有任何so文件。这样系统在安装和启动它时就会指定ABI为设备的默认值,比如是arm64。这样插件也只能用arm64了,所以Shadow跑去插件apk中解压arm64的so时没有解压出来所需的so。

正确的做法是让插件使用和宿主一样的ABI,所以如果宿主本身已经确定了是arm64的,那插件也只能去提供arm64的so。

对于sample-host这个测试场景,因为它没有任何so,所以可以给它加个arm64-v8a的任何so文件,然后启动时load一下。系统会根据第一个加载的so决定应用的ABI。

所以根据前面说的原理,插件后续新增so时不需要特别操作。

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

测试的时候没有abiFilters,不好意思我代码没及时更新上去,你更新下代码,还是一样的

@shifujun
Copy link
Collaborator

Hxh188/Shadow@87b9c95...master

没看到加载的代码。

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

我sample-app 和 sample-host都加了 abiFilters 'armeabi-v7a', 打包是有so库的,我项目的需求是强制用armeabi-v7a中的so包,所以需要加abiFilters 'armeabi-v7a',目前在真机测试是黑屏的,git代码已更新
image

@shifujun
Copy link
Collaborator

你把load的代码指出来?compare一下就那么几行啊,我还能看漏了?

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

不好意思,今天git提交不太稳定,代码没push成功,现在push成功了。load 在截图中已标识出来
image

@shifujun
Copy link
Collaborator

确定有Bug了。
image

你可以先把 97b1d84 回滚了,然后手工指定。

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

你是说回滚到 97b1d84,然后BasePluginManager的getAbi()返回固定的“armeabi-v7a” 吗? 目前这样改了是可以,可是debug的时候rtmp so 库的位置还是在/lib/arm/下??目前是能用了!谢谢了
image

image

@shifujun
Copy link
Collaborator

回滚用git revert 97b1d84命令。

看起来没有任何公开的API可以获取宿主在安装时被系统选择了什么abi。
https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/jni/com_android_internal_content_NativeLibraryHelper.cpp;drc=master;l=442?q=nativeFindSupportedAbi

所以看起来只有一个方法可以自动获取abi了:
Shadow主动提供一个host依赖的native库,只提供一个固定的方法getAbi,然后在每个abi实现中返回对应的字符串。这样让Loader可以通过这个库得知宿主究竟被安装了什么abi。

感觉这样很麻烦,也许手工指定abi是最好的选择。

@Hxh188
Copy link
Author

Hxh188 commented Dec 22, 2021

OK,牛

shifujun added a commit to shifujun/Shadow that referenced this issue Dec 31, 2021
根据ApplicationInfo.nativeLibraryDir后缀获得的其实是instructionSet,而不是ABI。

插件也不需要跟宿主采用完全一样的ABI,只需要保持32位或64位相同就可以了。

现根据instructionSet确定是否为64位,再匹配插件中包含的ABI,按Build.CPU_ABI等字段优先级决定。

允许override getPluginPreferredAbi方法,以应对没有考虑到的情况。

fix Tencent#724
fix Tencent#729
shifujun added a commit to shifujun/Shadow that referenced this issue Dec 31, 2021
根据ApplicationInfo.nativeLibraryDir后缀获得的其实是instructionSet,而不是ABI。

插件也不需要跟宿主采用完全一样的ABI,只需要保持32位或64位相同就可以了。

现根据instructionSet确定是否为64位,再匹配插件中包含的ABI,按Build.CPU_ABI等字段优先级决定。

允许override getPluginPreferredAbi方法,以应对没有考虑到的情况。

fix Tencent#724
fix Tencent#729
shifujun added a commit to shifujun/Shadow that referenced this issue Dec 31, 2021
根据ApplicationInfo.nativeLibraryDir后缀获得的其实是instructionSet,而不是ABI。

插件也不需要跟宿主采用完全一样的ABI,只需要保持32位或64位相同就可以了。

现根据instructionSet确定是否为64位,再匹配插件中包含的ABI,按Build.CPU_ABI等字段优先级决定。

允许override getPluginPreferredAbi方法,以应对没有考虑到的情况。

fix Tencent#724
fix Tencent#729
shifujun added a commit that referenced this issue Jan 4, 2022
根据ApplicationInfo.nativeLibraryDir后缀获得的其实是instructionSet,而不是ABI。

插件也不需要跟宿主采用完全一样的ABI,只需要保持32位或64位相同就可以了。

现根据instructionSet确定是否为64位,再匹配插件中包含的ABI,按Build.CPU_ABI等字段优先级决定。

允许override getPluginPreferredAbi方法,以应对没有考虑到的情况。

fix #724
fix #729
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants