Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ This file is only used by binding projects.

<Target Name="_ExportJarToXml"
DependsOnTargets="_ExtractJavadocsFromJavaSourceJars;_ExportJarToXmlInputs"
Inputs="@(EmbeddedJar);@(EmbeddedReferenceJar);@(InputJar);@(ReferenceJar);@(_AndroidMSBuildAllProjects)"
Inputs="@(EmbeddedJar);@(EmbeddedReferenceJar);@(InputJar);@(ReferenceJar);@(_JavaBindingClassFile);@(_AndroidMSBuildAllProjects)"
Outputs="@(_ExportJarToXmlOutputs)">

<PropertyGroup>
Expand All @@ -50,7 +50,7 @@ This file is only used by binding projects.
</ItemGroup>
<ClassParse
OutputFile="$(ApiOutputFile).class-parse"
SourceJars="@(EmbeddedJar);@(InputJar)"
SourceJars="@(EmbeddedJar);@(InputJar);@(_JavaBindingClassFile)"
ReferenceOutputFile="$(ApiOutputFile).reference.class-parse"
ReferenceJars="@(EmbeddedReferenceJar);@(ReferenceJar)"
DocumentationPaths="@(_AndroidDocumentationPath)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,15 +106,14 @@ It is shared between "legacy" binding projects and .NET 7+ projects.
Inputs="@(_AndroidMSBuildAllProjects);$(_AndroidCompileBindingJavaFileList);$(MonoPlatformJarPath);@(_JavaBindingSource)"
Outputs="$(_AndroidCompileBindingJavaStampFile)">

<!-- remove existing <Javac /> outputs, since *.class files and classes.zip could contain old files -->
<!-- remove existing outputs, since *.class and *.jar files could contain old files -->
<RemoveDirFixed Directories="$(_AndroidIntermediateBindingJavaClassDirectory)" Condition="Exists('$(_AndroidIntermediateBindingJavaClassDirectory)')" />
<Delete Files="$(_AndroidIntermediateBindingClassesZip)" Condition="Exists('$(_AndroidIntermediateBindingClassesZip)')" />
<!-- Compile java code -->
<Javac
Condition=" '@(_JavaBindingSource->Count())' != '0' "
JavaPlatformJarPath="$(JavaPlatformJarPath)"
ClassesOutputDirectory="$(_AndroidIntermediateBindingJavaClassDirectory)"
ClassesZip="$(_AndroidIntermediateBindingClassesZip)"
StubSourceDirectory="$(_AndroidIntermediateBindingJavaSourceDirectory)"
JavaSourceFiles="@(_JavaBindingSource)"
ToolPath="$(JavacToolPath)"
Expand All @@ -126,6 +125,12 @@ It is shared between "legacy" binding projects and .NET 7+ projects.
IntermediateOutputPath="$(IntermediateOutputPath)"
AssemblyIdentityMapFile="$(_AndroidLibrayProjectAssemblyMapFile)"
/>
<ZipDirectory
Condition=" '$(AndroidApplication)' != 'true' or '$(AndroidClassParser)' == 'jar2xml' "
SourceDirectory="$(_AndroidIntermediateBindingJavaClassDirectory)"
DestinationFile="$(_AndroidIntermediateBindingClassesZip)"
Overwrite="true"
/>
<JavaSourceUtils
Condition=" '@(_JavaBindingSource->Count())' != '0' "
JavaSourceUtilsJar="$(AndroidJavaSourceUtilsJar)"
Expand All @@ -142,6 +147,14 @@ It is shared between "legacy" binding projects and .NET 7+ projects.
/>
<Touch Files="$(_AndroidCompileBindingJavaStampFile)" AlwaysCreate="true" />
<ItemGroup>
<_JavaBindingClassDirectory
Condition=" '$(AndroidApplication)' == 'true' and '$(AndroidClassParser)' != 'jar2xml' "
Include="$(_AndroidIntermediateBindingJavaClassDirectory)"
/>
<_JavaBindingClassFile
Condition=" '$(AndroidApplication)' == 'true' and '$(AndroidClassParser)' != 'jar2xml' "
Include="$(_AndroidIntermediateBindingJavaClassDirectory)**\*.class"
/>
<EmbeddedJar Include="$(_AndroidIntermediateBindingClassesZip)" Condition="Exists('$(_AndroidIntermediateBindingClassesZip)')" />
<AndroidJavaLibrary Include="$(_AndroidIntermediateBindingClassesZip)" Condition="Exists('$(_AndroidIntermediateBindingClassesZip)')" />
<FileWrites Include="$(_AndroidIntermediateBindingClassesZip)" Condition="Exists('$(_AndroidIntermediateBindingClassesZip)')" />
Expand All @@ -154,21 +167,19 @@ It is shared between "legacy" binding projects and .NET 7+ projects.
Inputs="@(_AndroidMSBuildAllProjects);$(_AndroidCompileJavaFileList);$(MonoPlatformJarPath);@(_JavaStubFiles);@(_JavaSource)"
Outputs="$(_AndroidCompileJavaStampFile)">

<!-- remove existing <Javac /> outputs, since *.class files and classes.zip could contain old files -->
<!-- remove existing <Javac /> outputs, since *.class files could contain old files -->

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The <Javac/> task still has the ClassesZip property and code to create the classes.zip, can we remove that, too?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 3d7d113. Javac no longer has a ClassesZip property or archive-writing code. _CompileBindingJava now creates its required binding JAR separately with MSBuild’s ZipDirectory task.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow-up in ceb8a43: class-parse app builds now avoid the binding JAR as well. Their bound .class files flow directly to class-parse, javac, and D8/R8. JAR creation remains only for library/AAR output and legacy jar2xml.

<RemoveDirFixed Directories="$(_AndroidIntermediateJavaClassDirectory)" />
<Delete Files="$(_AndroidIntermediateClassesZip)" />

<!-- Compile java code -->
<Javac
Comment thread
simonrozsival marked this conversation as resolved.
JavaPlatformJarPath="$(JavaPlatformJarPath)"
ClassesOutputDirectory="$(_AndroidIntermediateJavaClassDirectory)"
ClassesZip="$(_AndroidIntermediateClassesZip)"
StubSourceDirectory="$(_AndroidIntermediateJavaSourceDirectory)"
AdditionalStubSourceDirectories="@(_AdditionalJavaStubDirectory)"
JavaSourceFiles="@(_JavaSource)"
ToolPath="$(JavacToolPath)"
ToolExe="$(JavacToolExe)"
Jars="@(_JavaLibrariesToCompile);@(_ReferenceJavaLibs)"
Jars="@(_JavaBindingClassDirectory);@(_JavaLibrariesToCompile);@(_ReferenceJavaLibs)"
JavacTargetVersion="$(JavacTargetVersion)"
JavacSourceVersion="$(JavacSourceVersion)"
JdkVersion="$(_JdkVersion)"
Expand Down
24 changes: 13 additions & 11 deletions src/Xamarin.Android.Build.Tasks/Tasks/D8.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class D8 : JavaToolTask
public bool EnableDesugar { get; set; } = true;

// Java libraries to embed or reference
public string? ClassesZip { get; set; }
public ITaskItem []? ClassFiles { get; set; }
[Required]
public string JavaPlatformJarPath { get; set; } = "";
public ITaskItem []? JavaLibrariesToEmbed { get; set; }
Expand Down Expand Up @@ -135,21 +135,23 @@ protected virtual string CreateResponseFile ()
}
}

// --lib and input jars
var injars = new List<string> ();
// --lib and program inputs
var inputs = new List<string> ();
var libjars = new List<string> ();
if (ClassFiles != null) {
foreach (var classFile in ClassFiles) {
inputs.Add (classFile.ItemSpec);
}
}
if (AlternativeJarLibrariesToEmbed?.Length > 0) {
Log.LogDebugMessage (" processing AlternativeJarLibrariesToEmbed...");
foreach (var jar in AlternativeJarLibrariesToEmbed) {
injars.Add (jar.ItemSpec);
inputs.Add (jar.ItemSpec);
}
} else if (JavaLibrariesToEmbed != null) {
Log.LogDebugMessage (" processing ClassesZip, JavaLibrariesToEmbed...");
if (!ClassesZip.IsNullOrEmpty () && File.Exists (ClassesZip)) {
injars.Add (ClassesZip);
}
Log.LogDebugMessage (" processing JavaLibrariesToEmbed...");
foreach (var jar in JavaLibrariesToEmbed) {
injars.Add (jar.ItemSpec);
inputs.Add (jar.ItemSpec);
}
}
libjars.Add (JavaPlatformJarPath);
Expand All @@ -163,8 +165,8 @@ protected virtual string CreateResponseFile ()
WriteArg (response, "--lib");
WriteArg (response, jar);
}
foreach (var jar in injars) {
WriteArg (response, jar);
foreach (var input in inputs) {
WriteArg (response, input);
}

return responseFile;
Expand Down
15 changes: 1 addition & 14 deletions src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using Microsoft.Build.Utilities;
using System.Text;
using System.Collections.Generic;
using Xamarin.Tools.Zip;
using Xamarin.Android.Tools;
using Microsoft.Android.Build.Tasks;

Expand All @@ -22,8 +21,6 @@ public class Javac : JavaCompileToolTask
[Required]
public string ClassesOutputDirectory { get; set; } = "";

public string? ClassesZip { get; set; }

public string? JavaPlatformJarPath { get; set; }

public string? JavacTargetVersion { get; set; }
Expand All @@ -37,17 +34,7 @@ public override bool RunTask ()
{
if (!Directory.Exists (ClassesOutputDirectory))
Directory.CreateDirectory (ClassesOutputDirectory);
var result = base.RunTask ();
if (!result)
return result;
// compress all the class files
if (!ClassesZip.IsNullOrEmpty ()) {
using (var zip = new ZipArchiveEx (ClassesZip, FileMode.OpenOrCreate)) {
zip.AutoFlush = false;
zip.AddDirectory (ClassesOutputDirectory, "", CompressionMethod.Store);
}
}
return result;
return base.RunTask ();
}

protected override string GenerateCommandLineCommands ()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2152,16 +2152,38 @@ public static Toolbar GetToolbar (Context context) {
}
}
",
Encoding = Encoding.ASCII
Encoding = Encoding.ASCII,
Metadata = { { "Bind", "True" } },
},
}
},
Sources = {
new BuildItem.Source ("UseToolbarEx.cs") {
TextContent = () => """
using Android.Content;

class UseToolbarEx
{
public AndroidX.AppCompat.Widget.Toolbar GetToolbar (Context context) =>
Com.Unnamedproject.Unnamedproject.ToolbarEx.GetToolbar (context);
}
""",
},
},
};
proj.SetRuntime (runtime);
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat);
using (var b = CreateApkBuilder ()) {
b.ThrowOnBuildFailure = false;
Assert.IsTrue (b.Build (proj), "Build should have succeeded");

var intermediate = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath);
var bindingJar = Path.Combine (intermediate, "binding", "bin", $"{proj.ProjectName}.jar");
FileAssert.DoesNotExist (bindingJar, "Application builds should pass bound Java class files directly to D8/R8.");
Comment thread
simonrozsival marked this conversation as resolved.
var dexFile = Path.Combine (intermediate, "android", "bin", "classes.dex");
FileAssert.Exists (dexFile);
Assert.IsTrue (DexUtils.ContainsClass ("Lcom/unnamedproject/unnamedproject/ToolbarEx;", dexFile, AndroidSdkPath),
$"`{dexFile}` should contain the bound Java source.");

Assert.IsTrue (b.Clean (proj), "Clean should have succeeded.");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1432,35 +1432,30 @@ public void BuildIncrementingClassName ([Values (AndroidRuntime.CoreCLR, Android
using (var b = CreateApkBuilder ()) {
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");

var classesZipPath = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "bin", "classes.zip");
FileAssert.Exists (classesZipPath);
var expectedBuilder = new StringBuilder ();
using (var zip = ZipHelper.OpenZip (classesZipPath)) {
foreach (var file in zip) {
expectedBuilder.AppendLine (file.FullName);
}
}
var expectedZip = expectedBuilder.ToString ();
var classesDirectory = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "bin", "classes");
DirectoryAssert.Exists (classesDirectory);
var expectedClasses = Directory.GetFiles (classesDirectory, "*.class", SearchOption.AllDirectories)
.Select (path => Path.GetRelativePath (classesDirectory, path))
.OrderBy (path => path)
.ToArray ();
Assert.IsNotEmpty (expectedClasses);

source.Timestamp = null; //Force the file to re-save w/ new Timestamp
Assert.IsTrue (b.Build (proj), "Second build should have succeeded.");

var actualBuilder = new StringBuilder ();
using (var zip = ZipHelper.OpenZip (classesZipPath)) {
foreach (var file in zip) {
actualBuilder.AppendLine (file.FullName);
}
}
var actualZip = actualBuilder.ToString ();
Assert.AreNotEqual (expectedZip, actualZip);
var actualClasses = Directory.GetFiles (classesDirectory, "*.class", SearchOption.AllDirectories)
.Select (path => Path.GetRelativePath (classesDirectory, path))
.OrderBy (path => path)
.ToArray ();
CollectionAssert.AreNotEqual (expectedClasses, actualClasses);

//Build with no changes
Assert.IsTrue (b.Build (proj), "Third build should have succeeded.");
FileAssert.Exists (classesZipPath);
DirectoryAssert.Exists (classesDirectory);

//Clean
Assert.IsTrue (b.Clean (proj), "Clean should have succeeded.");
FileAssert.DoesNotExist (classesZipPath);
DirectoryAssert.DoesNotExist (classesDirectory);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,12 @@ public void ResponseFileContainsLibAndInputJars ()
var inputJar1 = Path.Combine (tempDir, "input1.jar");
var inputJar2 = Path.Combine (tempDir, "input2.jar");
var libJar1 = Path.Combine (tempDir, "lib1.jar");
var classFile = Path.Combine (tempDir, "Example.class");
File.WriteAllText (platformJar, "mock");
File.WriteAllText (inputJar1, "mock");
File.WriteAllText (inputJar2, "mock");
File.WriteAllText (libJar1, "mock");
File.WriteAllText (classFile, "mock");

var d8Task = new D8TestTask {
BuildEngine = engine,
Expand All @@ -60,6 +62,9 @@ public void ResponseFileContainsLibAndInputJars ()
new TaskItem (inputJar1),
new TaskItem (inputJar2),
},
ClassFiles = new ITaskItem [] {
new TaskItem (classFile),
},
JavaLibrariesToReference = new ITaskItem [] {
new TaskItem (libJar1),
},
Expand Down Expand Up @@ -87,6 +92,7 @@ public void ResponseFileContainsLibAndInputJars ()
// Should contain input jars as direct arguments (no --lib prefix)
Assert.IsTrue (responseFileContent.Any (line => line.Contains ("input1.jar")), "Response file should contain input1.jar");
Assert.IsTrue (responseFileContent.Any (line => line.Contains ("input2.jar")), "Response file should contain input2.jar");
Assert.IsTrue (responseFileContent.Any (line => line.Contains ("Example.class")), "Response file should contain class files");

} finally {
// Clean up response file
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -921,7 +921,6 @@ because xbuild doesn't support framework reference assemblies.
<_AndroidIntermediateJavaSourceDirectory>$(IntermediateOutputPath)android\src\</_AndroidIntermediateJavaSourceDirectory>
<_AndroidIntermediateDexOutputDirectory>$(IntermediateOutputPath)android\bin\</_AndroidIntermediateDexOutputDirectory>
<_AndroidIntermediateJavaClassDirectory>$(IntermediateOutputPath)android\bin\classes\</_AndroidIntermediateJavaClassDirectory>
<_AndroidIntermediateClassesZip>$(IntermediateOutputPath)android\bin\classes.zip</_AndroidIntermediateClassesZip>
<_AndroidAotBinDirectory>$(IntermediateOutputPath)aot</_AndroidAotBinDirectory>
<_AndroidResgenFlagFile>$(IntermediateOutputPath)R.cs.flag</_AndroidResgenFlagFile>
<_AndroidResFlagFile>$(IntermediateOutputPath)res.flag</_AndroidResFlagFile>
Expand Down Expand Up @@ -1968,8 +1967,9 @@ because xbuild doesn't support framework reference assemblies.
<_CompileToDalvikInputs>
@(_AndroidMSBuildAllProjects)
;@(_JavaLibrariesToCompileForApp)
;@(_JavaBindingClassFile)
;@(AndroidExternalJavaLibrary)
;$(_AndroidIntermediateClassesZip)
;$(_AndroidCompileJavaStampFile)
;@(ProguardConfiguration)
;@(MultiDexMainDexList)
;$(_AndroidBuildPropertiesCache)
Expand Down
6 changes: 4 additions & 2 deletions src/Xamarin.Android.Build.Tasks/Xamarin.Android.D8.targets
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ Copyright (C) 2018 Xamarin. All rights reserved.
<ItemGroup>
<_AndroidD8MapDiagnostics Condition=" '$(AndroidD8IgnoreWarnings)' == 'true' " Include="warning" To="info" />
<_AndroidR8MapDiagnostics Condition=" '$(AndroidR8IgnoreWarnings)' == 'true' " Include="warning" To="info" />
<_JavaClassFile Include="$(_AndroidIntermediateJavaClassDirectory)**\*.class" />
<_JavaClassFile Include="@(_JavaBindingClassFile)" />
<!-- User-authored AndroidJavaSource (Bind != True) is not in the acw-map; pass it to R8 so it
is kept when shrinking is enabled rather than silently removed. -->
<_R8KeepJavaSource Include="@(AndroidJavaSource)" Condition=" '%(AndroidJavaSource.Bind)' != 'True' " />
Expand All @@ -66,7 +68,7 @@ Copyright (C) 2018 Xamarin. All rights reserved.
OutputDirectory="$(_AndroidIntermediateDexOutputDirectory)"
Debug="$(AndroidIncludeDebugSymbols)"
JavaPlatformJarPath="$(JavaPlatformJarPath)"
ClassesZip="$(_AndroidIntermediateClassesZip)"
ClassFiles="@(_JavaClassFile)"
JavaLibrariesToEmbed="@(_JavaLibrariesToCompileForApp);"
JavaLibrariesToReference="@(AndroidExternalJavaLibrary)"
EnableDesugar="$(AndroidEnableDesugar)"
Expand Down Expand Up @@ -99,7 +101,7 @@ Copyright (C) 2018 Xamarin. All rights reserved.
OutputDirectory="$(_AndroidIntermediateDexOutputDirectory)"
Debug="$(AndroidIncludeDebugSymbols)"
JavaPlatformJarPath="$(JavaPlatformJarPath)"
ClassesZip="$(_AndroidIntermediateClassesZip)"
ClassFiles="@(_JavaClassFile)"
JavaLibrariesToEmbed="@(_JavaLibrariesToCompileForApp)"
AlternativeJarLibrariesToEmbed="@(_AlternativeJarForAppD8)"
JavaLibrariesToReference="@(AndroidExternalJavaLibrary)"
Expand Down
Loading