shifujun
shifujun
可以fork一下然后修改source sample,复现一下问题。这样就很容易debug了。
你那个分支改动代码量太大了,看不到重点。你先说一下是Flutter中的dart代码获取不到assets,还是Android的Java代码获取不到assets?获取不到的演示代码在你的分支中是哪行?
`crm/crm/.android/include_flutter.groovy`这个文件找不到,编不过。你要不还是重新做个最小改动的复现吧。或者你能基于Flutter的sample指出哪里在shadow下会工作不正常,我也可以直接去看看调用关系。
应该是Flutter的这个代码的问题。 ```java AssetManager assetManager; try { assetManager = context.createPackageContext(context.getPackageName(), 0).getAssets(); } catch (NameNotFoundException e) { assetManager = context.getAssets(); } ``` https://github.com/flutter/engine/blob/11fde578d53cd4f24abbeff4f151fc7f1a9e8c3f/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java#L281-L286 这里插件和宿主的PackageName是一样的,通过`createPackageContext`方法问系统创建Context,只能拿到正常安装的app的Context。所以它就拿到宿主的assets了。看这个代码,你可以通过override `FlutterActivity`的`getPackageName`方法,使它返回一个造成`NameNotFoundException`的名字,然后就可以正常拿到 `FlutterActivity`的assets了。 Shadow可以在ShadowContext里override这个`createPackageContext`方法来自动支持。但是这个需要假设插件中的代码使用宿主的packageName时都是想创建自己的Context。
我没试过。你debug一下这个assetManager是不是宿主的就知道是不是这里的问题了。抛出的异常不是`NameNotFoundException`的话,你还可以override ShadowContext的createPackageContext方法,返回this。
插件里的Activity都是继承自ShadowContext的。你可以先确定一下`context.createPackageContext`的context是不是你的FlutterActivity。然后override那个类的`createPackageContext`就行了。 也可以直接修改: https://github.com/Tencent/Shadow/blob/master/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowContext.java
不行是有Crash吗?先把Crash堆栈贴出来我看看。
看起就是FlutterEngine前面那个`catch (NameNotFoundException e) `没什么用嘛,后面它还是去`getApplicationInfo`了。 你那就不要override getPackageName了,直接override createPackageContext方法返回this吧。严谨一点就判断传进来的包名和getPackageName返回值一样就return this。
https://github.com/flutter/flutter/blob/5c6605f70b945cff98670e64d0d6fc1417126da7/examples/image_list/lib/main.dart#L105 是这种加载assets吧?我可以调试下这个官方的example。
那你引用下你的代码中显示图片的代码是哪行。