From d9f76f00d116c8509ef7035e5d59298dc50fcb29 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 15 Jun 2026 11:42:46 -0500 Subject: [PATCH 1/2] [Xamarin.Android.Build.Tasks] Remove dead InstantRun leftovers Context: https://github.com/dotnet/android/pull/9292 Context: https://github.com/dotnet/android/pull/9297 When "Enhanced Fast Deployment" / Instant Run was removed in #9292 (MSBuild plumbing) and #9297 (native runtime), the corresponding Java support and the manifest-side hook were left behind. This commit finishes the cleanup that #9292 said was for "a future PR": * Delete `src-ThirdParty/bazel/java/mono/android/{debug,release}/MultiDexLoader.java` and `incrementaldeployment/IncrementalClassLoader.java`. These were introduced in #609 to spice fast-deployed `.dex` files into the app classloader at startup. With the native side gone, the release variant's `getDexList()` always returned an empty list (so `IncrementalClassLoader.inject()` was never called) and the debug variant scanned an `__override__/dexes/` directory that nothing in the build pipeline ever populates. * Delete `src/java-runtime/java/mono/android/incrementaldeployment/Placeholder.java`, the corresponding "tiny main dex" Bazel-style placeholder. * Drop the `` glob and the now-stale `RemoveItems` entries from `src/java-runtime/java-runtime.{csproj,targets}`. * Drop `ManifestDocument.MultiDex` and the `mono.android.MultiDexLoader` ContentProvider injection in `MergeManifest()`. Nothing else referenced the class name, and no test asserted the provider's presence. * Drop the corresponding `MultiDex` parameter from `GenerateMainAndroidManifest` and its callsite in `Microsoft.Android.Sdk.TypeMap.LlvmIr.targets`. * Remove the `bazelbuild/bazel` entry from `THIRD-PARTY-NOTICES.TXT` and the `update-tpn` skill, since the only vendored Bazel sources have been deleted. The `$(AndroidEnableMultiDex)` feature itself is unaffected. It still works via `android.support.multidex.MultiDexApplication` and D8/R8 producing `classes.dex` + `classes2.dex`; existing tests (`BuildMultiDexApplication`, `BuildAfterMultiDexIsNotRequired`, `MultiDexAndCodeShrinker`, etc.) cover that path and don't depend on the removed types. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/skills/update-tpn/SKILL.md | 1 - THIRD-PARTY-NOTICES.TXT | 256 ++---------------- .../mono/android/debug/MultiDexLoader.java | 154 ----------- .../IncrementalClassLoader.java | 104 ------- .../mono/android/release/MultiDexLoader.java | 126 --------- ...crosoft.Android.Sdk.TypeMap.LlvmIr.targets | 1 - .../Tasks/GenerateMainAndroidManifest.cs | 2 - .../Utilities/ManifestDocument.cs | 4 - src/java-runtime/java-runtime.csproj | 1 - src/java-runtime/java-runtime.targets | 10 +- .../incrementaldeployment/Placeholder.java | 25 -- 11 files changed, 28 insertions(+), 656 deletions(-) delete mode 100644 src-ThirdParty/bazel/java/mono/android/debug/MultiDexLoader.java delete mode 100644 src-ThirdParty/bazel/java/mono/android/incrementaldeployment/IncrementalClassLoader.java delete mode 100644 src-ThirdParty/bazel/java/mono/android/release/MultiDexLoader.java delete mode 100644 src/java-runtime/java/mono/android/incrementaldeployment/Placeholder.java diff --git a/.github/skills/update-tpn/SKILL.md b/.github/skills/update-tpn/SKILL.md index dda2b75dca8..8bf5cc18b7a 100644 --- a/.github/skills/update-tpn/SKILL.md +++ b/.github/skills/update-tpn/SKILL.md @@ -71,7 +71,6 @@ List contents of `src-ThirdParty/` directory. Current vendored code and license | Directory | Name | License Source | |-----------|------|---------------| | `android-platform-tools-base/` | android/platform/tools/base | https://android.googlesource.com/platform/tools/base/+/refs/heads/main/sdk-common/NOTICE (Apache 2.0) | -| `bazel/` | bazelbuild/bazel | https://github.com/bazelbuild/bazel/ (Apache 2.0) | | `bionic/` | google/bionic | https://android.googlesource.com/platform/bionic/ (Apache 2.0) | | `crc32.net/` | force-net/crc32.net | https://github.com/force-net/Crc32.NET (MIT) | | `NUnitLite/` | nunit/nunitlite | https://github.com/nunit/nunitlite/ (MIT) | diff --git a/THIRD-PARTY-NOTICES.TXT b/THIRD-PARTY-NOTICES.TXT index bf9e2726877..92af2ad1a49 100644 --- a/THIRD-PARTY-NOTICES.TXT +++ b/THIRD-PARTY-NOTICES.TXT @@ -10,30 +10,29 @@ Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. 1. android/platform/tools/base (https://android.googlesource.com/platform/tools/base/+/refs/heads/main/sdk-common/NOTICE) -2. bazelbuild/bazel (https://github.com/bazelbuild/bazel/) -3. brutaldev/StrongNameSigner (https://github.com/brutaldev/StrongNameSigner/) -4. chys87/constexpr-xxh3 (https://github.com/chys87/constexpr-xxh3/) -5. Cyan4973/xxHash (https://github.com/Cyan4973/xxHash/) -6. dotnet/java-interop (https://github.com/dotnet/java-interop/) -7. force-net/crc32.net (https://github.com/force-net/Crc32.NET) -8. gnu/binutils (https://sourceware.org/git/?p=binutils-gdb.git;a=tree;hb=HEAD) -9. google/aapt2 (https://mvnrepository.com/artifact/com.android.tools.build/aapt2) -10. google/bionic (https://android.googlesource.com/platform/bionic/) -11. google/bundletool (https://github.com/google/bundletool) -12. google/r8 (https://r8.googlesource.com/r8/) -13. IronyProject/Irony (https://github.com/IronyProject/Irony) -14. JamesNK/Newtonsoft.Json (https://github.com/JamesNK/Newtonsoft.Json) -15. KonradKuczynski/ELFSharp (https://elfsharp.it/) -16. libunwind/libunwind (https://github.com/libunwind/libunwind) -17. lovettchris/SgmlReader (https://github.com/lovettchris/SgmlReader/) -18. lz4/lz4 (https://github.com/lz4/lz4/) -19. MiloszKrajewski/K4os.Compression.LZ4 (https://github.com/MiloszKrajewski/K4os.Compression.LZ4/) -20. mono/cecil (https://github.com/mono/cecil/) -21. mono/linker (https://github.com/mono/linker/) -22. nih-at/libzip (https://github.com/nih-at/libzip/) -23. NuGet/NuGet.Client (https://github.com/NuGet/NuGet.Client) -24. tessil/robin-map (https://github.com/Tessil/robin-map) -25. xamarin/LibZipSharp (https://github.com/xamarin/LibZipSharp/) +2. brutaldev/StrongNameSigner (https://github.com/brutaldev/StrongNameSigner/) +3. chys87/constexpr-xxh3 (https://github.com/chys87/constexpr-xxh3/) +4. Cyan4973/xxHash (https://github.com/Cyan4973/xxHash/) +5. dotnet/java-interop (https://github.com/dotnet/java-interop/) +6. force-net/crc32.net (https://github.com/force-net/Crc32.NET) +7. gnu/binutils (https://sourceware.org/git/?p=binutils-gdb.git;a=tree;hb=HEAD) +8. google/aapt2 (https://mvnrepository.com/artifact/com.android.tools.build/aapt2) +9. google/bionic (https://android.googlesource.com/platform/bionic/) +10. google/bundletool (https://github.com/google/bundletool) +11. google/r8 (https://r8.googlesource.com/r8/) +12. IronyProject/Irony (https://github.com/IronyProject/Irony) +13. JamesNK/Newtonsoft.Json (https://github.com/JamesNK/Newtonsoft.Json) +14. KonradKuczynski/ELFSharp (https://elfsharp.it/) +15. libunwind/libunwind (https://github.com/libunwind/libunwind) +16. lovettchris/SgmlReader (https://github.com/lovettchris/SgmlReader/) +17. lz4/lz4 (https://github.com/lz4/lz4/) +18. MiloszKrajewski/K4os.Compression.LZ4 (https://github.com/MiloszKrajewski/K4os.Compression.LZ4/) +19. mono/cecil (https://github.com/mono/cecil/) +20. mono/linker (https://github.com/mono/linker/) +21. nih-at/libzip (https://github.com/nih-at/libzip/) +22. NuGet/NuGet.Client (https://github.com/NuGet/NuGet.Client) +23. tessil/robin-map (https://github.com/Tessil/robin-map) +24. xamarin/LibZipSharp (https://github.com/xamarin/LibZipSharp/) %% android/platform/tools/base NOTICES AND INFORMATION BEGIN HERE ================================================================= @@ -244,215 +243,6 @@ implication, estoppel or otherwise. END OF android/platform/tools/base NOTICES AND INFORMATION -%% bazelbuild/bazel NOTICES AND INFORMATION BEGIN HERE -====================================================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -====================================================== -END OF bazelbuild/bazel NOTICES AND INFORMATION - - %% brutaldev/StrongNameSigner NOTICES AND INFORMATION BEGIN HERE ================================================================ Copyright (c) Werner van Deventer (werner@brutaldev.com). All rights reserved. diff --git a/src-ThirdParty/bazel/java/mono/android/debug/MultiDexLoader.java b/src-ThirdParty/bazel/java/mono/android/debug/MultiDexLoader.java deleted file mode 100644 index ffda6d5fe13..00000000000 --- a/src-ThirdParty/bazel/java/mono/android/debug/MultiDexLoader.java +++ /dev/null @@ -1,154 +0,0 @@ -// -// This is a modified version of Bazel source code. Its copyright lines follow below. -// - -// Copyright 2015 Xamarin Inc. All rights reserved. -// Copyright 2017 Microsoft Corporation. All rights reserved. - -// -// Copyright 2014 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package mono.android; - -import mono.android.incrementaldeployment.IncrementalClassLoader; - -import java.io.File; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Collection; -import android.app.Application; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.res.AssetManager; -import android.content.res.Resources; -import android.util.Log; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.ref.WeakReference; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import android.app.Activity; -import android.content.*; -import android.util.Log; -import android.util.ArrayMap; -import android.os.Build; -import dalvik.system.BaseDexClassLoader; -import android.util.LongSparseArray; -import android.util.SparseArray; -import android.view.ContextThemeWrapper; - -public class MultiDexLoader extends ContentProvider { - - static final int KITKAT = 19; - - @Override - public boolean onCreate () - { - return true; - } - - @Override - public void attachInfo (android.content.Context context, android.content.pm.ProviderInfo info) - { - String incrementalDeploymentDir = context.getFilesDir () + "/"; - - File codeCacheDir = context.getCacheDir (); - String nativeLibDir = context.getApplicationInfo ().nativeLibraryDir; - String dataDir = context.getApplicationInfo ().dataDir; - String packageName = context.getPackageName (); - - List dexes = getDexList (packageName, incrementalDeploymentDir); - if (dexes != null && dexes.size () > 0) { - IncrementalClassLoader.inject ( - MultiDexLoader.class.getClassLoader (), - packageName, - codeCacheDir, - nativeLibDir, - dexes); - } - super.attachInfo (context, info); - - } - - private List getDexList (String packageName, String incrementalDeploymentDir) - { - List result = new ArrayList (); - String dexDirectory = incrementalDeploymentDir + ".__override__/dexes"; - Log.v ("MultiDexLoader", dexDirectory); - File[] dexes = new File (dexDirectory).listFiles (); - // It is not illegal state when it was launched to start Seppuku - if (dexes == null) { - Log.v("MultiDexLoader", "No dexes!"); - return null; - } else { - for (File dex : dexes) { - if (dex.getName ().endsWith (".dex")) { - Log.v("MultiDexLoader", "Adding dex " + dex.getPath ()); - result.add (dex.getPath ()); - } - } - } - - return result; - } - - // --- - @Override - public android.database.Cursor query (android.net.Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public String getType (android.net.Uri uri) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public android.net.Uri insert (android.net.Uri uri, android.content.ContentValues initialValues) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int delete (android.net.Uri uri, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int update (android.net.Uri uri, android.content.ContentValues values, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } -} diff --git a/src-ThirdParty/bazel/java/mono/android/incrementaldeployment/IncrementalClassLoader.java b/src-ThirdParty/bazel/java/mono/android/incrementaldeployment/IncrementalClassLoader.java deleted file mode 100644 index 4b29fbfc52a..00000000000 --- a/src-ThirdParty/bazel/java/mono/android/incrementaldeployment/IncrementalClassLoader.java +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2014 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mono.android.incrementaldeployment; - -import android.util.Log; - -import dalvik.system.BaseDexClassLoader; - -import java.io.File; -import java.lang.reflect.Field; -import java.util.List; - -/** - * A class loader that loads classes from any .dex file in a particular directory on the SD card. - * - *

Used to implement incremental deployment to Android phones. - */ -public class IncrementalClassLoader extends ClassLoader { - private final DelegateClassLoader delegateClassLoader; - - public IncrementalClassLoader(ClassLoader original, - String packageName, File codeCacheDir, String nativeLibDir, List dexes) { - super(original.getParent()); - - // TODO(bazel-team): For some mysterious reason, we need to use two class loaders so that - // everything works correctly. Investigate why that is the case so that the code can be - // simplified. - delegateClassLoader = createDelegateClassLoader(codeCacheDir, nativeLibDir, dexes, original); - } - - @Override - public Class findClass(String className) throws ClassNotFoundException { - return delegateClassLoader.findClass(className); - } - - /** - * A class loader whose only purpose is to make {@code findClass()} public. - */ - private static class DelegateClassLoader extends BaseDexClassLoader { - private DelegateClassLoader( - String dexPath, File optimizedDirectory, String libraryPath, ClassLoader parent) { - super(dexPath, optimizedDirectory, libraryPath, parent); - } - - @Override - public Class findClass(String name) throws ClassNotFoundException { - return super.findClass(name); - } - } - - private static DelegateClassLoader createDelegateClassLoader( - File codeCacheDir, String nativeLibDir, List dexes, ClassLoader original) { - StringBuilder pathBuilder = new StringBuilder(); - boolean first = true; - for (String dex : dexes) { - if (first) { - first = false; - } else { - pathBuilder.append(File.pathSeparator); - } - - pathBuilder.append(dex); - } - - Log.v("IncrementalClassLoader", "Incremental dex path is " + pathBuilder); - Log.v("IncrementalClassLoader", "Native lib dir is " + nativeLibDir); - return new DelegateClassLoader(pathBuilder.toString(), codeCacheDir, - nativeLibDir, original); - } - - private static void setParent(ClassLoader classLoader, ClassLoader newParent) { - try { - Field parent = ClassLoader.class.getDeclaredField("parent"); - parent.setAccessible(true); - parent.set(classLoader, newParent); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } - } - - public static void inject( - ClassLoader classLoader, String packageName, File codeCacheDir, - String nativeLibDir, List dexes) { - IncrementalClassLoader incrementalClassLoader = - new IncrementalClassLoader(classLoader, packageName, codeCacheDir, nativeLibDir, dexes); - setParent(classLoader, incrementalClassLoader); - } -} \ No newline at end of file diff --git a/src-ThirdParty/bazel/java/mono/android/release/MultiDexLoader.java b/src-ThirdParty/bazel/java/mono/android/release/MultiDexLoader.java deleted file mode 100644 index 8a12ae3f8f3..00000000000 --- a/src-ThirdParty/bazel/java/mono/android/release/MultiDexLoader.java +++ /dev/null @@ -1,126 +0,0 @@ -// -// This is a modified version of Bazel source code. Its copyright lines follow below. -// - -// Copyright 2015 Xamarin Inc. All rights reserved. - -// -// Copyright 2014 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package mono.android; - -import mono.android.incrementaldeployment.IncrementalClassLoader; - -import java.io.File; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Collection; -import android.app.Application; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.res.AssetManager; -import android.content.res.Resources; -import android.util.Log; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.ref.WeakReference; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import android.content.*; -import android.util.Log; -import android.os.Build; -import dalvik.system.BaseDexClassLoader; - -public class MultiDexLoader extends ContentProvider { - - @Override - public boolean onCreate () - { - return true; - } - - @Override - public void attachInfo (android.content.Context context, android.content.pm.ProviderInfo info) { - - File codeCacheDir = context.getCacheDir (); - String nativeLibDir = context.getApplicationInfo ().nativeLibraryDir; - String dataDir = context.getApplicationInfo ().dataDir; - String packageName = context.getPackageName (); - - List dexes = getDexList (packageName); - if (dexes != null && dexes.size () > 0) { - IncrementalClassLoader.inject ( - MultiDexLoader.class.getClassLoader (), - packageName, - codeCacheDir, - nativeLibDir, - dexes); - } - super.attachInfo (context, info); - } - - private List getDexList (String packageName) { - List result = new ArrayList (); - return result; - } - - // --- - @Override - public android.database.Cursor query (android.net.Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public String getType (android.net.Uri uri) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public android.net.Uri insert (android.net.Uri uri, android.content.ContentValues initialValues) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int delete (android.net.Uri uri, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } - - @Override - public int update (android.net.Uri uri, android.content.ContentValues values, String where, String[] whereArgs) - { - throw new RuntimeException ("This operation is not supported."); - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets index d2ca7cb573d..79b015704a8 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets @@ -118,7 +118,6 @@ ManifestTemplate="$(_AndroidManifestAbs)" MergedAndroidManifestOutput="$(_ManifestOutput)" MergedManifestDocuments="@(_MergedManifestDocuments)" - MultiDex="$(AndroidEnableMultiDex)" NeedsInternet="$(AndroidNeedsInternetPermission)" PackageName="$(_AndroidPackage)" ResolvedUserAssemblies="@(_ResolvedUserMonoAndroidAssemblies)" diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateMainAndroidManifest.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateMainAndroidManifest.cs index de2251cfe33..198ef41ca7d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateMainAndroidManifest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateMainAndroidManifest.cs @@ -35,7 +35,6 @@ public class GenerateMainAndroidManifest : AndroidTask public string? ManifestTemplate { get; set; } public string? MergedAndroidManifestOutput { get; set; } public string []? MergedManifestDocuments { get; set; } - public bool MultiDex { get; set; } public bool NeedsInternet { get; set; } public string? PackageName { get; set; } [Required] @@ -114,7 +113,6 @@ IList MergeManifest (NativeCodeGenState codeGenState, Dictionary Merge (TaskLoggingHelper log, TypeDefinitionCache cache, Li manifest.SetAttributeValue ("package", PackageName); - if (MultiDex) - app.Add (CreateMonoRuntimeProvider ("mono.android.MultiDexLoader", null, initOrder: --AppInitOrder)); - var providerNames = AddMonoRuntimeProviders (app); bool needDebuggable = false; diff --git a/src/java-runtime/java-runtime.csproj b/src/java-runtime/java-runtime.csproj index a47628385c9..cab4658ee0e 100644 --- a/src/java-runtime/java-runtime.csproj +++ b/src/java-runtime/java-runtime.csproj @@ -23,7 +23,6 @@ - diff --git a/src/java-runtime/java-runtime.targets b/src/java-runtime/java-runtime.targets index 7f57a85582c..82c10e29090 100644 --- a/src/java-runtime/java-runtime.targets +++ b/src/java-runtime/java-runtime.targets @@ -7,14 +7,14 @@ $(OutputPath)java_runtime.dex $(IntermediateOutputPath)release $(IntermediateOutputPath)release.txt - ..\..\src-ThirdParty\bazel\java\mono\android\debug\MultiDexLoader.java;java\mono\android\debug-net6\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\clr\MonoPackageManager.java + java\mono\android\debug-net6\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\clr\MonoPackageManager.java <_RuntimeOutput Include="$(OutputPath)java_runtime_trimmable.jar"> $(OutputPath)java_runtime_trimmable.jar $(OutputPath)java_runtime_trimmable.dex $(IntermediateOutputPath)release-trimmable $(IntermediateOutputPath)release-trimmable.txt - ..\..\src-ThirdParty\bazel\java\mono\android\debug\MultiDexLoader.java;java\mono\android\debug-net6\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\MonoPackageManager.java;$(JavaInteropSourceDirectory)\src\Java.Interop\java\net\dot\jni\internal\JavaProxyObject.java;$(JavaInteropSourceDirectory)\src\Java.Interop\java\net\dot\jni\internal\JavaProxyThrowable.java + java\mono\android\debug-net6\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\MonoPackageManager.java;$(JavaInteropSourceDirectory)\src\Java.Interop\java\net\dot\jni\internal\JavaProxyObject.java;$(JavaInteropSourceDirectory)\src\Java.Interop\java\net\dot\jni\internal\JavaProxyThrowable.java java-trimmable\net\dot\jni\internal\JavaProxyObject.java;java-trimmable\net\dot\jni\internal\JavaProxyThrowable.java <_RuntimeOutput Include="$(OutputPath)java_runtime_fastdev.jar"> @@ -22,7 +22,7 @@ $(OutputPath)java_runtime_fastdev.dex $(IntermediateOutputPath)fastdev $(IntermediateOutputPath)fastdev.txt - ..\..\src-ThirdParty\bazel\java\mono\android\release\MultiDexLoader.java;java\mono\android\release-net6\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\clr\MonoPackageManager.java + java\mono\android\release-net6\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\clr\MonoPackageManager.java <_RuntimeOutput Include="$(OutputPath)java_runtime_clr.jar"> @@ -30,14 +30,14 @@ $(OutputPath)java_runtime_clr.dex $(IntermediateOutputPath)release-clr $(IntermediateOutputPath)release-clr.txt - ..\..\src-ThirdParty\bazel\java\mono\android\debug\MultiDexLoader.java;java\mono\android\debug-net6\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\MonoPackageManager.java + java\mono\android\debug-net6\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\MonoPackageManager.java <_RuntimeOutput Include="$(OutputPath)java_runtime_fastdev_clr.jar"> $(OutputPath)java_runtime_fastdev_clr.jar $(OutputPath)java_runtime_fastdev_clr.dex $(IntermediateOutputPath)fastdev-clr $(IntermediateOutputPath)fastdev-clr.txt - ..\..\src-ThirdParty\bazel\java\mono\android\release\MultiDexLoader.java;java\mono\android\release-net6\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\MonoPackageManager.java + java\mono\android\release-net6\BuildConfig.java;java\mono\android\release\BuildConfig.java;java\mono\android\debug\BuildConfig.java;java\mono\android\MonoPackageManager.java diff --git a/src/java-runtime/java/mono/android/incrementaldeployment/Placeholder.java b/src/java-runtime/java/mono/android/incrementaldeployment/Placeholder.java deleted file mode 100644 index e17e9037910..00000000000 --- a/src/java-runtime/java/mono/android/incrementaldeployment/Placeholder.java +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package mono.android.incrementaldeployment; - -/** - * A dummy class. - * - *

This class exists because Android L requires that a .dex file be present in a main .apk. - * We do not want to put any class in there so that we can replace them without reinstalling the - * complete app, thus, we put this tiny little class in there. - */ -public final class Placeholder { -} \ No newline at end of file From 05f11d67f7f1e91a7b8992b527cb044ead41d198 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 15 Jun 2026 17:10:59 -0500 Subject: [PATCH 2/2] Update .apkdesc files for InstantRun removal The BuildReleaseArm64 apkdiff regression tests fail because removing the mono.android.incrementaldeployment Java sources shrinks classes.dex by more than the 5% threshold: - BuildReleaseArm64(False,MonoVM) classes.dex 22384 -> 19036 - BuildReleaseArm64(False,NativeAOT) classes.dex 25400 -> 22016 - BuildReleaseArm64(True,CoreCLR) classes2.dex 156448 -> 108080 Refresh the reference .apkdesc files using the descriptions saved by apkdiff during the failing CI runs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...ildReleaseArm64SimpleDotNet.MonoVM.apkdesc | 26 +++---- ...ReleaseArm64SimpleDotNet.NativeAOT.apkdesc | 15 +--- ...ldReleaseArm64XFormsDotNet.CoreCLR.apkdesc | 73 ++++--------------- 3 files changed, 30 insertions(+), 84 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc index 42c7d46617e..7b817c348e8 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc @@ -5,37 +5,37 @@ "Size": 3036 }, "classes.dex": { - "Size": 22384 + "Size": 19036 }, "lib/arm64-v8a/lib__Microsoft.Android.Resource.Designer.dll.so": { - "Size": 18232 + "Size": 18224 }, "lib/arm64-v8a/lib_Java.Interop.dll.so": { - "Size": 87720 + "Size": 88160 }, "lib/arm64-v8a/lib_Mono.Android.dll.so": { - "Size": 118392 + "Size": 118288 }, "lib/arm64-v8a/lib_Mono.Android.Runtime.dll.so": { - "Size": 26848 + "Size": 26856 }, "lib/arm64-v8a/lib_System.Console.dll.so": { "Size": 24360 }, "lib/arm64-v8a/lib_System.Linq.dll.so": { - "Size": 25432 + "Size": 25448 }, "lib/arm64-v8a/lib_System.Private.CoreLib.dll.so": { - "Size": 638568 + "Size": 638000 }, "lib/arm64-v8a/lib_System.Runtime.dll.so": { "Size": 20224 }, "lib/arm64-v8a/lib_System.Runtime.InteropServices.dll.so": { - "Size": 19752 + "Size": 19760 }, "lib/arm64-v8a/lib_UnnamedProject.dll.so": { - "Size": 19968 + "Size": 19952 }, "lib/arm64-v8a/libarc.bin.so": { "Size": 19296 @@ -44,10 +44,10 @@ "Size": 36416 }, "lib/arm64-v8a/libmonodroid.so": { - "Size": 1385800 + "Size": 1387008 }, "lib/arm64-v8a/libmonosgen-2.0.so": { - "Size": 3111840 + "Size": 3111632 }, "lib/arm64-v8a/libSystem.Globalization.Native.so": { "Size": 72344 @@ -62,7 +62,7 @@ "Size": 162000 }, "lib/arm64-v8a/libxamarin-app.so": { - "Size": 19832 + "Size": 19680 }, "res/drawable-hdpi-v4/icon.png": { "Size": 2178 @@ -89,5 +89,5 @@ "Size": 1904 } }, - "PackageSize": 3254606 + "PackageSize": 3258702 } \ No newline at end of file diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.NativeAOT.apkdesc b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.NativeAOT.apkdesc index 75e2332c446..07825e21ef9 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.NativeAOT.apkdesc +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64SimpleDotNet.NativeAOT.apkdesc @@ -5,19 +5,10 @@ "Size": 3124 }, "classes.dex": { - "Size": 25400 + "Size": 22016 }, "lib/arm64-v8a/libUnnamedProject.so": { - "Size": 5072296 - }, - "META-INF/BNDLTOOL.RSA": { - "Size": 1221 - }, - "META-INF/BNDLTOOL.SF": { - "Size": 1211 - }, - "META-INF/MANIFEST.MF": { - "Size": 1084 + "Size": 5057072 }, "res/drawable-hdpi-v4/icon.png": { "Size": 2178 @@ -44,5 +35,5 @@ "Size": 1904 } }, - "PackageSize": 2126818 + "PackageSize": 2122523 } \ No newline at end of file diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.CoreCLR.apkdesc b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.CoreCLR.apkdesc index 3e9a925186f..e52624832a1 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.CoreCLR.apkdesc +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.CoreCLR.apkdesc @@ -5,10 +5,10 @@ "Size": 6652 }, "classes.dex": { - "Size": 9444112 + "Size": 9452072 }, "classes2.dex": { - "Size": 156448 + "Size": 108080 }, "kotlin/annotation/annotation.kotlin_builtins": { "Size": 928 @@ -32,16 +32,16 @@ "Size": 2396 }, "lib/arm64-v8a/libassembly-store.so": { - "Size": 14076232 + "Size": 14107192 }, "lib/arm64-v8a/libclrjit.so": { - "Size": 3223752 + "Size": 3222704 }, "lib/arm64-v8a/libcoreclr.so": { - "Size": 5771784 + "Size": 5757272 }, "lib/arm64-v8a/libmonodroid.so": { - "Size": 1366648 + "Size": 1325808 }, "lib/arm64-v8a/libSystem.Globalization.Native.so": { "Size": 72344 @@ -50,13 +50,13 @@ "Size": 1280336 }, "lib/arm64-v8a/libSystem.Native.so": { - "Size": 100552 + "Size": 101872 }, "lib/arm64-v8a/libSystem.Security.Cryptography.Native.Android.so": { "Size": 162000 }, "lib/arm64-v8a/libxamarin-app.so": { - "Size": 147264 + "Size": 147616 }, "META-INF/androidx.activity_activity.version": { "Size": 6 @@ -208,12 +208,6 @@ "META-INF/androidx.viewpager2_viewpager2.version": { "Size": 6 }, - "META-INF/BNDLTOOL.RSA": { - "Size": 1221 - }, - "META-INF/BNDLTOOL.SF": { - "Size": 90142 - }, "META-INF/com.android.tools/proguard/coroutines.pro": { "Size": 1345 }, @@ -238,9 +232,6 @@ "META-INF/kotlinx_coroutines_core.version": { "Size": 5 }, - "META-INF/MANIFEST.MF": { - "Size": 90015 - }, "META-INF/maven/com.google.guava/listenablefuture/pom.properties": { "Size": 96 }, @@ -478,9 +469,6 @@ "res/color-night-v8/material_timepicker_modebutton_tint.xml": { "Size": 340 }, - "res/color-v21/abc_btn_colored_borderless_text_material.xml": { - "Size": 464 - }, "res/color-v23/abc_btn_colored_borderless_text_material.xml": { "Size": 500 }, @@ -514,9 +502,6 @@ "res/color/abc_background_cache_hint_selector_material_light.xml": { "Size": 468 }, - "res/color/abc_btn_colored_text_material.xml": { - "Size": 604 - }, "res/color/abc_hint_foreground_material_dark.xml": { "Size": 564 }, @@ -544,24 +529,6 @@ "res/color/abc_secondary_text_material_light.xml": { "Size": 464 }, - "res/color/abc_tint_btn_checkable.xml": { - "Size": 728 - }, - "res/color/abc_tint_default.xml": { - "Size": 1224 - }, - "res/color/abc_tint_edittext.xml": { - "Size": 772 - }, - "res/color/abc_tint_seek_thumb.xml": { - "Size": 604 - }, - "res/color/abc_tint_spinner.xml": { - "Size": 772 - }, - "res/color/abc_tint_switch_track.xml": { - "Size": 768 - }, "res/color/checkbox_themeable_attribute_color.xml": { "Size": 464 }, @@ -1699,9 +1666,6 @@ "res/drawable/mtrl_ic_error.xml": { "Size": 644 }, - "res/drawable/mtrl_popupmenu_background_dark.xml": { - "Size": 740 - }, "res/drawable/mtrl_popupmenu_background.xml": { "Size": 740 }, @@ -1798,15 +1762,6 @@ "res/layout-v21/notification_template_icon_group.xml": { "Size": 988 }, - "res/layout-v22/abc_alert_dialog_button_bar_material.xml": { - "Size": 1584 - }, - "res/layout-v22/material_timepicker_dialog.xml": { - "Size": 3184 - }, - "res/layout-v22/mtrl_alert_dialog_actions.xml": { - "Size": 1764 - }, "res/layout-v26/abc_screen_toolbar.xml": { "Size": 1560 }, @@ -1844,7 +1799,7 @@ "Size": 1684 }, "res/layout/abc_alert_dialog_button_bar_material.xml": { - "Size": 1536 + "Size": 1584 }, "res/layout/abc_alert_dialog_material.xml": { "Size": 2648 @@ -2009,7 +1964,7 @@ "Size": 1208 }, "res/layout/material_timepicker_dialog.xml": { - "Size": 3132 + "Size": 3184 }, "res/layout/material_timepicker_textinput_display.xml": { "Size": 684 @@ -2018,7 +1973,7 @@ "Size": 1136 }, "res/layout/mtrl_alert_dialog_actions.xml": { - "Size": 1620 + "Size": 1764 }, "res/layout/mtrl_alert_dialog_title.xml": { "Size": 956 @@ -2276,8 +2231,8 @@ "Size": 268 }, "resources.arsc": { - "Size": 812848 + "Size": 794696 } }, - "PackageSize": 21263139 -} + "PackageSize": 21179981 +} \ No newline at end of file