Skip to content

Commit 2781433

Browse files
committed
Release+Lining typemaps
1 parent 2105cdd commit 2781433

File tree

5 files changed

+88
-165
lines changed

5 files changed

+88
-165
lines changed

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

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22

33
using System;
44
using System.Collections.Generic;
5-
using System.Diagnostics;
65
using System.IO;
76
using System.IO.MemoryMappedFiles;
87
using System.Linq;
98
using System.Reflection;
109
using System.Text;
1110
using Microsoft.Build.Framework;
12-
using Microsoft.Build.Utilities;
1311
using Mono.Cecil;
1412

1513

@@ -179,7 +177,7 @@ void RunDebugNoLinking ()
179177

180178
LogRunMode ("Debug, no linking");
181179
XAAssemblyResolver resolver = MakeResolver (useMarshalMethods: false);
182-
var assemblies = CollectInterestingAssemblies<RidAgnosticInputAssemblySet> ((AndroidTargetArch arch) => resolver);
180+
var assemblies = CollectInterestingAssemblies<RidAgnosticInputAssemblySet> (allowAbiSpecific: false, (AndroidTargetArch arch) => resolver);
183181
throw new NotImplementedException ();
184182
}
185183

@@ -191,7 +189,7 @@ void RunDebugWithLinking ()
191189

192190
LogRunMode ("Debug, with linking");
193191
XAAssemblyResolver resolver = MakeResolver (useMarshalMethods: false);
194-
var assemblies = CollectInterestingAssemblies<RidSpecificInputAssemblySet> ((AndroidTargetArch arch) => resolver);
192+
var assemblies = CollectInterestingAssemblies<RidSpecificInputAssemblySet> (allowAbiSpecific: true, (AndroidTargetArch arch) => resolver);
195193
throw new NotImplementedException ();
196194
}
197195

@@ -203,7 +201,7 @@ void RunReleaseNoLinking (bool useMarshalMethods)
203201

204202
LogRunMode ("Release, no linking");
205203
XAAssemblyResolver resolver = MakeResolver (useMarshalMethods);
206-
var assemblies = CollectInterestingAssemblies<RidAgnosticInputAssemblySet> ((AndroidTargetArch arch) => resolver);
204+
var assemblies = CollectInterestingAssemblies<RidAgnosticInputAssemblySet> (allowAbiSpecific: false, (AndroidTargetArch arch) => resolver);
207205
var state = new RunState {
208206
UseMarshalMethods = useMarshalMethods,
209207
AssemblySet = assemblies,
@@ -233,7 +231,7 @@ void RunReleaseWithLinking (bool useMarshalMethods)
233231
// We don't check whether we have a resolver for `arch` on purpose, if it throws then it means we have a bug which
234232
// should be fixed since there shouldn't be any assemblies passed to this task that belong in ABIs other than those
235233
// specified in `SupportedAbis`
236-
var assemblies = CollectInterestingAssemblies<RidSpecificInputAssemblySet> ((AndroidTargetArch arch) => resolvers[arch]);
234+
var assemblies = CollectInterestingAssemblies<RidSpecificInputAssemblySet> (allowAbiSpecific: true, (AndroidTargetArch arch) => resolvers[arch]);
237235
bool first = true;
238236

239237
foreach (var kvp in resolvers) {
@@ -265,7 +263,7 @@ void LogRunMode (string mode)
265263
Log.LogDebugMessage ($"GenerateJavaStubs mode: {mode}");
266264
}
267265

268-
T CollectInterestingAssemblies<T> (Func<AndroidTargetArch, XAAssemblyResolver> getResolver) where T: InputAssemblySet, new()
266+
T CollectInterestingAssemblies<T> (bool allowAbiSpecific, Func<AndroidTargetArch, XAAssemblyResolver> getResolver) where T: InputAssemblySet, new()
269267
{
270268
var assemblies = new T ();
271269
AndroidTargetArch targetArch;
@@ -294,7 +292,7 @@ void LogRunMode (string mode)
294292
assemblies.AddJavaTypeAssembly (assembly);
295293
}
296294

297-
targetArch = MonoAndroidHelper.GetTargetArch (assembly);
295+
targetArch = GetTargetArch (assembly);
298296
getResolver (targetArch).Load (targetArch, assembly.ItemSpec);
299297
}
300298

@@ -305,13 +303,24 @@ void LogRunMode (string mode)
305303
continue;
306304
}
307305

308-
targetArch = MonoAndroidHelper.GetTargetArch (assembly);
306+
targetArch = GetTargetArch (assembly);
309307
getResolver (targetArch).Load (targetArch, assembly.ItemSpec);
310308

311309
assemblies.AddJavaTypeAssembly (assembly);
312310
assemblies.AddUserAssembly (assembly);
313311
}
312+
314313
return assemblies;
314+
315+
AndroidTargetArch GetTargetArch (ITaskItem assembly)
316+
{
317+
AndroidTargetArch targetArch = MonoAndroidHelper.GetTargetArch (assembly);
318+
if (!allowAbiSpecific && targetArch != AndroidTargetArch.None) {
319+
throw new InvalidOperationException ($"Internal error: ABI-specific assemblies are not allowed in this build configuration");
320+
}
321+
322+
return targetArch;
323+
}
315324
}
316325

317326
void DoRun (RunState state, out ApplicationConfigTaskState? appConfState)
@@ -335,17 +344,17 @@ void DoRun (RunState state, out ApplicationConfigTaskState? appConfState)
335344
var scanner = new XAJavaTypeScanner (Log, cache) {
336345
ErrorOnCustomJavaObject = ErrorOnCustomJavaObject,
337346
};
338-
List<JavaType> allJavaTypes = scanner.GetJavaTypes (state.JavaTypeAssemblies, state.Resolver);
339-
var javaTypes = new List<JavaType> ();
347+
ICollection<TypeDefinition> allJavaTypes = scanner.GetJavaTypes (state.JavaTypeAssemblies, state.Resolver);
348+
var javaTypes = new List<TypeDefinition> ();
340349

341-
foreach (JavaType jt in allJavaTypes) {
350+
foreach (TypeDefinition javaType in allJavaTypes) {
342351
// Whem marshal methods are in use we do not want to skip non-user assemblies (such as Mono.Android) - we need to generate JCWs for them during
343352
// application build, unlike in Debug configuration or when marshal methods are disabled, in which case we use JCWs generated during Xamarin.Android
344353
// build and stored in a jar file.
345-
if ((!state.UseMarshalMethods && !state.AssemblySet.IsUserAssembly (jt.Type.Module.Assembly.Name.Name)) || JavaTypeScanner.ShouldSkipJavaCallableWrapperGeneration (jt.Type, cache)) {
354+
if ((!state.UseMarshalMethods && !state.AssemblySet.IsUserAssembly (javaType.Module.Assembly.Name.Name)) || JavaTypeScanner.ShouldSkipJavaCallableWrapperGeneration (javaType, cache)) {
346355
continue;
347356
}
348-
javaTypes.Add (jt);
357+
javaTypes.Add (javaType);
349358
}
350359

351360
MarshalMethodsClassifier? classifier = null;
@@ -402,12 +411,11 @@ void DoRun (RunState state, out ApplicationConfigTaskState? appConfState)
402411
}
403412
}
404413

405-
void CreateAdditionalJavaSources (List<JavaType> javaTypes, TypeDefinitionCache cache, MarshalMethodsClassifier? classifier)
414+
void CreateAdditionalJavaSources (ICollection<TypeDefinition> javaTypes, TypeDefinitionCache cache, MarshalMethodsClassifier? classifier)
406415
{
407416
StringWriter regCallsWriter = new StringWriter ();
408417
regCallsWriter.WriteLine ("\t\t// Application and Instrumentation ACWs must be registered first.");
409-
foreach (JavaType jt in javaTypes) {
410-
TypeDefinition type = jt.Type;
418+
foreach (TypeDefinition type in javaTypes) {
411419
if (JavaNativeTypeManager.IsApplication (type, cache) || JavaNativeTypeManager.IsInstrumentation (type, cache)) {
412420
if (classifier != null && !classifier.FoundDynamicallyRegisteredMethods (type)) {
413421
continue;
@@ -426,7 +434,7 @@ void CreateAdditionalJavaSources (List<JavaType> javaTypes, TypeDefinitionCache
426434
template => template.Replace ("// REGISTER_APPLICATION_AND_INSTRUMENTATION_CLASSES_HERE", regCallsWriter.ToString ()));
427435
}
428436

429-
void UpdateAndroidManifest (RunState state, TypeDefinitionCache cache, List<JavaType> allJavaTypes)
437+
void UpdateAndroidManifest (RunState state, TypeDefinitionCache cache, ICollection<TypeDefinition> allJavaTypes)
430438
{
431439
var manifest = new ManifestDocument (ManifestTemplate) {
432440
PackageName = PackageName,
@@ -468,7 +476,7 @@ void UpdateAndroidManifest (RunState state, TypeDefinitionCache cache, List<Java
468476
}
469477
}
470478

471-
void WriteAcwMaps (List<JavaType> javaTypes, TypeDefinitionCache cache)
479+
void WriteAcwMaps (List<TypeDefinition> javaTypes, TypeDefinitionCache cache)
472480
{
473481
var writer = new AcwMapWriter (Log, AcwMapFile);
474482
writer.Write (javaTypes, cache);
@@ -504,7 +512,7 @@ AssemblyDefinition LoadAssembly (string path, XAAssemblyResolver? resolver = nul
504512
}
505513
}
506514

507-
bool CreateJavaSources (IEnumerable<JavaType> newJavaTypes, TypeDefinitionCache cache, MarshalMethodsClassifier classifier, bool useMarshalMethods)
515+
bool CreateJavaSources (IEnumerable<TypeDefinition> newJavaTypes, TypeDefinitionCache cache, MarshalMethodsClassifier classifier, bool useMarshalMethods)
508516
{
509517
if (useMarshalMethods && classifier == null) {
510518
throw new ArgumentNullException (nameof (classifier));
@@ -516,8 +524,7 @@ bool CreateJavaSources (IEnumerable<JavaType> newJavaTypes, TypeDefinitionCache
516524
bool generateOnCreateOverrides = int.Parse (AndroidSdkPlatform) <= 10;
517525

518526
bool ok = true;
519-
foreach (JavaType jt in newJavaTypes) {
520-
TypeDefinition t = jt.Type; // JCW generator doesn't care about ABI-specific types or token ids
527+
foreach (TypeDefinition t in newJavaTypes) {
521528
if (t.IsInterface) {
522529
// Interfaces are in typemap but they shouldn't have JCW generated for them
523530
continue;
@@ -620,7 +627,7 @@ void SaveResource (string resource, string filename, string destDir, Func<string
620627
Files.CopyIfStringChanged (template, Path.Combine (destDir, filename));
621628
}
622629

623-
void WriteTypeMappings (AndroidTargetArch targetArch, List<JavaType> types, TypeDefinitionCache cache, out ApplicationConfigTaskState appConfState)
630+
void WriteTypeMappings (AndroidTargetArch targetArch, ICollection<TypeDefinition> types, TypeDefinitionCache cache, out ApplicationConfigTaskState appConfState)
624631
{
625632
Log.LogDebugMessage ($"Generating typemaps for arch {targetArch}, {types.Count} types");
626633
var tmg = new TypeMapGenerator (targetArch, Log, SupportedAbis);

src/Xamarin.Android.Build.Tasks/Utilities/AcwMapWriter.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public AcwMapWriter (TaskLoggingHelper log, string acwMapFile)
2121
AcwMapFile = acwMapFile;
2222
}
2323

24-
public void Write (List<JavaType> javaTypes, TypeDefinitionCache cache)
24+
public void Write (ICollection<TypeDefinition> javaTypes, TypeDefinitionCache cache)
2525
{
2626
// We need to save a map of .NET type -> ACW type for resource file fixups
2727
var managed = new Dictionary<string, TypeDefinition> (javaTypes.Count, StringComparer.Ordinal);
@@ -31,8 +31,7 @@ public void Write (List<JavaType> javaTypes, TypeDefinitionCache cache)
3131
var javaConflicts = new Dictionary<string, List<string>> (0, StringComparer.Ordinal);
3232

3333
using (var acw_map = MemoryStreamPool.Shared.CreateStreamWriter ()) {
34-
foreach (JavaType jt in javaTypes) {
35-
TypeDefinition type = jt.Type;
34+
foreach (TypeDefinition type in javaTypes) {
3635
string managedKey = type.FullName.Replace ('/', '.');
3736
string javaKey = JavaNativeTypeManager.ToJniName (type, cache).Replace ('/', '.');
3837

src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ void ReorderActivityAliases (TaskLoggingHelper log, XElement app)
255255
}
256256
}
257257

258-
public IList<string> Merge (TaskLoggingHelper log, TypeDefinitionCache cache, List<JavaType> subclasses, string applicationClass, bool embed, string bundledWearApplicationName, IEnumerable<string> mergedManifestDocuments)
258+
public IList<string> Merge (TaskLoggingHelper log, TypeDefinitionCache cache, ICollection<TypeDefinition> subclasses, string applicationClass, bool embed, string bundledWearApplicationName, IEnumerable<string> mergedManifestDocuments)
259259
{
260260
var manifest = doc.Root;
261261

@@ -330,8 +330,7 @@ public IList<string> Merge (TaskLoggingHelper log, TypeDefinitionCache cache, Li
330330
throw new InvalidOperationException (string.Format ("The targetSdkVersion ({0}) is not a valid API level", targetSdkVersion));
331331
int targetSdkVersionValue = tryTargetSdkVersion.Value;
332332

333-
foreach (JavaType jt in subclasses) {
334-
TypeDefinition t = jt.Type;
333+
foreach (TypeDefinition t in subclasses) {
335334
if (t.IsAbstract)
336335
continue;
337336

@@ -568,7 +567,7 @@ Func<TypeDefinition, string, TypeDefinitionCache, int, XElement> GetGenerator (T
568567
return null;
569568
}
570569

571-
XElement CreateApplicationElement (XElement manifest, string applicationClass, List<JavaType> subclasses, TypeDefinitionCache cache)
570+
XElement CreateApplicationElement (XElement manifest, string applicationClass, ICollection<TypeDefinition> subclasses, TypeDefinitionCache cache)
572571
{
573572
var application = manifest.Descendants ("application").FirstOrDefault ();
574573

@@ -592,8 +591,7 @@ XElement CreateApplicationElement (XElement manifest, string applicationClass, L
592591
List<ApplicationAttribute> typeAttr = new List<ApplicationAttribute> ();
593592
List<UsesLibraryAttribute> typeUsesLibraryAttr = new List<UsesLibraryAttribute> ();
594593
List<UsesConfigurationAttribute> typeUsesConfigurationAttr = new List<UsesConfigurationAttribute> ();
595-
foreach (JavaType jt in subclasses) {
596-
TypeDefinition t = jt.Type;
594+
foreach (TypeDefinition t in subclasses) {
597595
ApplicationAttribute aa = ApplicationAttribute.FromCustomAttributeProvider (t);
598596
if (aa == null)
599597
continue;
@@ -925,7 +923,7 @@ void AddSupportsGLTextures (XElement application, TypeDefinitionCache cache)
925923
}
926924
}
927925

928-
void AddInstrumentations (XElement manifest, IList<JavaType> subclasses, int targetSdkVersion, TypeDefinitionCache cache)
926+
void AddInstrumentations (XElement manifest, ICollection<TypeDefinition> subclasses, int targetSdkVersion, TypeDefinitionCache cache)
929927
{
930928
var assemblyAttrs =
931929
Assemblies.SelectMany (path => InstrumentationAttribute.FromCustomAttributeProvider (Resolver.GetAssembly (path)));
@@ -938,8 +936,7 @@ void AddInstrumentations (XElement manifest, IList<JavaType> subclasses, int tar
938936
manifest.Add (ia.ToElement (PackageName, cache));
939937
}
940938

941-
foreach (JavaType jt in subclasses) {
942-
TypeDefinition type = jt.Type;
939+
foreach (TypeDefinition type in subclasses) {
943940
if (type.IsSubclassOf ("Android.App.Instrumentation", cache)) {
944941
var xe = InstrumentationFromTypeDefinition (type, JavaNativeTypeManager.ToJniName (type, cache).Replace ('/', '.'), cache);
945942
if (xe != null)

0 commit comments

Comments
 (0)