diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs index b9738f75000..7c83fec044d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs @@ -306,7 +306,8 @@ void UpdateWhenChanged (string path, Action generator) var np = path + ".new"; using (var o = File.OpenWrite (np)) generator (o); - Files.CopyIfChanged (np, path); + MonoAndroidHelper.CopyIfChanged (np, path); + MonoAndroidHelper.SetLastAccessAndWriteTimeUtc (path, DateTime.UtcNow, Log); File.Delete (np); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs index 954d17eaa58..37ebb39e736 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/LinkAssemblies.cs @@ -152,6 +152,7 @@ bool Execute (DirectoryAssemblyResolver res) foreach (var assembly in ResolvedAssemblies) { var copysrc = assembly.ItemSpec; var filename = Path.GetFileName (assembly.ItemSpec); + var assemblyDestination = Path.Combine (copydst, filename); if (options.LinkNone) { if (skiplist.Any (s => Path.GetFileNameWithoutExtension (filename) == s)) { @@ -159,9 +160,10 @@ bool Execute (DirectoryAssemblyResolver res) // We cannot just copy the linker output from *current* run output, because // it always renew the assemblies, in *different* binary values, whereas // the dll in the OptionalDestinationDirectory must retain old and unchanged. - if (File.Exists (Path.Combine (copydst, filename))) + if (File.Exists (assemblyDestination)) { + MonoAndroidHelper.SetLastAccessAndWriteTimeUtc (assemblyDestination, DateTime.UtcNow, Log); continue; - copysrc = assembly.ItemSpec; + } } else { // Prefer fixup assemblies if exists, otherwise just copy the original. copysrc = Path.Combine (OutputDirectory, filename); @@ -171,7 +173,6 @@ bool Execute (DirectoryAssemblyResolver res) else if (!MonoAndroidHelper.IsForceRetainedAssembly (filename)) continue; - var assemblyDestination = Path.Combine (copydst, filename); if (MonoAndroidHelper.CopyIfChanged (copysrc, assemblyDestination)) { MonoAndroidHelper.SetLastAccessAndWriteTimeUtc (assemblyDestination, DateTime.UtcNow, Log); } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index 21acac1923d..fe582b0c822 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -133,7 +133,7 @@ public void CheckTimestamps () var output = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath); if (Directory.Exists (output)) Directory.Delete (output, true); - Assert.IsTrue (b.Build (proj), "Build should have succeeded."); + Assert.IsTrue (b.Build (proj), "first build should have succeeded."); //Absolutely non of these files should be *older* than the starting time of this test! var files = Directory.EnumerateFiles (intermediate, "*", SearchOption.AllDirectories).ToList (); @@ -142,6 +142,21 @@ public void CheckTimestamps () var info = new FileInfo (file); Assert.IsTrue (info.LastWriteTimeUtc > start, $"`{file}` is older than `{start}`, with a timestamp of `{info.LastWriteTimeUtc}`!"); } + + //Build again after a code change, checking a few files + proj.MainActivity = proj.DefaultMainActivity.Replace ("clicks", "CLICKS"); + proj.Touch ("MainActivity.cs"); + start = DateTime.UtcNow; + Assert.IsTrue (b.Build (proj), "second build should have succeeded."); + + foreach (var file in new [] { "typemap.mj", "typemap.jm" }) { + var info = new FileInfo (Path.Combine (intermediate, "android", file)); + Assert.IsTrue (info.LastWriteTimeUtc > start, $"`{file}` is older than `{start}`, with a timestamp of `{info.LastWriteTimeUtc}`!"); + } + + //One last build with no changes + Assert.IsTrue (b.Build (proj), "third build should have succeeded."); + Assert.IsTrue (b.Output.IsTargetSkipped ("_LinkAssembliesNoShrink"), "`_LinkAssembliesNoShrink` should be skipped!"); } }