Skip to content

Commit 53f3f2e

Browse files
committed
emergency commit of all the stuff
1 parent 38f4e44 commit 53f3f2e

File tree

7 files changed

+154
-6
lines changed

7 files changed

+154
-6
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
using Mono.Cecil;
6+
7+
using Java.Interop.Tools.Cecil;
8+
9+
using Mono.Linker;
10+
using Mono.Linker.Steps;
11+
12+
using Mono.Tuner;
13+
#if NET5_LINKER
14+
using Microsoft.Android.Sdk.ILLink;
15+
#endif
16+
17+
namespace MonoDroid.Tuner
18+
{
19+
public class FixLegacyResourceDesignerStep :
20+
#if NET5_LINKER
21+
BaseMarkHandler
22+
#else // !NET5_LINKER
23+
BaseStep
24+
#endif // !NET5_LINKER
25+
{
26+
AssemblyDefinition designerAssembly = null;
27+
28+
#if NET5_LINKER
29+
protected void ProcessType (TypeDefinition type)
30+
{
31+
}
32+
#else
33+
protected override void Process ()
34+
{
35+
var designerNameAssembly = AssemblyNameReference.Parse ("Xamarin.Android.Resource.Designer, Version=1.0.0.0");
36+
designerAssembly = Context.Resolver.Resolve (designerNameAssembly);
37+
if (designerAssembly == null) {
38+
Context.LogMessage ($" Did not find Xamarin.Android.Resource.Designer");
39+
return;
40+
}
41+
}
42+
protected override void ProcessAssembly (AssemblyDefinition assembly)
43+
{
44+
if (designerAssembly == null) {
45+
Context.LogMessage ($" Not using Xamarin.Android.Resource.Designer");
46+
return;
47+
}
48+
if (!FindResourceDesigner (assembly, mainApplication: false, out TypeDefinition designer, out CustomAttribute designerAttribute)) {
49+
Context.LogMessage ($" {assembly.Name.Name} has not designer. ");
50+
return;
51+
}
52+
Context.LogMessage ($" {assembly.Name.Name} has a designer. ");
53+
if (designer.BaseType.FullName == "Xamarin.Android.Resource.Designer.Resource") {
54+
Context.LogMessage ($" {assembly.Name.Name} has aleady been processed. ");
55+
return;
56+
}
57+
assembly.MainModule.AssemblyReferences.Add (designerAssembly.Name);
58+
var designerAssemblyDef = assembly.MainModule.AssemblyResolver.Resolve(designerAssembly.Name);
59+
var t = designerAssemblyDef.MainModule.GetTypes ().First (x => x.FullName == "Xamarin.Android.Resource.Designer.Resource");
60+
var designerType = assembly.MainModule.ImportReference (t.Resolve ());
61+
ClearDesignerClass (designer);
62+
designer.BaseType = designerType;
63+
// now replace all ldsfld with a call to the property get_ method.
64+
}
65+
#endif
66+
bool FindResourceDesigner (AssemblyDefinition assembly, bool mainApplication, out TypeDefinition designer, out CustomAttribute designerAttribute)
67+
{
68+
string designerFullName = null;
69+
designer = null;
70+
designerAttribute = null;
71+
foreach (CustomAttribute attribute in assembly.CustomAttributes)
72+
{
73+
if (attribute.AttributeType.FullName == "Android.Runtime.ResourceDesignerAttribute")
74+
{
75+
designerAttribute = attribute;
76+
if (attribute.HasProperties)
77+
{
78+
foreach (var p in attribute.Properties)
79+
{
80+
if (p.Name == "IsApplication" && (bool)p.Argument.Value == (mainApplication ? mainApplication : (bool)p.Argument.Value))
81+
{
82+
designerFullName = attribute.ConstructorArguments[0].Value.ToString ();
83+
break;
84+
}
85+
}
86+
}
87+
break;
88+
89+
}
90+
}
91+
if (string.IsNullOrEmpty(designerFullName))
92+
return false;
93+
94+
foreach (ModuleDefinition module in assembly.Modules)
95+
{
96+
foreach (TypeDefinition type in module.Types)
97+
{
98+
if (type.FullName == designerFullName)
99+
{
100+
designer = type;
101+
return true;
102+
}
103+
}
104+
}
105+
return false;
106+
}
107+
108+
void ClearDesignerClass (TypeDefinition designer)
109+
{
110+
Context.LogMessage ($" TryRemoving {designer.FullName}");
111+
designer.NestedTypes.Clear ();
112+
designer.Methods.Clear ();
113+
designer.Fields.Clear ();
114+
designer.Properties.Clear ();
115+
designer.CustomAttributes.Clear ();
116+
designer.Interfaces.Clear ();
117+
designer.Events.Clear ();
118+
}
119+
}
120+
}

src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/Linker.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ static Pipeline CreatePipeline (LinkerOptions options)
111111
pipeline.AppendStep (new RemoveResources (options.I18nAssemblies)); // remove collation tables
112112
// end monodroid specific
113113

114+
pipeline.AppendStep (new FixLegacyResourceDesignerStep ());
114115
pipeline.AppendStep (new FixAbstractMethodsStep (cache));
115116
pipeline.AppendStep (new MonoDroidMarkStep (cache));
116117
pipeline.AppendStep (new SweepStep ());

src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidProfile.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ protected override bool IsSdk (string assemblyName)
1919
{
2020
return assemblyName.Equals ("Java.Interop", StringComparison.Ordinal)
2121
|| assemblyName.Equals ("Java.Interop.GenericMarshaler", StringComparison.Ordinal)
22+
|| assemblyName.Equals ("Xamarin.Android.Resource.Designer", StringComparison.Ordinal)
2223
|| base.IsSdk (assemblyName);
2324
}
2425
}

src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Resource.Designer.targets

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ Copyright (C) 2016 Xamarin. All rights reserved.
6060
ProjectDir="$(ProjectDir)"
6161
Resources="@(AndroidResource);@(AndroidBoundLayout)"
6262
ResourceDirectory="$(MonoAndroidResourcePrefix)"
63+
FrameworkDirectories="$(_XATargetFrameworkDirectories);$(_XATargetFrameworkDirectories)Facades"
6364
AdditionalResourceDirectories="@(LibraryResourceDirectories)"
6465
>
6566
</GenerateResourceDesignerAssembly>
@@ -68,6 +69,7 @@ Copyright (C) 2016 Xamarin. All rights reserved.
6869
<ReferencePath Include="$(_GenerateResourceDesignerAssemblyOutput)">
6970
<CopyLocal>true</CopyLocal>
7071
</ReferencePath>
72+
<ResolvedFileToPublish Include="$(_GenerateResourceDesignerAssemblyOutput)" />
7173
<Compile Remove="$(_AndroidResourceDesignerFile)" />
7274
</ItemGroup>
7375
</Target>

src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<AndroidHttpClientHandlerType Condition=" '$(AndroidHttpClientHandlerType)' == '' and '$(UsingAndroidNETSdk)' == 'true' ">Xamarin.Android.Net.AndroidMessageHandler</AndroidHttpClientHandlerType>
1212
<AndroidHttpClientHandlerType Condition=" '$(AndroidHttpClientHandlerType)' == '' and '$(UsingAndroidNETSdk)' != 'true' ">Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
1313
<AndroidGenerateResourceDesigner Condition=" '$(AndroidGenerateResourceDesigner)' == '' ">true</AndroidGenerateResourceDesigner>
14-
<AndroidUseIntermediateDesignerFile Condition=" '$(AndroidUseIntermediateDesignerFile)' == '' ">$(AndroidGenerateResourceDesigner)</AndroidUseIntermediateDesignerFile>
14+
<AndroidUseIntermediateDesignerFile Condition=" '$(AndroidUseIntermediateDesignerFile)' == '' And '$(AndroidUseDesignerAssembly)' == 'False' ">$(AndroidGenerateResourceDesigner)</AndroidUseIntermediateDesignerFile>
1515
<GenerateDependencyFile Condition=" '$(GenerateDependencyFile)' == '' ">false</GenerateDependencyFile>
1616
<CopyLocalLockFileAssemblies Condition=" '$(CopyLocalLockFileAssemblies)' == '' ">false</CopyLocalLockFileAssemblies>
1717
<ComputeNETCoreBuildOutputFiles Condition=" '$(ComputeNETCoreBuildOutputFiles)' == '' ">false</ComputeNETCoreBuildOutputFiles>

src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.Publish.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ This file contains the implementation for 'dotnet publish'.
2424
<_AllPackageFormats Include="$(AndroidPackageFormat);$(AndroidPackageFormats)" />
2525
<_AndroidPackageFormats Include="@(_AllPackageFormats->Distinct())" />
2626
<_AndroidFilesToPublish Include="$(OutputPath)*.%(_AndroidPackageFormats.Identity)" />
27+
<_AndroidFilesToPublish Include="$(_GenerateResourceDesignerAssemblyOutput)" Condition="Exists('$(_GenerateResourceDesignerAssemblyOutput)')" />
2728
<ResolvedFileToPublish Remove="@(ResolvedFileToPublish)" />
2829
<ResolvedFileToPublish Include="@(_AndroidFilesToPublish)" RelativePath="%(FileName)%(Extension)" />
2930
</ItemGroup>

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

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Microsoft.Android.Build.Tasks;
1111
using Mono.Cecil;
1212
using Mono.Cecil.Cil;
13+
using Java.Interop.Tools.Cecil;
1314

1415
namespace Xamarin.Android.Tasks
1516
{
@@ -49,24 +50,41 @@ public class GenerateResourceDesignerAssembly : AndroidTask
4950

5051
public ITaskItem[] AdditionalResourceDirectories { get; set; }
5152

53+
public ITaskItem[] FrameworkDirectories { get; set; }
54+
5255
TypeReference intArray;
5356
TypeReference intRef;
5457
TypeReference objectRef;
5558
Dictionary<string, string> resource_fixup = new Dictionary<string, string> (StringComparer.OrdinalIgnoreCase);
5659

5760
public override bool RunTask ()
5861
{
62+
using (var res = new DirectoryAssemblyResolver (this.CreateTaskLogger (), loadDebugSymbols: false)) {
63+
Run(res);
64+
}
65+
return !Log.HasLoggedErrors;
66+
}
67+
68+
bool Run(DirectoryAssemblyResolver res) {
69+
70+
foreach (var dir in FrameworkDirectories) {
71+
if (Directory.Exists (dir.ItemSpec))
72+
res.SearchDirectories.Add (dir.ItemSpec);
73+
}
5974
// ResourceDirectory may be a relative path, and
6075
// we need to compare it to absolute paths
6176
ResourceDirectory = Path.GetFullPath (ResourceDirectory);
6277

6378
BuildRenameMap (ResourceDirectory);
6479
// Generate an assembly which contains all the values in the provided
6580
// R.txt file.
81+
var mp = new ModuleParameters ();
82+
mp.AssemblyResolver = res;
83+
mp.Kind = ModuleKind.Dll;
6684
var assembly = AssemblyDefinition.CreateAssembly (
6785
new AssemblyNameDefinition (DesignerAssemblyName, new Version (1, 0)),
6886
DesignerAssemblyName,
69-
ModuleKind.Dll);
87+
mp);
7088

7189
var module = assembly.MainModule;
7290

@@ -85,10 +103,11 @@ public override bool RunTask ()
85103
var attr = new CustomAttribute (targetFrameworkConstructor);
86104
// ".NETStandard,Version=v2.0"
87105
// {TargetFrameworkIdentifier},Version={TargetFrameworkVersion}
88-
attr.ConstructorArguments.Add (new CustomAttributeArgument (module.TypeSystem.String, $".NETStandard,Version=2.0"));
106+
attr.ConstructorArguments.Add (new CustomAttributeArgument (module.TypeSystem.String, $"{TargetFrameworkIdentifier},Version={TargetFrameworkVersion}"));
89107
attr.Properties.Add (new CustomAttributeNamedArgument("FrameworkDisplayName", new CustomAttributeArgument(module.TypeSystem.String, "")));
90108
module.Assembly.CustomAttributes.Add (attr);
91109

110+
92111
var att = TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.BeforeFieldInit;
93112

94113
intArray = new ArrayType (module.TypeSystem.Int32);
@@ -105,13 +124,17 @@ public override bool RunTask ()
105124

106125
ProcessRtxtFile (RTxtFile.ItemSpec, resourceDesigner, module);
107126

127+
// var mscorlib = module.AssemblyReferences.FirstOrDefault(x => x.Name == "mscorlib");
128+
// if (mscorlib != null)
129+
// module.AssemblyReferences.Remove(mscorlib);
130+
108131
assembly.Write (OutputFile.ItemSpec);
109132
return !Log.HasLoggedErrors;
110133
}
111134

112-
MethodReference ImportCustomAttributeConstructor (string type, ModuleDefinition module, ModuleDefinition sourceModule)
135+
MethodReference ImportCustomAttributeConstructor (string type, ModuleDefinition module, ModuleDefinition sourceModule = null)
113136
{
114-
var tr = module.ImportReference (sourceModule.ExportedTypes.First(x => x.FullName == type).Resolve ());
137+
var tr = module.ImportReference ((sourceModule ?? module).ExportedTypes.First(x => x.FullName == type).Resolve ());
115138
var tv = tr.Resolve();
116139
return module.ImportReference (tv.Methods.First(x => x.IsConstructor));
117140
}
@@ -185,7 +208,7 @@ void CreateIntArrayProperty (string resourceClass, string propertyName, int[] va
185208
nestedType.Methods.Insert (Math.Max(0, nestedType.Methods.Count () -1), p.GetMethod);
186209
}
187210

188-
Dictionary<string, TypeDefinition> resourceClasses = new Dictionary<string, TypeDefinition> ();
211+
Dictionary<string, TypeDefinition> resourceClasses = new Dictionary<string, TypeDefinition> (StringComparer.OrdinalIgnoreCase);
189212

190213
void CreateCtor (TypeDefinition type, ModuleDefinition module)
191214
{

0 commit comments

Comments
 (0)