Skip to content

Commit c854efa

Browse files
committed
Actually use the embedded assembly store
1 parent 207b58d commit c854efa

File tree

6 files changed

+58
-27
lines changed

6 files changed

+58
-27
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: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,35 @@ EmbeddedAssemblies::zip_load_individual_assembly_entries (std::vector<uint8_t> c
157157
}
158158
}
159159

160+
161+
[[gnu::always_inline]] void
162+
EmbeddedAssemblies::verify_assembly_store_and_set_info (void *data_start, const char *name) noexcept
163+
{
164+
auto header = static_cast<AssemblyStoreHeader*>(data_start);
165+
166+
if (header->magic != ASSEMBLY_STORE_MAGIC) {
167+
log_fatal (LOG_ASSEMBLY, "Assembly store '%s' is not a valid .NET for Android assembly store file", name);
168+
Helpers::abort_application ();
169+
}
170+
171+
if (header->version != ASSEMBLY_STORE_FORMAT_VERSION) {
172+
log_fatal (LOG_ASSEMBLY, "Assembly store '%s' uses format version 0x%x, instead of the expected 0x%x", name, header->version, ASSEMBLY_STORE_FORMAT_VERSION);
173+
Helpers::abort_application ();
174+
}
175+
176+
constexpr size_t header_size = sizeof(AssemblyStoreHeader);
177+
178+
assembly_store.data_start = static_cast<uint8_t*>(data_start);
179+
assembly_store.assembly_count = header->entry_count;
180+
assembly_store.index_entry_count = header->index_entry_count;
181+
assembly_store.assemblies = reinterpret_cast<AssemblyStoreEntryDescriptor*>(assembly_store.data_start + header_size + header->index_size);
182+
assembly_store_hashes = reinterpret_cast<AssemblyStoreIndexEntry*>(assembly_store.data_start + header_size);
183+
184+
number_of_found_assemblies += assembly_store.assembly_count;
185+
number_of_mapped_assembly_stores++;
186+
have_and_want_debug_symbols = register_debug_symbols;
187+
}
188+
160189
inline void
161190
EmbeddedAssemblies::map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX> const& entry_name, ZipEntryLoadState &state) noexcept
162191
{
@@ -189,29 +218,7 @@ EmbeddedAssemblies::map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX>
189218

190219
auto [payload_start, payload_size] = get_wrapper_dso_payload_pointer_and_size (assembly_store_map, entry_name.get ());
191220
log_debug (LOG_ASSEMBLY, "Adjusted assembly store pointer: %p; size: %zu", payload_start, payload_size);
192-
auto header = static_cast<AssemblyStoreHeader*>(payload_start);
193-
194-
if (header->magic != ASSEMBLY_STORE_MAGIC) {
195-
log_fatal (LOG_ASSEMBLY, "Assembly store '%s' is not a valid .NET for Android assembly store file", entry_name.get ());
196-
Helpers::abort_application ();
197-
}
198-
199-
if (header->version != ASSEMBLY_STORE_FORMAT_VERSION) {
200-
log_fatal (LOG_ASSEMBLY, "Assembly store '%s' uses format version 0x%x, instead of the expected 0x%x", entry_name.get (), header->version, ASSEMBLY_STORE_FORMAT_VERSION);
201-
Helpers::abort_application ();
202-
}
203-
204-
constexpr size_t header_size = sizeof(AssemblyStoreHeader);
205-
206-
assembly_store.data_start = static_cast<uint8_t*>(payload_start);
207-
assembly_store.assembly_count = header->entry_count;
208-
assembly_store.index_entry_count = header->index_entry_count;
209-
assembly_store.assemblies = reinterpret_cast<AssemblyStoreEntryDescriptor*>(assembly_store.data_start + header_size + header->index_size);
210-
assembly_store_hashes = reinterpret_cast<AssemblyStoreIndexEntry*>(assembly_store.data_start + header_size);
211-
212-
number_of_found_assemblies += assembly_store.assembly_count;
213-
number_of_mapped_assembly_stores++;
214-
have_and_want_debug_symbols = register_debug_symbols;
221+
verify_assembly_store_and_set_info (payload_start, entry_name.get ());
215222
}
216223

217224
force_inline void
@@ -222,9 +229,15 @@ EmbeddedAssemblies::zip_load_assembly_store_entries (std::vector<uint8_t> const&
222229
}
223230

224231
dynamic_local_string<SENSIBLE_PATH_MAX> entry_name;
225-
bool assembly_store_found = false;
232+
bool assembly_store_found = embedded_assembly_store_size != 0;
233+
if (assembly_store_found) {
234+
log_debug (LOG_ASSEMBLY, "Got embedded assembly store, size %zu", embedded_assembly_store_size);
235+
verify_assembly_store_and_set_info (embedded_assembly_store, "embedded");
236+
log_debug (LOG_ASSEMBLY, "Looking for DSOs in APK");
237+
} else {
238+
log_debug (LOG_ASSEMBLY, "Looking for assembly store ('%s') and DSOs in APK", assembly_store_file_path.data ());
239+
}
226240

227-
log_debug (LOG_ASSEMBLY, "Looking for assembly stores in APK ('%s)", assembly_store_file_path.data ());
228241
for (size_t i = 0; i < num_entries; i++) {
229242
if (all_required_zip_entries_found ()) {
230243
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)