Skip to content

Commit 953cd19

Browse files
authored
[Xamarin.Android.Build.Tasks] fix AndroidGenerateResourceDesigner (#7721)
Context: dc3ccf2 Context: dotnet/maui#12520 When `_Microsoft.Android.Resource.Designer.dll` is used (dc3ccf2) and [`$(AndroidGenerateResourceDesigner)`][0]=False, the `__Microsoft.Android.Resource.Designer.cs` file is still generated, which is *equivalent* to `Resource.designer.cs`. This causes a `Resource` type to be generated. This showed up when attempting to bump MAUI to use xamarin-android for .NET 8 (dotnet/maui#12520), which [introduced][1] *lots* of `*.Resource` types which are *not desirable*. Fix this so that when `$(AndroidGenerateResourceDesigner)`=False the `__Microsoft.Android.Resource.Designer.*` files are *not* created. This prevents `*.Resource` types from being added to the assembly. Note that `_Microsoft.Android.Resource.Designer.dll` is still created at build time. A unit test has been updated to test this change. [0]: https://learn.microsoft.com/en-us/xamarin/android/deploy-test/building-apps/build-properties#androidgenerateresourcedesigner [1]: dotnet/maui@2e49812
1 parent 5c4e97b commit 953cd19

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Copyright (C) 2016 Xamarin. All rights reserved.
9393
</Target>
9494

9595
<Target Name="_GenerateResourceDesignerIntermediateClass"
96-
Condition=" '$(AndroidUseDesignerAssembly)' == 'True' "
96+
Condition=" '$(AndroidUseDesignerAssembly)' == 'True' And '$(AndroidGenerateResourceDesigner)' == 'true' "
9797
Inputs="$(MSBuildProjectFullPath)"
9898
Outputs="$(_GenerateResourceDesignerClassFile)"
9999
>
@@ -166,11 +166,11 @@ Copyright (C) 2016 Xamarin. All rights reserved.
166166
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
167167
</ReferencePath>
168168
<Compile Remove="$(_AndroidResourceDesignerFile)" />
169-
<Compile Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' != 'F#' "/>
169+
<Compile Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' != 'F#' And '$(AndroidGenerateResourceDesigner)' == 'true' "/>
170170
<!-- For F# we need to use the CompileBefore ItemGroup so that our type is processed
171171
before all the other types in the build. Otherwise we get weird compiler errors.
172172
-->
173-
<CompileBefore Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' == 'F#' "/>
173+
<CompileBefore Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' == 'F#' And '$(AndroidGenerateResourceDesigner)' == 'true' "/>
174174
</ItemGroup>
175175
</Target>
176176

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
<AndroidEnableSGenConcurrent Condition=" '$(AndroidEnableSGenConcurrent)' == '' ">true</AndroidEnableSGenConcurrent>
1111
<AndroidHttpClientHandlerType Condition=" '$(AndroidHttpClientHandlerType)' == '' and '$(UsingAndroidNETSdk)' == 'true' ">Xamarin.Android.Net.AndroidMessageHandler</AndroidHttpClientHandlerType>
1212
<AndroidHttpClientHandlerType Condition=" '$(AndroidHttpClientHandlerType)' == '' and '$(UsingAndroidNETSdk)' != 'true' ">Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
13-
<AndroidUseDesignerAssembly Condition=" '$(AndroidUseDesignerAssembly)' == '' ">true</AndroidUseDesignerAssembly>
14-
<AndroidGenerateResourceDesigner Condition=" '$(AndroidUseDesignerAssembly)' == 'True' ">false</AndroidGenerateResourceDesigner>
1513
<AndroidGenerateResourceDesigner Condition=" '$(AndroidGenerateResourceDesigner)' == '' ">true</AndroidGenerateResourceDesigner>
14+
<AndroidUseDesignerAssembly Condition=" '$(AndroidUseDesignerAssembly)' == '' ">true</AndroidUseDesignerAssembly>
15+
<AndroidUseIntermediateDesignerFile Condition=" '$(AndroidUseDesignerAssembly)' == 'True' ">false</AndroidUseIntermediateDesignerFile>
1616
<AndroidUseIntermediateDesignerFile Condition=" '$(AndroidUseIntermediateDesignerFile)' == '' ">$(AndroidGenerateResourceDesigner)</AndroidUseIntermediateDesignerFile>
1717
<GenerateDependencyFile Condition=" '$(GenerateDependencyFile)' == '' ">false</GenerateDependencyFile>
1818
<CopyLocalLockFileAssemblies Condition=" '$(CopyLocalLockFileAssemblies)' == '' ">false</CopyLocalLockFileAssemblies>

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,54 @@ public void AppWithSingleJar ()
455455
}
456456

457457
[Test]
458-
public void GenerateResourceDesigner_false()
458+
public void GenerateResourceDesigner([Values (false, true)] bool generateResourceDesigner, [Values (false, true)] bool useDesignerAssembly)
459+
{
460+
var path = Path.Combine ("temp", TestName);
461+
var libraryB = new XASdkProject (outputType: "Library") {
462+
ProjectName = "LibraryB",
463+
};
464+
libraryB.Sources.Clear ();
465+
libraryB.Sources.Add (new BuildItem.Source ("Foo.cs") {
466+
TextContent = () => @"namespace LibraryB;
467+
public class Foo {
468+
public static int foo => Resource.Drawable.foo;
469+
}",
470+
});
471+
libraryB.Sources.Add (new AndroidItem.AndroidResource (() => "Resources\\drawable\\foo.png") {
472+
BinaryContent = () => XamarinAndroidCommonProject.icon_binary_mdpi,
473+
});
474+
libraryB.SetProperty ("AndroidUseDesignerAssembly", useDesignerAssembly.ToString ());
475+
var libraryA = new XASdkProject (outputType: "Library") {
476+
ProjectName = "LibraryA",
477+
};
478+
libraryA.Sources.Clear ();
479+
libraryA.Sources.Add (new BuildItem.Source ("FooA.cs") {
480+
TextContent = () => @"namespace LibraryA;
481+
public class FooA {
482+
public int foo => 0;
483+
public int foo2 => LibraryB.Foo.foo;
484+
public int foo3 => LibraryB.Resource.Drawable.foo;
485+
}",
486+
});
487+
libraryA.AddReference (libraryB);
488+
libraryA.SetProperty ("AndroidGenerateResourceDesigner", generateResourceDesigner.ToString ());
489+
if (!useDesignerAssembly)
490+
libraryA.SetProperty ("AndroidUseDesignerAssembly", "False");
491+
var libraryBBuilder = CreateDotNetBuilder (libraryB, Path.Combine (path, libraryB.ProjectName));
492+
Assert.IsTrue (libraryBBuilder.Build (), "Build of LibraryB should succeed.");
493+
var libraryABuilder = CreateDotNetBuilder (libraryA, Path.Combine (path, libraryA.ProjectName));
494+
Assert.IsTrue (libraryABuilder.Build (), "Build of LibraryA should succeed.");
495+
var proj = new XASdkProject () {
496+
ProjectName = "App1",
497+
};
498+
proj.SetProperty ("AndroidUseDesignerAssembly", useDesignerAssembly.ToString ());
499+
proj.AddReference (libraryA);
500+
var dotnet = CreateDotNetBuilder (proj, Path.Combine (path, proj.ProjectName));
501+
Assert.IsTrue (dotnet.Build (), "Build of Proj should succeed.");
502+
}
503+
504+
[Test]
505+
public void GenerateResourceDesigner_false([Values (false, true)] bool useDesignerAssembly)
459506
{
460507
var proj = new XASdkProject (outputType: "Library") {
461508
Sources = {
@@ -466,7 +513,8 @@ public void GenerateResourceDesigner_false()
466513
};
467514
// Turn off Resource.designer.cs and remove usage of it
468515
proj.SetProperty ("AndroidGenerateResourceDesigner", "false");
469-
proj.SetProperty ("AndroidUseDesignerAssembly", "false");
516+
if (!useDesignerAssembly)
517+
proj.SetProperty ("AndroidUseDesignerAssembly", "false");
470518
proj.MainActivity = proj.DefaultMainActivity
471519
.Replace ("Resource.Layout.Main", "0")
472520
.Replace ("Resource.Id.myButton", "0");
@@ -475,11 +523,15 @@ public void GenerateResourceDesigner_false()
475523
Assert.IsTrue (dotnet.Build(target: "CoreCompile", parameters: new string[] { "BuildingInsideVisualStudio=true" }), "Designtime build should succeed.");
476524
var intermediate = Path.Combine (FullProjectDirectory, proj.IntermediateOutputPath);
477525
var resource_designer_cs = Path.Combine (intermediate, "designtime", "Resource.designer.cs");
526+
if (useDesignerAssembly)
527+
resource_designer_cs = Path.Combine (intermediate, "__Microsoft.Android.Resource.Designer.cs");
478528
FileAssert.DoesNotExist (resource_designer_cs);
479529

480530
Assert.IsTrue (dotnet.Build (), "build should succeed");
481531

482-
resource_designer_cs = Path.Combine (intermediate, "Resource.designer.cs");
532+
resource_designer_cs = Path.Combine (intermediate, "Resource.designer.cs");
533+
if (useDesignerAssembly)
534+
resource_designer_cs = Path.Combine (intermediate, "__Microsoft.Android.Resource.Designer.cs");
483535
FileAssert.DoesNotExist (resource_designer_cs);
484536

485537
var assemblyPath = Path.Combine (FullProjectDirectory, proj.OutputPath, $"{proj.ProjectName}.dll");

0 commit comments

Comments
 (0)