diff --git a/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java b/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java index 71730e4668a85..2e001e7a73965 100644 --- a/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java +++ b/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java @@ -5,6 +5,8 @@ package io.flutter.embedding.engine; import android.content.Context; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.AssetManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import io.flutter.FlutterInjector; @@ -264,7 +266,13 @@ public FlutterEngine( @Nullable String[] dartVmArgs, boolean automaticallyRegisterPlugins, boolean waitForRestorationData) { - this.dartExecutor = new DartExecutor(flutterJNI, context.getAssets()); + AssetManager assetManager; + try { + assetManager = context.createPackageContext(context.getPackageName(), 0).getAssets(); + } catch (NameNotFoundException e) { + assetManager = context.getAssets(); + } + this.dartExecutor = new DartExecutor(flutterJNI, assetManager); this.dartExecutor.onAttachedToJNI(); accessibilityChannel = new AccessibilityChannel(dartExecutor, flutterJNI); diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java index 6f141fa1aa192..be9057d97ed8e 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @@ -11,6 +12,7 @@ import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.PackageManager.NameNotFoundException; import io.flutter.FlutterInjector; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.FlutterJNI; @@ -127,8 +129,11 @@ public void itNotifiesPlatformViewsControllerAboutJNILifecycle() { } @Test - public void itUsesApplicationContext() { + public void itUsesApplicationContext() throws NameNotFoundException { Context context = mock(Context.class); + Context packageContext = mock(Context.class); + + when(context.createPackageContext(any(), anyInt())).thenReturn(packageContext); new FlutterEngine( context, @@ -141,12 +146,32 @@ public void itUsesApplicationContext() { } @Test - public void itCanUseFlutterLoaderInjectionViaFlutterInjector() { + public void itUsesPackageContextForAssetManager() throws NameNotFoundException { + Context context = mock(Context.class); + Context packageContext = mock(Context.class); + when(context.createPackageContext(any(), anyInt())).thenReturn(packageContext); + + new FlutterEngine( + context, + mock(FlutterLoader.class), + flutterJNI, + /*dartVmArgs=*/ new String[] {}, + /*automaticallyRegisterPlugins=*/ false); + + verify(packageContext, atLeast(1)).getAssets(); + verify(context, times(0)).getAssets(); + } + + @Test + public void itCanUseFlutterLoaderInjectionViaFlutterInjector() throws NameNotFoundException { FlutterInjector.reset(); FlutterLoader mockFlutterLoader = mock(FlutterLoader.class); FlutterInjector.setInstance( new FlutterInjector.Builder().setFlutterLoader(mockFlutterLoader).build()); Context mockContext = mock(Context.class); + Context packageContext = mock(Context.class); + + when(mockContext.createPackageContext(any(), anyInt())).thenReturn(packageContext); new FlutterEngine(mockContext, null, flutterJNI);