Skip to content
Closed
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
2 changes: 1 addition & 1 deletion external/Java.Interop
12 changes: 12 additions & 0 deletions src/Microsoft.Android.Sdk.ILLink/AssemblyResolverCoda.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Mono.Cecil;
using System.IO;

namespace Java.Interop.Tools.Cecil;

public static class AssemblyResolverCoda
{
public static AssemblyDefinition GetAssembly (this IAssemblyResolver resolver, string fileName)
{
return resolver.Resolve (AssemblyNameReference.Parse (Path.GetFileNameWithoutExtension (fileName)));
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\Configuration.props" />
<Import Project="..\..\external\java.interop\src\Java.Interop.NamingCustomAttributes\Java.Interop.NamingCustomAttributes.projitems" Label="Shared" Condition="Exists('..\..\external\java.interop\src\Java.Interop.NamingCustomAttributes\Java.Interop.NamingCustomAttributes.projitems')" />
<PropertyGroup>
<TargetFramework>$(DotNetTargetFramework)</TargetFramework>
<DefineConstants>ILLINK</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants>ILLINK;HAVE_CECIL</DefineConstants>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<OutputPath>$(MicrosoftAndroidSdkOutDir)</OutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.ILLink" Version="$(MicrosoftNETILLinkTasksPackageVersion)" />
<ProjectReference Include="..\..\external\Java.Interop\src\Java.Interop.Export\Java.Interop.Export.csproj" />
<ProjectReference Include="..\..\external\Java.Interop\src\Java.Interop.Localization\Java.Interop.Localization.csproj" />
<ProjectReference Include="..\..\external\xamarin-android-tools\src\Microsoft.Android.Build.BaseTasks\Microsoft.Android.Build.BaseTasks.csproj" />
<ProjectReference Include="..\Xamarin.Android.Build.Tasks\Xamarin.Android.Build.Tasks.csproj" ReferenceOutputAssembly="False" />

<Compile Include="..\Xamarin.Android.Build.Tasks\obj\$(Configuration)\Profile.g.cs" Link="Profile.g.cs" />
Expand Down Expand Up @@ -45,6 +49,13 @@
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.Cecil\Java.Interop.Tools.Cecil\MethodDefinitionRocks.cs" Link="Java.Interop\MethodDefinitionRocks.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.Cecil\Java.Interop.Tools.Cecil\TypeDefinitionCache.cs" Link="Java.Interop\TypeDefinitionCache.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.Cecil\Java.Interop.Tools.Cecil\TypeDefinitionRocks.cs" Link="Java.Interop\TypeDefinitionRocks.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.Diagnostics\Java.Interop.Tools.Diagnostics\Diagnostic.cs" Link="Java.Interop.Tools.Diagnostics\Diagnostic.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.Diagnostics\Java.Interop.Tools.Diagnostics\XamarinAndroidException.cs" Link="Java.Interop.Tools.Diagnostics\XamarinAndroidException.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.JavaCallableWrappers\Java.Interop.Tools.JavaCallableWrappers\Crc64Helper.cs" Link="Java.Interop.Tools.JavaCallableWrappers\Crc64Helper.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.JavaCallableWrappers\Java.Interop.Tools.JavaCallableWrappers\Crc64.Table.cs" Link="Java.Interop.Tools.JavaCallableWrappers\Crc64.Table.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.JavaCallableWrappers\Java.Interop.Tools.JavaCallableWrappers\JavaTypeScanner.cs" Link="Java.Interop.Tools.JavaCallableWrappers\JavaTypeScanner.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.JavaCallableWrappers\Java.Interop.Tools.JavaCallableWrappers\JavaCallableWrapperGenerator.cs" Link="Java.Interop.Tools.JavaCallableWrappers\JavaCallableWrapperGenerator.cs" />
<Compile Include="..\..\external\Java.Interop\src\Java.Interop.Tools.TypeNameMappings\Java.Interop.Tools.TypeNameMappings\JavaNativeTypeManager.cs" Link="Java.Interop.Tools.TypeNameMappings\JavaNativeTypeManager.cs" />
<Compile Include="..\Xamarin.Android.Build.Tasks\Utilities\MonoAndroidHelper.Linker.cs" Link="Utilities\MonoAndroidHelper.Linker.cs" />
</ItemGroup>
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using System;
using System.Buffers;
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using Java.Interop.Tools.JavaCallableWrappers;
using Microsoft.Android.Build.Tasks;
using Mono.Cecil;
using Mono.Linker;
using Mono.Linker.Steps;

#if ILLINK
using Microsoft.Android.Sdk.ILLink;
#endif // ILLINK


namespace MonoDroid.Tuner
{
public class CalculateJavaStubHashStep : BaseStep
{
#if ILLINK
protected override void Process ()
{
logger = (level, message) => Context.LogMessage ($"{level} {message}");
cache = Context;
scanner = new JavaTypeScanner (logger, Context);
}
#else // !ILLINK
public CalculateJavaStubHashStep (Action<TraceLevel, string> logger, IMetadataResolver cache)
{
this.logger = logger;
this.cache = cache;
scanner = new JavaTypeScanner (logger, this.cache);
}
#endif // !ILLINK

static readonly Encoding Encoding = Encoding.UTF8;

Action<TraceLevel, string> logger;
IMetadataResolver cache;
JavaTypeScanner scanner;
string outputDirectory;

public void Calculate (AssemblyDefinition assembly, string outputDirectory)
{
this.outputDirectory = outputDirectory;
ProcessAssembly (assembly);
}

protected override void ProcessAssembly (AssemblyDefinition assembly)
{
HashAlgorithm hasher = new Microsoft.Android.Build.Tasks.Crc64 ();
foreach (var type in scanner.GetJavaTypes (assembly)) {
Hash (hasher, type.FullName);

foreach (var method in type.Methods) {
Hash (hasher, method.Name);
}
}

hasher.TransformFinalBlock (Array.Empty<byte> (), 0, 0);

var assemblyFile = Path.GetFileName (assembly.MainModule.FileName);
var hashFile = Path.Combine (outputDirectory, $"{assemblyFile}.hash");
if (Files.CopyIfStringChanged (Convert.ToBase64String (hasher.Hash), hashFile)) {
logger (TraceLevel.Verbose, $"Saved: {hashFile}");
}
}

static void Hash (HashAlgorithm hasher, string value)
{
int length = Encoding.GetByteCount (value);
var bytes = ArrayPool<byte>.Shared.Rent (length);
try {
Encoding.GetBytes (value, 0, value.Length, bytes, 0);
hasher.TransformBlock (bytes, 0, length, null, 0);
} finally {
ArrayPool<byte>.Shared.Return (bytes);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.Build.Utilities;
using Mono.Cecil;
using System;
using System.Diagnostics;
using System.IO;
using Microsoft.Android.Build.Tasks;

Expand Down Expand Up @@ -54,7 +55,8 @@ public override bool RunTask ()
DeterministicMvid = Deterministic,
};

using (var resolver = new DirectoryAssemblyResolver (this.CreateTaskLogger (), loadDebugSymbols: true, loadReaderParameters: readerParameters)) {
var logger = this.CreateTaskLogger ();
using (var resolver = new DirectoryAssemblyResolver (logger, loadDebugSymbols: true, loadReaderParameters: readerParameters)) {
// Add SearchDirectories with ResolvedAssemblies
foreach (var assembly in ResolvedAssemblies) {
var path = Path.GetFullPath (Path.GetDirectoryName (assembly.ItemSpec));
Expand All @@ -67,6 +69,7 @@ public override bool RunTask ()
var fixAbstractMethodsStep = new FixAbstractMethodsStep (resolver, cache, Log);
var addKeepAliveStep = new AddKeepAlivesStep (resolver, cache, Log, UsingAndroidNETSdk);
var fixLegacyResourceDesignerStep = new FixLegacyResourceDesignerStep (resolver, Log);
var javaStubHashStep = new MonoDroid.Tuner.CalculateJavaStubHashStep (logger, cache);
for (int i = 0; i < SourceFiles.Length; i++) {
var source = SourceFiles [i];
var destination = DestinationFiles [i];
Expand All @@ -89,16 +92,16 @@ public override bool RunTask ()
fixAbstractMethodsStep.CheckAppDomainUsage (assemblyDefinition, (string msg) => Log.LogCodedWarning ("XA2000", msg));
}

// Only run the step on "MonoAndroid" assemblies
// Only run the following step(s) on "MonoAndroid" assemblies
if (MonoAndroidHelper.IsMonoAndroidAssembly (source) && !MonoAndroidHelper.IsSharedRuntimeAssembly (source.ItemSpec)) {
if (assemblyDefinition == null)
assemblyDefinition = resolver.GetAssembly (source.ItemSpec);
assemblyDefinition ??= resolver.GetAssembly (source.ItemSpec);

bool save = fixAbstractMethodsStep.FixAbstractMethods (assemblyDefinition);
if (UseDesignerAssembly)
save |= fixLegacyResourceDesignerStep.ProcessAssemblyDesigner (assemblyDefinition);
if (AddKeepAlives)
save |= addKeepAliveStep.AddKeepAlives (assemblyDefinition);
javaStubHashStep.Calculate (assemblyDefinition, Path.GetDirectoryName (destination.ItemSpec));
if (save) {
Log.LogDebugMessage ($"Saving modified assembly: {destination.ItemSpec}");
writerParameters.WriteSymbols = assemblyDefinition.MainModule.HasSymbols;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1496,6 +1496,8 @@ because xbuild doesn't support framework reference assemblies.
UsingAndroidNETSdk="$(UsingAndroidNETSdk)"
/>
<ItemGroup>
<_AllJavaStubHashFile Include="@(ResolvedAssemblies->'$(MonoAndroidIntermediateAssemblyDir)%(DestinationSubPath).hash')" />
<_JavaStubHashFile Include="@(_AllJavaStubHashFile)" Condition="Exists('%(_AllJavaStubHashFile.Identity)')" />
<FileWrites Include="$(MonoAndroidIntermediateAssemblyDir)**" />
</ItemGroup>
</Target>
Expand Down Expand Up @@ -1525,7 +1527,7 @@ because xbuild doesn't support framework reference assemblies.

<Target Name="_GenerateJavaStubs"
DependsOnTargets="$(_GenerateJavaStubsDependsOnTargets);$(BeforeGenerateAndroidManifest)"
Inputs="@(_AndroidMSBuildAllProjects);@(_ResolvedUserMonoAndroidAssemblies);$(_AndroidManifestAbs);$(_AndroidBuildPropertiesCache);@(AndroidEnvironment);@(LibraryEnvironments)"
Inputs="@(_AndroidMSBuildAllProjects);@(_JavaStubHashFile);$(_AndroidManifestAbs);$(_AndroidBuildPropertiesCache);@(AndroidEnvironment);@(LibraryEnvironments)"
Outputs="$(_AndroidStampDirectory)_GenerateJavaStubs.stamp">

<PropertyGroup>
Expand Down