Skip to content

Commit 80087f7

Browse files
committed
Actually use the embedded assembly store
1 parent ad732fd commit 80087f7

File tree

6 files changed

+70
-39
lines changed

6 files changed

+70
-39
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ public class BuildApk : AndroidTask
115115
[Required]
116116
public string CompressedAssembliesDir { get; set; }
117117

118+
[Required]
119+
public bool AssemblyStoreEmbeddedInRuntime { get; set; }
120+
118121
[Output]
119122
public ITaskItem[] OutputFiles { get; set; }
120123

@@ -430,6 +433,11 @@ void AddAssemblies (ZipArchiveEx apk, bool debug, bool compress, IDictionary<And
430433
AssemblyStoreBuilder? storeBuilder = null;
431434

432435
if (UseAssemblyStore) {
436+
if (AssemblyStoreEmbeddedInRuntime) {
437+
// We don't need to do anything here, the store is in `libxamarin-app.so`
438+
return;
439+
}
440+
433441
storeBuilder = new AssemblyStoreBuilder (Log);
434442
}
435443

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2115,7 +2115,8 @@ because xbuild doesn't support framework reference assemblies.
21152115
ZipFlushSizeLimit="$(_ZipFlushSizeLimit)"
21162116
ZipAlignmentPages="$(AndroidZipAlignment)"
21172117
UseAssemblyStore="$(AndroidUseAssemblyStore)"
2118-
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)">
2118+
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)"
2119+
AssemblyStoreEmbeddedInRuntime="$(_AndroidEmbedAssemblyStoreInRuntime)">
21192120
<Output TaskParameter="OutputFiles" ItemName="ApkFiles" />
21202121
</BuildApk>
21212122
<BuildBaseAppBundle
@@ -2154,7 +2155,8 @@ because xbuild doesn't support framework reference assemblies.
21542155
ZipFlushSizeLimit="$(_ZipFlushSizeLimit)"
21552156
ZipAlignmentPages="$(AndroidZipAlignment)"
21562157
UseAssemblyStore="$(AndroidUseAssemblyStore)"
2157-
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)">
2158+
CompressedAssembliesDir="$(_AndroidCompressedAssembliesDir)"
2159+
AssemblyStoreEmbeddedInRuntime="$(_AndroidEmbedAssemblyStoreInRuntime)">
21582160
<Output TaskParameter="OutputFiles" ItemName="BaseZipFile" />
21592161
</BuildBaseAppBundle>
21602162
<BuildAppBundle

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

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,47 @@ EmbeddedAssemblies::zip_load_individual_assembly_entries (std::vector<uint8_t> c
175175
}
176176
}
177177

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

213254
auto [payload_start, payload_size] = get_wrapper_dso_payload_pointer_and_size (assembly_store_map, entry_name.get ());
214255
log_debug (LOG_ASSEMBLY, "Adjusted assembly store pointer: %p; size: %zu", payload_start, payload_size);
215-
auto header = static_cast<AssemblyStoreHeader*>(payload_start);
216-
217-
if (header->magic != ASSEMBLY_STORE_MAGIC) {
218-
Helpers::abort_application (
219-
LOG_ASSEMBLY,
220-
Util::monodroid_strdup_printf (
221-
"Assembly store '%s' is not a valid .NET for Android assembly store file",
222-
entry_name.get ()
223-
)
224-
);
225-
}
226-
227-
if (header->version != ASSEMBLY_STORE_FORMAT_VERSION) {
228-
Helpers::abort_application (
229-
LOG_ASSEMBLY,
230-
Util::monodroid_strdup_printf (
231-
"Assembly store '%s' uses format version 0x%x, instead of the expected 0x%x",
232-
entry_name.get (),
233-
header->version,
234-
ASSEMBLY_STORE_FORMAT_VERSION
235-
)
236-
);
237-
}
238-
239-
constexpr size_t header_size = sizeof(AssemblyStoreHeader);
240-
241-
assembly_store.data_start = static_cast<uint8_t*>(payload_start);
242-
assembly_store.assembly_count = header->entry_count;
243-
assembly_store.index_entry_count = header->index_entry_count;
244-
assembly_store.assemblies = reinterpret_cast<AssemblyStoreEntryDescriptor*>(assembly_store.data_start + header_size + header->index_size);
245-
assembly_store_hashes = reinterpret_cast<AssemblyStoreIndexEntry*>(assembly_store.data_start + header_size);
246-
247-
number_of_found_assemblies += assembly_store.assembly_count;
248-
number_of_mapped_assembly_stores++;
249-
have_and_want_debug_symbols = register_debug_symbols;
256+
verify_assembly_store_and_set_info (payload_start, entry_name.get ());
250257
}
251258

252259
force_inline void
@@ -257,9 +264,15 @@ EmbeddedAssemblies::zip_load_assembly_store_entries (std::vector<uint8_t> const&
257264
}
258265

259266
dynamic_local_string<SENSIBLE_PATH_MAX> entry_name;
260-
bool assembly_store_found = false;
267+
bool assembly_store_found = embedded_assembly_store_size != 0;
268+
if (assembly_store_found) {
269+
log_debug (LOG_ASSEMBLY, "Got embedded assembly store, size %zu", embedded_assembly_store_size);
270+
verify_assembly_store_and_set_info (embedded_assembly_store, "embedded");
271+
log_debug (LOG_ASSEMBLY, "Looking for DSOs in APK");
272+
} else {
273+
log_debug (LOG_ASSEMBLY, "Looking for assembly store ('%s') and DSOs in APK", assembly_store_file_path.data ());
274+
}
261275

262-
log_debug (LOG_ASSEMBLY, "Looking for assembly stores in APK ('%s)", assembly_store_file_path.data ());
263276
for (size_t i = 0; i < num_entries; i++) {
264277
if (all_required_zip_entries_found ()) {
265278
need_to_scan_more_apks = false;

src/native/monodroid/embedded-assemblies.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,8 @@ namespace xamarin::android::internal {
353353
void set_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
354354
void set_assembly_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
355355
void set_debug_entry_data (XamarinAndroidBundledAssembly &entry, ZipEntryLoadState const& state, dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name) noexcept;
356+
357+
void verify_assembly_store_and_set_info (void *data_start, const char *name) noexcept;
356358
void map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState &state) noexcept;
357359
const AssemblyStoreIndexEntry* find_assembly_store_entry (hash_t hash, const AssemblyStoreIndexEntry *entries, size_t entry_count) noexcept;
358360
void store_individual_assembly_data (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState const& state, monodroid_should_register should_register) noexcept;

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

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

307307
size_t embedded_runtime_config_size = 0;
308308
uint8_t embedded_runtime_config[0];
309+
310+
size_t embedded_assembly_store_size = 0;
311+
uint8_t embedded_assembly_store[0];

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,4 +398,7 @@ MONO_API MONO_API_EXPORT void xamarin_app_init (JNIEnv *env, get_function_pointe
398398

399399
MONO_API MONO_API_EXPORT size_t embedded_runtime_config_size;
400400
MONO_API MONO_API_EXPORT uint8_t embedded_runtime_config[];
401+
402+
MONO_API MONO_API_EXPORT size_t embedded_assembly_store_size;
403+
MONO_API MONO_API_EXPORT uint8_t embedded_assembly_store[];
401404
#endif // __XAMARIN_ANDROID_TYPEMAP_H

0 commit comments

Comments
 (0)