Skip to content

Commit f8461e6

Browse files
committed
Actually use the embedded assembly store
1 parent ef290af commit f8461e6

File tree

5 files changed

+69
-44
lines changed

5 files changed

+69
-44
lines changed

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2379,6 +2379,7 @@ because xbuild doesn't support framework reference assemblies.
23792379
AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)"
23802380
IntermediateOutputPath="$(IntermediateOutputPath)">
23812381
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)">
2382+
AssemblyStoreEmbeddedInRuntime="$(_AndroidEmbedAssemblyStoreInRuntime)">
23822383
<Output TaskParameter="OutputFiles" ItemName="ApkFiles" />
23832384
</BuildApk>
23842385
<BuildBaseAppBundle
@@ -2449,6 +2450,7 @@ because xbuild doesn't support framework reference assemblies.
24492450
AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)"
24502451
IntermediateOutputPath="$(IntermediateOutputPath)">
24512452
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)">
2453+
AssemblyStoreEmbeddedInRuntime="$(_AndroidEmbedAssemblyStoreInRuntime)">
24522454
<Output TaskParameter="OutputFiles" ItemName="BaseZipFile" />
24532455
</BuildBaseAppBundle>
24542456
<BuildAppBundle
@@ -2523,6 +2525,7 @@ because xbuild doesn't support framework reference assemblies.
25232525
AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)"
25242526
IntermediateOutputPath="$(IntermediateOutputPath)">
25252527
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)">
2528+
AssemblyStoreEmbeddedInRuntime="$(_AndroidEmbedAssemblyStoreInRuntime)">
25262529
<Output TaskParameter="OutputFiles" ItemName="ApkFiles" />
25272530
</BuildApk>
25282531
<BuildBaseAppBundle
@@ -2563,6 +2566,7 @@ because xbuild doesn't support framework reference assemblies.
25632566
AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)"
25642567
IntermediateOutputPath="$(IntermediateOutputPath)">
25652568
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)">
2569+
AssemblyStoreEmbeddedInRuntime="$(_AndroidEmbedAssemblyStoreInRuntime)">
25662570
<Output TaskParameter="OutputFiles" ItemName="BaseZipFile" />
25672571
</BuildBaseAppBundle>
25682572
<BuildAppBundle

src/native/mono/monodroid/embedded-assemblies-zip.cc

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,47 @@ EmbeddedAssemblies::zip_load_individual_assembly_entries (std::vector<uint8_t> c
183183
}
184184
}
185185

186+
187+
[[gnu::always_inline]] void
188+
EmbeddedAssemblies::verify_assembly_store_and_set_info (void *data_start, const char *name) noexcept
189+
{
190+
auto header = static_cast<AssemblyStoreHeader*>(data_start);
191+
192+
if (header->magic != ASSEMBLY_STORE_MAGIC) {
193+
Helpers::abort_application (
194+
LOG_ASSEMBLY,
195+
Util::monodroid_strdup_printf (
196+
"Assembly store '%s' is not a valid .NET for Android assembly store file",
197+
entry_name.get ()
198+
)
199+
);
200+
}
201+
202+
if (header->version != ASSEMBLY_STORE_FORMAT_VERSION) {
203+
Helpers::abort_application (
204+
LOG_ASSEMBLY,
205+
Util::monodroid_strdup_printf (
206+
"Assembly store '%s' uses format version 0x%x, instead of the expected 0x%x",
207+
entry_name.get (),
208+
header->version,
209+
ASSEMBLY_STORE_FORMAT_VERSION
210+
)
211+
);
212+
}
213+
214+
constexpr size_t header_size = sizeof(AssemblyStoreHeader);
215+
216+
assembly_store.data_start = static_cast<uint8_t*>(data_start);
217+
assembly_store.assembly_count = header->entry_count;
218+
assembly_store.index_entry_count = header->index_entry_count;
219+
assembly_store.assemblies = reinterpret_cast<AssemblyStoreEntryDescriptor*>(assembly_store.data_start + header_size + header->index_size);
220+
assembly_store_hashes = reinterpret_cast<AssemblyStoreIndexEntry*>(assembly_store.data_start + header_size);
221+
222+
number_of_found_assemblies += assembly_store.assembly_count;
223+
number_of_mapped_assembly_stores++;
224+
have_and_want_debug_symbols = register_debug_symbols;
225+
}
226+
186227
inline void
187228
EmbeddedAssemblies::map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState &state) noexcept
188229
{
@@ -219,42 +260,8 @@ EmbeddedAssemblies::map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX>
219260
}
220261

221262
auto [payload_start, payload_size] = get_wrapper_dso_payload_pointer_and_size (assembly_store_map, entry_name.get ());
222-
log_debug (LOG_ASSEMBLY, "Adjusted assembly store pointer: {:p}; size: {}", payload_start, payload_size);
223-
auto header = static_cast<AssemblyStoreHeader*>(payload_start);
224-
225-
if (header->magic != ASSEMBLY_STORE_MAGIC) {
226-
Helpers::abort_application (
227-
LOG_ASSEMBLY,
228-
std::format (
229-
"Assembly store '{}' is not a valid .NET for Android assembly store file",
230-
optional_string (entry_name.get ())
231-
)
232-
);
233-
}
234-
235-
if (header->version != ASSEMBLY_STORE_FORMAT_VERSION) {
236-
Helpers::abort_application (
237-
LOG_ASSEMBLY,
238-
std::format (
239-
"Assembly store '{}' uses format version {:x}, instead of the expected {:x}",
240-
optional_string (entry_name.get ()),
241-
header->version,
242-
ASSEMBLY_STORE_FORMAT_VERSION
243-
)
244-
);
245-
}
246-
247-
constexpr size_t header_size = sizeof(AssemblyStoreHeader);
248-
249-
assembly_store.data_start = static_cast<uint8_t*>(payload_start);
250-
assembly_store.assembly_count = header->entry_count;
251-
assembly_store.index_entry_count = header->index_entry_count;
252-
assembly_store.assemblies = reinterpret_cast<AssemblyStoreEntryDescriptor*>(assembly_store.data_start + header_size + header->index_size);
253-
assembly_store_hashes = reinterpret_cast<AssemblyStoreIndexEntry*>(assembly_store.data_start + header_size);
254-
255-
number_of_found_assemblies += assembly_store.assembly_count;
256-
number_of_mapped_assembly_stores++;
257-
have_and_want_debug_symbols = register_debug_symbols;
263+
log_debug (LOG_ASSEMBLY, "Adjusted assembly store pointer: %p; size: %zu", payload_start, payload_size);
264+
verify_assembly_store_and_set_info (payload_start, entry_name.get ());
258265
}
259266

260267
[[gnu::always_inline]] void
@@ -265,9 +272,15 @@ EmbeddedAssemblies::zip_load_assembly_store_entries (std::vector<uint8_t> const&
265272
}
266273

267274
dynamic_local_string<SENSIBLE_PATH_MAX> entry_name;
268-
bool assembly_store_found = false;
275+
bool assembly_store_found = embedded_assembly_store_size != 0;
276+
if (assembly_store_found) {
277+
log_debug (LOG_ASSEMBLY, "Got embedded assembly store, size %zu", embedded_assembly_store_size);
278+
verify_assembly_store_and_set_info (embedded_assembly_store, "embedded");
279+
log_debug (LOG_ASSEMBLY, "Looking for DSOs in APK");
280+
} else {
281+
log_debug (LOG_ASSEMBLY, "Looking for assembly store ('%s') and DSOs in APK", assembly_store_file_path.data ());
282+
}
269283

270-
log_debug (LOG_ASSEMBLY, "Looking for assembly stores in APK ('{}')", assembly_store_file_path.data ());
271284
for (size_t i = 0uz; i < num_entries; i++) {
272285
if (all_required_zip_entries_found ()) {
273286
need_to_scan_more_apks = false;

src/native/mono/monodroid/embedded-assemblies.hh

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -375,12 +375,14 @@ namespace xamarin::android::internal {
375375
static const TypeMapModuleEntry* binary_search (uint32_t key, const TypeMapModuleEntry *arr, uint32_t n) noexcept;
376376
#endif
377377
template<bool NeedsNameAlloc>
378-
static void set_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
379-
static void set_assembly_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
380-
static void set_debug_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
381-
static void map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState &state) noexcept;
382-
static const AssemblyStoreIndexEntry* find_assembly_store_entry (hash_t hash, const AssemblyStoreIndexEntry *entries, size_t entry_count) noexcept;
383-
static void store_individual_assembly_data (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState const& state, monodroid_should_register should_register) noexcept;
378+
void set_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
379+
void set_assembly_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
380+
void set_debug_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
381+
382+
void verify_assembly_store_and_set_info (void *data_start, const char *name) noexcept;
383+
void map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState &state) noexcept;
384+
const AssemblyStoreIndexEntry* find_assembly_store_entry (hash_t hash, const AssemblyStoreIndexEntry *entries, size_t entry_count) noexcept;
385+
void store_individual_assembly_data (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState const& state, monodroid_should_register should_register) noexcept;
384386

385387
constexpr static size_t get_mangled_name_max_size_overhead ()
386388
{

src/native/mono/xamarin-app-stub/application_dso_stub.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,3 +308,6 @@ const JniRemappingTypeReplacementEntry jni_remapping_type_replacements[] = {
308308

309309
size_t embedded_runtime_config_size = 0;
310310
uint8_t embedded_runtime_config[0];
311+
312+
size_t embedded_assembly_store_size = 0;
313+
uint8_t embedded_assembly_store[0];

src/native/mono/xamarin-app-stub/xamarin-app.hh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,4 +396,7 @@ MONO_API MONO_API_EXPORT const MarshalMethodName mm_method_names[];
396396

397397
MONO_API MONO_API_EXPORT size_t embedded_runtime_config_size;
398398
MONO_API MONO_API_EXPORT uint8_t embedded_runtime_config[];
399+
400+
MONO_API MONO_API_EXPORT size_t embedded_assembly_store_size;
401+
MONO_API MONO_API_EXPORT uint8_t embedded_assembly_store[];
399402
#endif // __XAMARIN_ANDROID_TYPEMAP_H

0 commit comments

Comments
 (0)