From 8ec8343b83afd0dd2e9f30d41e39037efc3691f9 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 18 Feb 2025 10:07:19 -0500 Subject: [PATCH 1/3] [android] Fix java runner to not assume zip format when unzipping After https://github.com/dotnet/runtime/pull/112256 landed, there was a change to zip the test assets using `ZipFile.CreateFromDirectory` for cross platform support. This regressed `unzipAssets` in `MonoRunner.java` because it naivley assumed that directories would come before files in the zip archive. This change fixes the problem by making sure directories are created first before writing files to disk. Fixes https://github.com/dotnet/runtime/issues/112558 --- .../Templates/MonoRunner.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java b/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java index cb017daafcfdc1..a98631b70a6764 100644 --- a/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java +++ b/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java @@ -146,33 +146,33 @@ public void onDestroy() { static void unzipAssets(Context context, String toPath, String zipName) { AssetManager assetManager = context.getAssets(); - try { - InputStream inputStream = assetManager.open(zipName); - ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(inputStream)); + try (InputStream inputStream = assetManager.open(zipName); + ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(inputStream))) { + ZipEntry zipEntry; byte[] buffer = new byte[4096]; while ((zipEntry = zipInputStream.getNextEntry()) != null) { String fileOrDirectory = zipEntry.getName(); - Uri.Builder builder = new Uri.Builder(); - builder.scheme("file"); - builder.appendPath(toPath); - builder.appendPath(fileOrDirectory); - String fullToPath = builder.build().getPath(); - if (zipEntry.isDirectory()) { - File directory = new File(fullToPath); - directory.mkdirs(); - continue; + File file = new File(toPath, fileOrDirectory); + File parent = new File(file.getParent()); + + if (file.isDirectory()) { + file.mkdirs(); + } + else if (!parent.exists()) { + parent.mkdirs(); } + + String fullToPath = file.getAbsolutePath(); Log.i("DOTNET", "Extracting asset to " + fullToPath); + int count = 0; FileOutputStream fileOutputStream = new FileOutputStream(fullToPath); while ((count = zipInputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, count); } - fileOutputStream.close(); zipInputStream.closeEntry(); } - zipInputStream.close(); } catch (IOException e) { Log.e("DOTNET", e.getLocalizedMessage()); } From f3dc6fe38c06a382341d223087ea567a50aff531 Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 18 Feb 2025 10:53:32 -0500 Subject: [PATCH 2/3] Update src/tasks/AndroidAppBuilder/Templates/MonoRunner.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/tasks/AndroidAppBuilder/Templates/MonoRunner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java b/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java index a98631b70a6764..f485f9ed2694f3 100644 --- a/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java +++ b/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java @@ -156,7 +156,7 @@ static void unzipAssets(Context context, String toPath, String zipName) { File file = new File(toPath, fileOrDirectory); File parent = new File(file.getParent()); - if (file.isDirectory()) { + if (zipEntry.isDirectory()) { file.mkdirs(); } else if (!parent.exists()) { From 25ce6b2bb835e615eb9203b085a4a6d5e39a522b Mon Sep 17 00:00:00 2001 From: Steve Pfister Date: Tue, 18 Feb 2025 10:54:51 -0500 Subject: [PATCH 3/3] No need to extract if zip entry is directory --- src/tasks/AndroidAppBuilder/Templates/MonoRunner.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java b/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java index f485f9ed2694f3..f8938e9fff316c 100644 --- a/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java +++ b/src/tasks/AndroidAppBuilder/Templates/MonoRunner.java @@ -158,6 +158,7 @@ static void unzipAssets(Context context, String toPath, String zipName) { if (zipEntry.isDirectory()) { file.mkdirs(); + continue; } else if (!parent.exists()) { parent.mkdirs();