Skip to content

Commit 9377d62

Browse files
[build] r8 now builds on both Windows & MacOS
Context: http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html Overview of changes: - Fixed tab characters, formatting, spacing - To get `depot_tools`, we now just use the download on all platforms--not using a submodule anymore - Use the `UnzipDirectoryChildren` task from `xa-prep-tasks`, so `r8.csproj` doesn't depend on `Xamarin.Android.Build.Tasks` - `_BootstrapDepotTools` runs the `gclient` command, which *on first run* downloads all dependencies required for `depot_tools`, such as gradle. This was a hard requirement for Windows especially, since it downloads python. - Use the `SetEnvironmentVariable` task to configure `PATH`. `depot_tools` has an odd requirement of being in `PATH`, but the `EnvironmentVariables` property on the `<Exec />` task was not sufficient. On Windows, the way `external\r8\tools\gradle.py` invokes `.bat` files in `depot_tools`--I could not get things to work unless doing it this way. - Various targets for `depot_tools` use Inputs/Outputs so they aren't running every time. - Removed `depot_tools.tpnitems`, since it is no longer a submodule and we don't redistribute it. Is that correct? - Set `JAVA_HOME` for calls to `gradle.py` - Removed extraneous log messages from the `<Proguard />` and `<R8 />` tasks - Added R8 usage to the `BuildApplicationWithSpacesInPath` test - Should pass proper path for `<R8 OutputDirectory="$(IntermediateOutputPath)android\bin" />` `classes.dex` was missing from the APK! - Updated tests related to D8/R8, to also verify `MonoRuntimeProvider` is in the dex file
1 parent 4e59a0a commit 9377d62

File tree

11 files changed

+115
-94
lines changed

11 files changed

+115
-94
lines changed

.gitmodules

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@
4141
path = external/xamarin-android-tools
4242
url = https://github.com/xamarin/xamarin-android-tools
4343
branch = master
44-
[submodule "external/depot_tools"]
45-
path = external/depot_tools
46-
url = https://chromium.googlesource.com/chromium/tools/depot_tools.git
4744
[submodule "external/r8"]
4845
path = external/r8
4946
url = https://r8.googlesource.com/r8

Documentation/guides/BuildProcess.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,12 @@ when packaing Release applications.
210210

211211
This property is `False` by default.
212212

213+
- **AndroidEnableDesugar** &ndash; A boolean property that
214+
determines if `desugar` is enabled. Android does not currently
215+
support all Java 8 features, and the default toolchain implements
216+
the new language features by performing bytecode transformations,
217+
called `desugar`, on the output of the `javac` compiler.
218+
213219
- **AndroidEnableD8** &ndash; A boolean property that determines
214220
whether or not use Google's new dexer (dx.jar alternative).
215221
@@ -423,7 +429,7 @@ when packaing Release applications.
423429
Release projects.
424430
425431
- **AndroidUseR8** &ndash; A boolean property that determines
426-
whether or not use Google's new Java code shlinker (proguard
432+
whether or not use Google's new Java code shrinker (proguard
427433
alternative).
428434

429435
- **AotAssemblies** &ndash; A boolean property that determines

Xamarin.Android.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ EndProject
124124
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.AndroidSdk-Tests", "external\xamarin-android-tools\src\Xamarin.Android.Tools.AndroidSdk\Tests\Xamarin.Android.Tools.AndroidSdk-Tests.csproj", "{1E5501E8-49C1-4659-838D-CC9720C5208F}"
125125
EndProject
126126
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "r8", "src\r8\r8.csproj", "{1BAFA0CC-0377-46CE-AB7B-7BB2E7B62F63}"
127+
EndProject
127128
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "proprietary", "build-tools\proprietary\proprietary.csproj", "{D93CAC27-3893-42A3-99F1-2BCA72E186F4}"
128129
EndProject
129130
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "download-bundle", "build-tools\download-bundle\download-bundle.csproj", "{1DA0CB12-5508-4E83-A242-0C8D6D99A49B}"

external/depot_tools

Lines changed: 0 additions & 1 deletion
This file was deleted.

external/depot_tools.tpnitems

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/Mono.Android/Test/Mono.Android-Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
2121
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
2222
<AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
23-
<AndroidUseR8>true</AndroidUseR8>
24-
<AndroidEnableD8>true</AndroidEnableD8>
23+
<AndroidUseR8 Condition="'$(AndroidUseR8)' == ''">True</AndroidUseR8>
24+
<AndroidEnableD8 Condition="'$(AndroidEnableD8)' == ''">True</AndroidEnableD8>
2525
</PropertyGroup>
2626
<Import Project="..\..\..\Configuration.props" />
2727
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

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

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.IO;
66
using Microsoft.Build.Framework;
77
using Microsoft.Build.Utilities;
8-
using System.Text;
98
using System.Collections.Generic;
109
using Xamarin.Android.Tools;
1110

@@ -57,33 +56,6 @@ public class R8 : JavaToolTask
5756

5857
public string R8ExtraArguments { get; set; }
5958

60-
public override bool Execute ()
61-
{
62-
Log.LogDebugMessage ("R8 Task");
63-
Log.LogDebugTaskItems (" R8JarPath: ", R8JarPath);
64-
Log.LogDebugTaskItems (" OutputDirectory: ", OutputDirectory);
65-
Log.LogDebugTaskItems (" AndroidManifestFile: ", AndroidManifestFile);
66-
Log.LogDebugMessage (" Configuration: {0}", Configuration);
67-
Log.LogDebugTaskItems (" JavaPlatformJarPath: ", JavaPlatformJarPath);
68-
Log.LogDebugTaskItems (" ClassesZip: ", ClassesZip);
69-
Log.LogDebugTaskItems (" JavaLibrariesToEmbed: ", JavaLibrariesToEmbed);
70-
Log.LogDebugTaskItems (" JavaLibrariesToReference: ", JavaLibrariesToReference);
71-
Log.LogDebugMessage (" EnableDesugar: {0}", EnableDesugar);
72-
Log.LogDebugMessage (" EnableTreeShaking: {0}", EnableTreeShaking);
73-
Log.LogDebugTaskItems (" AndroidSdkDirectory:", AndroidSdkDirectory);
74-
Log.LogDebugTaskItems (" AcwMapFile: ", AcwMapFile);
75-
Log.LogDebugTaskItems (" ProguardGeneratedReferenceConfiguration:", ProguardGeneratedReferenceConfiguration);
76-
Log.LogDebugTaskItems (" ProguardGeneratedApplicationConfiguration:", ProguardGeneratedApplicationConfiguration);
77-
Log.LogDebugTaskItems (" ProguardCommonXamarinConfiguration:", ProguardCommonXamarinConfiguration);
78-
Log.LogDebugTaskItems (" ProguardConfigurationFiles:", ProguardConfigurationFiles);
79-
Log.LogDebugTaskItems (" ProguardMappingOutput:", ProguardMappingOutput);
80-
Log.LogDebugMessage (" EnableMultiDex: {0}", EnableMultiDex);
81-
Log.LogDebugTaskItems (" MultiDexMainDexListFile: ", MultiDexMainDexListFile);
82-
Log.LogDebugTaskItems (" R8ExtraArguments: ", R8ExtraArguments);
83-
84-
return base.Execute ();
85-
}
86-
8759
protected override string GenerateCommandLineCommands ()
8860
{
8961
var cmd = new CommandLineBuilder ();
@@ -119,7 +91,6 @@ protected override string GenerateCommandLineCommands ()
11991
.Split (';')
12092
.Select (s => s.Trim ())
12193
.Where (s => !string.IsNullOrWhiteSpace (s));
122-
var enclosingChar = "\"";
12394
foreach (var file in configs) {
12495
if (File.Exists (file))
12596
cmd.AppendSwitchIfNotNull ("--pg-conf ", file);

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -671,8 +671,13 @@ public void BuildProguardEnabledProject (bool isRelease, bool enableProguard, bo
671671
if (isRelease && enableProguard) {
672672
var proguardProjectPrimary = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "proguard", "proguard_project_primary.cfg");
673673
FileAssert.Exists (proguardProjectPrimary);
674-
StringAssertEx.ContainsText (File.ReadAllLines (proguardProjectPrimary), "-keep class md52d9cf6333b8e95e8683a477bc589eda5.MainActivity");
674+
Assert.IsTrue (StringAssertEx.ContainsText (File.ReadAllLines (proguardProjectPrimary), "-keep class md52d9cf6333b8e95e8683a477bc589eda5.MainActivity"), "`md52d9cf6333b8e95e8683a477bc589eda5.MainActivity` should exist in `proguard_project_primary.cfg`!");
675675
}
676+
677+
var className = "Lmono/MonoRuntimeProvider;";
678+
var dexFile = b.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes.dex"));
679+
FileAssert.Exists (dexFile);
680+
Assert.IsTrue (DexUtils.ContainsClass (className, dexFile, b.AndroidSdkDirectory), $"`{dexFile}` should include `{className}`!");
676681
}
677682
}
678683

@@ -2141,12 +2146,13 @@ public void BuildReleaseApplication ()
21412146
}
21422147

21432148
[Test]
2144-
public void BuildApplicationWithSpacesInPath ([Values (true, false)] bool isRelease, [Values (true, false)] bool enableProguard, [Values (true, false)] bool enableMultiDex)
2149+
public void BuildApplicationWithSpacesInPath ([Values (true, false)] bool isRelease, [Values (true, false)] bool enableProguard, [Values (true, false)] bool enableMultiDex, [Values (true, false)] bool useR8)
21452150
{
21462151
var proj = new XamarinAndroidApplicationProject () {
21472152
IsRelease = isRelease,
21482153
AotAssemblies = isRelease,
21492154
EnableProguard = enableProguard,
2155+
UseR8 = useR8,
21502156
};
21512157
proj.OtherBuildItems.Add (new BuildItem ("AndroidJavaLibrary", "Hello (World).jar") { BinaryContent = () => Convert.FromBase64String (@"
21522158
UEsDBBQACAgIAMl8lUsAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMAUEsHCAAAAAACAAAAA
@@ -2178,9 +2184,14 @@ public void BuildApplicationWithSpacesInPath ([Values (true, false)] bool isRele
21782184
",
21792185
});
21802186
}
2181-
using (var b = CreateApkBuilder (Path.Combine ("temp", $"BuildReleaseAppWithA InIt({isRelease}{enableProguard}{enableMultiDex})"))) {
2187+
using (var b = CreateApkBuilder (Path.Combine ("temp", $"BuildReleaseAppWithA InIt({isRelease}{enableProguard}{enableMultiDex}{useR8})"))) {
21822188
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
21832189
Assert.IsFalse (b.LastBuildOutput.ContainsText ("Duplicate zip entry"), "Should not get warning about [META-INF/MANIFEST.MF]");
2190+
2191+
var className = "Lmono/MonoRuntimeProvider;";
2192+
var dexFile = b.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes.dex"));
2193+
FileAssert.Exists (dexFile);
2194+
Assert.IsTrue (DexUtils.ContainsClass (className, dexFile, b.AndroidSdkDirectory), $"`{dexFile}` should include `{className}`!");
21842195
}
21852196
}
21862197

@@ -3124,6 +3135,7 @@ public void foo()
31243135
if (enableDesugar) {
31253136
var className = "Lmono/MonoRuntimeProvider;";
31263137
var dexFile = builder.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes.dex"));
3138+
FileAssert.Exists (dexFile);
31273139
Assert.IsTrue (DexUtils.ContainsClass (className, dexFile, builder.AndroidSdkDirectory), $"`{dexFile}` should include `{className}`!");
31283140
}
31293141
}

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2648,7 +2648,7 @@ because xbuild doesn't support framework reference assemblies.
26482648
JavaOptions="$(JavaOptions)"
26492649
R8JarPath="$(R8JarPath)"
26502650
AndroidManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml"
2651-
OutputDirectory="$(IntermediateOutputPath)android\"
2651+
OutputDirectory="$(IntermediateOutputPath)android\bin"
26522652
Configuration="$(Configuration)"
26532653
JavaPlatformJarPath="$(JavaPlatformJarPath)"
26542654
ClassesZip="$(IntermediateOutputPath)android\bin\classes.zip"
@@ -2665,10 +2665,10 @@ because xbuild doesn't support framework reference assemblies.
26652665
EnableMultiDex="$(AndroidEnableMultiDex)"
26662666
MultiDexMainDexListFile="$(_AndroidMainDexListFile)"
26672667
R8ExtraArguments="$(R8ExtraArguments)"
2668-
/>
2668+
/>
26692669

26702670
<Touch Files="$(IntermediateOutputPath)_dex_stamp" AlwaysCreate="true" />
2671-
2671+
26722672
</Target>
26732673

26742674
<Target Name="_CompileDex"

src/r8/r8.targets

Lines changed: 85 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,118 @@
11
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
22

3-
<UsingTask TaskName="Xamarin.Android.Tasks.Unzip" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
4-
<UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.DownloadUri" />
3+
<UsingTask AssemblyFile="..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.DownloadUri" />
4+
<UsingTask AssemblyFile="..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.SetEnvironmentVariable" />
5+
<UsingTask AssemblyFile="..\..\bin\Build$(Configuration)\Xamarin.Android.Tools.BootstrapTasks.dll" TaskName="Xamarin.Android.Tools.BootstrapTasks.UnzipDirectoryChildren" />
56

67
<!-- public targets -->
78

8-
<Target Name="Build" DependsOnTargets="_SetupDepotTools;_BuildR8;_CopyR8" />
9-
<Target Name="Clean" DependsOnTargets="_CleanR8;_CleanDepotTools" />
9+
<PropertyGroup>
10+
<BuildDependsOn>
11+
_DownloadDepotTools;
12+
_UnzipDepotTools;
13+
_SetDepotToolsEnvironment;
14+
_BootstrapDepotTools;
15+
_BuildR8;
16+
_CopyR8;
17+
</BuildDependsOn>
18+
<CleanDependsOn>
19+
_SetDepotToolsEnvironment;
20+
_CleanR8;
21+
_CleanDepotTools;
22+
</CleanDependsOn>
23+
</PropertyGroup>
24+
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)" />
25+
<Target Name="Clean" DependsOnTargets="$(CleanDependsOn)" />
1026

11-
<!-- depot_tools -->
27+
<!--
28+
depot_tools, a set of git extensions from Chromium
29+
http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html
30+
-->
1231

13-
<!-- Why do people split files and make build scripts unreadable? That's unacceptable. Therefore properties are here. Always consider code readability. -->
1432
<PropertyGroup>
15-
<_WindowsDepotToolzZipDownload>..\..\bin\Build$(Configuration)\depot_tools.zip</_WindowsDepotToolzZipDownload>
33+
<_DepotToolsZip>..\..\bin\Build$(Configuration)\depot_tools.zip</_DepotToolsZip>
34+
<_PathToDepotTools>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\depot_tools'))</_PathToDepotTools>
1635
</PropertyGroup>
1736

18-
<Target Name="_SetupDepotTools" DependsOnTargets="_SetupDepotToolsWindows" />
19-
<Target Name="_CleanDepotTools" DependsOnTargets="_CleanDepotToolsWindows" />
20-
21-
<Target Name="_SetupDepotToolsWindows" Condition="$(HostOS) == 'Windows'">
37+
<Target Name="_DownloadDepotTools">
2238
<DownloadUri
23-
SourceUris="https://storage.googleapis.com/chrome-infra/depot_tools.zip"
24-
DestinationFiles="$(_WindowsDepotToolzZipDownload)"
39+
SourceUris="https://storage.googleapis.com/chrome-infra/depot_tools.zip"
40+
DestinationFiles="$(_DepotToolsZip)"
2541
/>
26-
<Unzip
27-
Sources="$(_WindowsDepotToolsZipDownload)"
28-
Destination="bin\Build$(Configuration)\depot_tools"
29-
/>
3042
</Target>
3143

32-
<Target Name="_CleanDepotToolsWindows" Condition="$(HostOS) == 'Windows'">
33-
<RemoveDir Directories="bin\Build$(Configuration)\depot_tools" />
44+
<Target Name="_UnzipDepotTools"
45+
Inputs="$(_DepotToolsZip)"
46+
Outputs="$(_PathToDepotTools)\unzip.stamp">
47+
<UnzipDirectoryChildren
48+
HostOS="$(HostOS)"
49+
NoSubdirectory="True"
50+
SourceFiles="$(_DepotToolsZip)"
51+
DestinationFolder="$(_PathToDepotTools)"
52+
/>
53+
<Touch
54+
Files="$(_PathToDepotTools)\unzip.stamp"
55+
AlwaysCreate="True"
56+
/>
3457
</Target>
3558

59+
<!--
60+
NOTE: depot_tools has an odd requirement of being in PATH
61+
I am also getting some odd failures on Windows, if not specifying namespace for <SetEnvironmentVariable />
62+
-->
3663

37-
<!-- r8 -->
64+
<Target Name="_SetDepotToolsEnvironment">
65+
<Xamarin.Android.BuildTools.PrepTasks.SetEnvironmentVariable
66+
Name="PATH"
67+
Value="$(_PathToDepotTools)$(PathSeparator)$(PATH)"
68+
/>
69+
</Target>
3870

39-
<PropertyGroup>
40-
<_PathToDepotTools Condition="'$(HostOS)' == 'Windows'">..\..\bin\Build$(Configuration)\depot_tools</_PathToDepotTools>
41-
<_PathToDepotTools Condition="'$(HostOS)' != 'Windows'">..\..\external\depot_tools</_PathToDepotTools>
42-
<_Sep Condition="'$(HostOS)' == 'Windows'">;</_Sep>
43-
<_Sep Condition="'$(HostOS)' != 'Windows'">:</_Sep>
44-
<_W Condition="'$(HostOS)' == 'Windows'">"</_W>
45-
<_W Condition="'$(HostOS)' != 'Windows'"></_W> <_EnvForDepotTools>PATH=$(_W)$(_PathToDepotTools)$(_W)$(_Sep)$(PATH)</_EnvForDepotTools>
46-
</PropertyGroup>
71+
<!-- This "bootstraps" depot_tools, such as downloading/installing gradle and python -->
4772

48-
<Target Name="_BuildR8" DependsOnTargets="_SetupDepotTools">
49-
<Exec
50-
Command="..\..\external\r8\tools\gradle.py d8 r8"
51-
WorkingDirectory="..\..\external\r8"
52-
EnvironmentVariables="$(_EnvForDepotTools)"
53-
/>
73+
<Target Name="_BootstrapDepotTools"
74+
Inputs="$(_PathToDepotTools)\unzip.stamp"
75+
Outputs="$(_PathToDepotTools)\bootstrap.stamp">
76+
<Exec Command="gclient --version" />
77+
<Touch
78+
Files="$(_PathToDepotTools)\bootstrap.stamp"
79+
AlwaysCreate="True"
80+
/>
81+
</Target>
82+
83+
<Target Name="_CleanDepotTools">
84+
<Delete Files="$(_DepotToolsZip)" />
85+
<RemoveDir Directories="$(_PathToDepotTools)" />
86+
</Target>
87+
88+
<!-- r8 -->
89+
90+
<Target Name="_BuildR8">
91+
<Exec
92+
Command="python tools\gradle.py d8 r8"
93+
EnvironmentVariables="JAVA_HOME=$(JavaSdkDirectory)"
94+
WorkingDirectory="..\..\external\r8"
95+
/>
5496
</Target>
5597

5698
<Target Name="_CopyR8">
5799
<Copy
58-
SourceFiles="..\..\external\r8\build\libs\d8.jar"
59-
DestinationFolder="$(XAInstallPrefix)\xbuild\Xamarin\Android\"
60-
SkipUnchangedFiles="true"
100+
SourceFiles="..\..\external\r8\build\libs\d8.jar"
101+
DestinationFolder="$(XAInstallPrefix)\xbuild\Xamarin\Android\"
102+
SkipUnchangedFiles="true"
61103
/>
62104
<Copy
63-
SourceFiles="..\..\external\r8\build\libs\r8.jar"
64-
DestinationFolder="$(XAInstallPrefix)\xbuild\Xamarin\Android\"
65-
SkipUnchangedFiles="true"
105+
SourceFiles="..\..\external\r8\build\libs\r8.jar"
106+
DestinationFolder="$(XAInstallPrefix)\xbuild\Xamarin\Android\"
107+
SkipUnchangedFiles="true"
66108
/>
67109
</Target>
68110

69111
<Target Name="_CleanR8">
70112
<Exec
71-
Command="..\..\external\r8\tools\gradle.py clean"
72-
WorkingDirectory="..\..\external\r8"
73-
EnvironmentVariables="$(_EnvForDepotTools)"
113+
Command="python tools\gradle.py clean"
114+
EnvironmentVariables="JAVA_HOME=$(JavaSdkDirectory)"
115+
WorkingDirectory="..\..\external\r8"
74116
/>
75117
</Target>
76118

0 commit comments

Comments
 (0)