alibaba / weex

A framework for building Mobile cross-platform UI
https://weexapp.com/
Apache License 2.0
18.28k stars 2.13k forks source link

[Android]安装包aab格式,运行时无法正常加载页面。安装包apk格式,正常 #3241

Closed hshm closed 3 years ago

hshm commented 3 years ago

Describe the bug

google play 要求8月份新上架的app,须采用aab格式(非apk)发布。 生成官方playgroud的aab格式安装包,无法正常加载weex页面

To Reproduce

Environment

Expected behavior

正常展示页面

Screenshots

Additional context

hshm commented 3 years ago

研究了下,已经解决了一半问题:android 9(包含)以下,aab的安装包能正常加载weex页面。

hshm commented 3 years ago

原因:aab格式安装包,通过bundletool安装到手机,原apk中的文件,根据cpu等维度,拆分了。如下 image 即:base.apk中不再包含so文件, so文件全部在 split_config.arm64_v8a.apk中。

但代码中还是去base.apk中获取(该代码在,通过apk格式的安装包安装后,运行没问题),如下,所以导致了问题出现: WXEnvironment.java image

解决:从split_config.arm64_v8a.apk中把weex相关的so复制一份到/data/data/**/cache/

hshm commented 3 years ago

测试机型适配时发现了问题:在Android 10 和 Android 11上,还是无法加载weex,其他android版本无问题。 JsFrameworkInit 没有初始化成功,日志: image

hshm commented 3 years ago

最后追踪到下面这个方法没返回成功。看了会c++代码,没太懂,没思路了...,求救 mWXBridge.initFrameworkEnv(framework, assembleDefaultOptions(), crashFile, pieSupport)

JeremyYvv commented 3 years ago

最后追踪到下面这个方法没返回成功。看了会c++代码,没太懂,没思路了...,求救 mWXBridge.initFrameworkEnv(framework, assembleDefaultOptions(), crashFile, pieSupport)

framework 入参有值吗

joy2helloworld commented 3 years ago

也遇到了相同问题,有什么解决方案吗?

katherine95s commented 3 years ago

测试机型适配时发现了问题:在Android 10 和 Android 11上,还是无法加载weex,其他android版本无问题。 JsFrameworkInit 没有初始化成功,日志: image

确认下com.taobao.weex.WXEnvironment.java是否被混淆过

miomin commented 3 years ago

aab格式之前不支持,问题我们内部在看了。

hshm commented 3 years ago

aab格式之前不支持,问题我们内部在看了。

希望我上面的对你们有帮忙,通过重新拷贝一份so文件,android 10以下没问题了,10以上有问题。

hshm commented 3 years ago

最后追踪到下面这个方法没返回成功。看了会c++代码,没太懂,没思路了...,求救 mWXBridge.initFrameworkEnv(framework, assembleDefaultOptions(), crashFile, pieSupport)

framework 入参有值吗 有值,如下: image

hshm commented 3 years ago

一直以为so路径问题,通过打印C++端的代码,各种so路径又符合预期 image

hshm commented 3 years ago

通过进一步在C++打印日志,在关闭文件是报错: image

报错信息: image

尝试把 关闭文件的代码去掉,结果还是一样,初始化不成功:

image

katherine95s commented 3 years ago

weex初始化时需要执行weexjsb.so拉起js子进程。Android gradle plugin 3.3.0对aab做了优化,默认不拷贝native library至libs路径,导致weexjsb.so执行失败。可通过关闭此优化绕过。

According to the Gradle release note

When building an Android App Bundle, APKs generated from that app bundle that target Android 6.0 (API level 23) or higher now include uncompressed versions of your native libraries by default. This optimization avoids the need for the device to make a copy of the library and thus reduces the on-disk size of your app. If you'd rather disable this optimization, add the following to your gradle.properties file:

android.bundle.enableUncompressedNativeLibs = false

hshm commented 3 years ago

已经验证,上述方案能解决问题