Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace MonoDroid.Tuner
{
static class AddKeepAlivesHelper
{
internal static bool AddKeepAlives (AssemblyDefinition assembly, IMetadataResolver resolver, Func<AssemblyDefinition> getCorlibAssembly, Action<string> logMessage)
internal static bool AddKeepAlives (AssemblyDefinition assembly, IMetadataResolver resolver, Func<AssemblyDefinition?> getCorlibAssembly, Action<string> logMessage)
{
if (!assembly.MainModule.HasTypeReference ("Java.Lang.Object"))
return false;
Expand All @@ -27,9 +27,9 @@ internal static bool AddKeepAlives (AssemblyDefinition assembly, IMetadataResolv
return changed;
}

static bool ProcessType (TypeDefinition type, IMetadataResolver resolver, ref MethodDefinition? methodKeepAlive, Func<AssemblyDefinition> getCorlibAssembly, Action<string> logMessage)
static bool ProcessType (TypeDefinition type, IMetadataResolver resolver, ref MethodDefinition? methodKeepAlive, Func<AssemblyDefinition?> getCorlibAssembly, Action<string> logMessage)
{
bool changed = false;
bool changed = false;
if (MightNeedFix (type, resolver))
changed |= AddKeepAlives (type, ref methodKeepAlive, getCorlibAssembly, logMessage);

Expand All @@ -47,7 +47,7 @@ static bool MightNeedFix (TypeDefinition type, IMetadataResolver resolver)
return !type.IsAbstract && type.IsSubclassOf ("Java.Lang.Object", resolver);
}

static bool AddKeepAlives (TypeDefinition type, ref MethodDefinition? methodKeepAlive, Func<AssemblyDefinition> getCorlibAssembly, Action<string> logMessage)
static bool AddKeepAlives (TypeDefinition type, ref MethodDefinition? methodKeepAlive, Func<AssemblyDefinition?> getCorlibAssembly, Action<string> logMessage)
{
bool changed = false;
foreach (MethodDefinition method in type.Methods) {
Expand Down Expand Up @@ -97,7 +97,7 @@ static bool AddKeepAlives (TypeDefinition type, ref MethodDefinition? methodKeep
return changed;
}

static MethodDefinition? GetKeepAliveMethod (Func<AssemblyDefinition> getCorlibAssembly, Action<string> logMessage)
static MethodDefinition? GetKeepAliveMethod (Func<AssemblyDefinition?> getCorlibAssembly, Action<string> logMessage)
{
var corlibAssembly = getCorlibAssembly ();
if (corlibAssembly == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ namespace MonoDroid.Tuner;
class PostTrimmingAddKeepAlivesStep : IAssemblyModifierPipelineStep
{
readonly IMetadataResolver cache;
readonly Func<AssemblyDefinition> getCorlibAssembly;
readonly Func<AssemblyDefinition?> getCorlibAssembly;
readonly Action<string> logMessage;

public PostTrimmingAddKeepAlivesStep (IMetadataResolver cache, Func<AssemblyDefinition> getCorlibAssembly, Action<string> logMessage)
public PostTrimmingAddKeepAlivesStep (IMetadataResolver cache, Func<AssemblyDefinition?> getCorlibAssembly, Action<string> logMessage)
{
this.cache = cache;
this.getCorlibAssembly = getCorlibAssembly;
Expand Down
16 changes: 15 additions & 1 deletion src/Xamarin.Android.Build.Tasks/Tasks/PostTrimmingPipeline.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,22 @@ public override bool RunTask ()
var steps = new List<IAssemblyModifierPipelineStep> ();
steps.Add (new StripEmbeddedLibrariesStep (Log));
if (AddKeepAlives) {
// Memoize the corlib resolution so the attempt (and any error logging) happens at most once,
// regardless of how many assemblies/methods need KeepAlive injection.
AssemblyDefinition? corlibAssembly = null;
bool corlibResolutionAttempted = false;
steps.Add (new PostTrimmingAddKeepAlivesStep (cache,
() => resolver.Resolve (AssemblyNameReference.Parse ("System.Private.CoreLib")),
() => {
if (!corlibResolutionAttempted) {
corlibResolutionAttempted = true;
try {
corlibAssembly = resolver.Resolve (AssemblyNameReference.Parse ("System.Private.CoreLib"));
} catch (AssemblyResolutionException ex) {
Log.LogErrorFromException (ex, showStackTrace: false);
}
}
return corlibAssembly;
},
(msg) => Log.LogDebugMessage (msg)));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@
<None Remove="Tests\**" />
<Compile Include="..\..\bin\Build$(Configuration)\XABuildConfig.cs" />

<!-- Include only the linker sources required for LinkAssembliesNoShrink - AddKeepAlivesStep, FixAbstractMethodsStep, FixLegacyResourceDesignerStep -->
<!-- Include only the linker sources required for the build tasks (LinkAssembliesNoShrink and PostTrimmingPipeline) -->
<!-- These include: AddKeepAlivesStep, AddKeepAlivesHelper, StripEmbeddedLibrariesStep, PostTrimmingAddKeepAlivesStep, FixAbstractMethodsStep, FixLegacyResourceDesignerStep -->
<Compile Remove="Linker\**" />
<Compile Include="Linker\MonoDroid.Tuner\FindTypeMapObjectsStep.cs" />
<Compile Include="Linker\MonoDroid.Tuner\FindJavaObjectsStep.cs" />
Expand Down