Skip to content

Commit

Permalink
[Xamarin.Android.Build.Tasks] fix AndroidGenerateResourceDesigner (#7721
Browse files Browse the repository at this point in the history
)

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
  • Loading branch information
dellis1972 authored Jan 24, 2023
1 parent 5c4e97b commit 953cd19
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ Copyright (C) 2016 Xamarin. All rights reserved.
</Target>

<Target Name="_GenerateResourceDesignerIntermediateClass"
Condition=" '$(AndroidUseDesignerAssembly)' == 'True' "
Condition=" '$(AndroidUseDesignerAssembly)' == 'True' And '$(AndroidGenerateResourceDesigner)' == 'true' "
Inputs="$(MSBuildProjectFullPath)"
Outputs="$(_GenerateResourceDesignerClassFile)"
>
Expand Down Expand Up @@ -166,11 +166,11 @@ Copyright (C) 2016 Xamarin. All rights reserved.
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ReferencePath>
<Compile Remove="$(_AndroidResourceDesignerFile)" />
<Compile Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' != 'F#' "/>
<Compile Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' != 'F#' And '$(AndroidGenerateResourceDesigner)' == 'true' "/>
<!-- For F# we need to use the CompileBefore ItemGroup so that our type is processed
before all the other types in the build. Otherwise we get weird compiler errors.
-->
<CompileBefore Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' == 'F#' "/>
<CompileBefore Include="$(_GenerateResourceDesignerClassFile)" Condition=" '$(Language)' == 'F#' And '$(AndroidGenerateResourceDesigner)' == 'true' "/>
</ItemGroup>
</Target>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
<AndroidEnableSGenConcurrent Condition=" '$(AndroidEnableSGenConcurrent)' == '' ">true</AndroidEnableSGenConcurrent>
<AndroidHttpClientHandlerType Condition=" '$(AndroidHttpClientHandlerType)' == '' and '$(UsingAndroidNETSdk)' == 'true' ">Xamarin.Android.Net.AndroidMessageHandler</AndroidHttpClientHandlerType>
<AndroidHttpClientHandlerType Condition=" '$(AndroidHttpClientHandlerType)' == '' and '$(UsingAndroidNETSdk)' != 'true' ">Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
<AndroidUseDesignerAssembly Condition=" '$(AndroidUseDesignerAssembly)' == '' ">true</AndroidUseDesignerAssembly>
<AndroidGenerateResourceDesigner Condition=" '$(AndroidUseDesignerAssembly)' == 'True' ">false</AndroidGenerateResourceDesigner>
<AndroidGenerateResourceDesigner Condition=" '$(AndroidGenerateResourceDesigner)' == '' ">true</AndroidGenerateResourceDesigner>
<AndroidUseDesignerAssembly Condition=" '$(AndroidUseDesignerAssembly)' == '' ">true</AndroidUseDesignerAssembly>
<AndroidUseIntermediateDesignerFile Condition=" '$(AndroidUseDesignerAssembly)' == 'True' ">false</AndroidUseIntermediateDesignerFile>
<AndroidUseIntermediateDesignerFile Condition=" '$(AndroidUseIntermediateDesignerFile)' == '' ">$(AndroidGenerateResourceDesigner)</AndroidUseIntermediateDesignerFile>
<GenerateDependencyFile Condition=" '$(GenerateDependencyFile)' == '' ">false</GenerateDependencyFile>
<CopyLocalLockFileAssemblies Condition=" '$(CopyLocalLockFileAssemblies)' == '' ">false</CopyLocalLockFileAssemblies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,54 @@ public void AppWithSingleJar ()
}

[Test]
public void GenerateResourceDesigner_false()
public void GenerateResourceDesigner([Values (false, true)] bool generateResourceDesigner, [Values (false, true)] bool useDesignerAssembly)
{
var path = Path.Combine ("temp", TestName);
var libraryB = new XASdkProject (outputType: "Library") {
ProjectName = "LibraryB",
};
libraryB.Sources.Clear ();
libraryB.Sources.Add (new BuildItem.Source ("Foo.cs") {
TextContent = () => @"namespace LibraryB;
public class Foo {
public static int foo => Resource.Drawable.foo;
}",
});
libraryB.Sources.Add (new AndroidItem.AndroidResource (() => "Resources\\drawable\\foo.png") {
BinaryContent = () => XamarinAndroidCommonProject.icon_binary_mdpi,
});
libraryB.SetProperty ("AndroidUseDesignerAssembly", useDesignerAssembly.ToString ());
var libraryA = new XASdkProject (outputType: "Library") {
ProjectName = "LibraryA",
};
libraryA.Sources.Clear ();
libraryA.Sources.Add (new BuildItem.Source ("FooA.cs") {
TextContent = () => @"namespace LibraryA;
public class FooA {
public int foo => 0;
public int foo2 => LibraryB.Foo.foo;
public int foo3 => LibraryB.Resource.Drawable.foo;
}",
});
libraryA.AddReference (libraryB);
libraryA.SetProperty ("AndroidGenerateResourceDesigner", generateResourceDesigner.ToString ());
if (!useDesignerAssembly)
libraryA.SetProperty ("AndroidUseDesignerAssembly", "False");
var libraryBBuilder = CreateDotNetBuilder (libraryB, Path.Combine (path, libraryB.ProjectName));
Assert.IsTrue (libraryBBuilder.Build (), "Build of LibraryB should succeed.");
var libraryABuilder = CreateDotNetBuilder (libraryA, Path.Combine (path, libraryA.ProjectName));
Assert.IsTrue (libraryABuilder.Build (), "Build of LibraryA should succeed.");
var proj = new XASdkProject () {
ProjectName = "App1",
};
proj.SetProperty ("AndroidUseDesignerAssembly", useDesignerAssembly.ToString ());
proj.AddReference (libraryA);
var dotnet = CreateDotNetBuilder (proj, Path.Combine (path, proj.ProjectName));
Assert.IsTrue (dotnet.Build (), "Build of Proj should succeed.");
}

[Test]
public void GenerateResourceDesigner_false([Values (false, true)] bool useDesignerAssembly)
{
var proj = new XASdkProject (outputType: "Library") {
Sources = {
Expand All @@ -466,7 +513,8 @@ public void GenerateResourceDesigner_false()
};
// Turn off Resource.designer.cs and remove usage of it
proj.SetProperty ("AndroidGenerateResourceDesigner", "false");
proj.SetProperty ("AndroidUseDesignerAssembly", "false");
if (!useDesignerAssembly)
proj.SetProperty ("AndroidUseDesignerAssembly", "false");
proj.MainActivity = proj.DefaultMainActivity
.Replace ("Resource.Layout.Main", "0")
.Replace ("Resource.Id.myButton", "0");
Expand All @@ -475,11 +523,15 @@ public void GenerateResourceDesigner_false()
Assert.IsTrue (dotnet.Build(target: "CoreCompile", parameters: new string[] { "BuildingInsideVisualStudio=true" }), "Designtime build should succeed.");
var intermediate = Path.Combine (FullProjectDirectory, proj.IntermediateOutputPath);
var resource_designer_cs = Path.Combine (intermediate, "designtime", "Resource.designer.cs");
if (useDesignerAssembly)
resource_designer_cs = Path.Combine (intermediate, "__Microsoft.Android.Resource.Designer.cs");
FileAssert.DoesNotExist (resource_designer_cs);

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

resource_designer_cs = Path.Combine (intermediate, "Resource.designer.cs");
resource_designer_cs = Path.Combine (intermediate, "Resource.designer.cs");
if (useDesignerAssembly)
resource_designer_cs = Path.Combine (intermediate, "__Microsoft.Android.Resource.Designer.cs");
FileAssert.DoesNotExist (resource_designer_cs);

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

0 comments on commit 953cd19

Please sign in to comment.