Skip to content

Commit

Permalink
[Xamarin.Android.Build.Tasks] fix for MonoPackageManager.java from 16…
Browse files Browse the repository at this point in the history
….1 (#3128)

Fixes: http://work.devdiv.io/899432

There is a #deletebinobj problem if you take an existing project built
with 16.1 and build with 16.2/master.

1. File > New > Android App in 16.1.
2. Build
3. Open in 16.2, build.

Get an error such as:

    obj\Debug\90\android\src\mono\MonoPackageManager_Resources.java(2,8):  error: duplicate class: mono.MonoPackageManager_Resources
    public class MonoPackageManager_Resources {

Reviewing `obj\Debug\90\android\src\mono`, there is a
`MonoPackageManager.java` and `MonoPackageManager_Resources.java` that
have a duplicate class.

In 5a9d1a6, we had already tried to fix this, but the
`_CleanupOldStaticResources` target was not running? It appears that
16.1 is not producing the `ApplicationRegistration.java` file it is
looking for.

The path we were using for a few files wasn't right:

    android\src\mono\app\ApplicationRegistration.java

Should actually be:

    android\src\mono\android\app\ApplicationRegistration.java

But then looking at `<GenerateJavaStubs/>`, we still produce this
file? I think we should instead use `NotifyTimeZoneChanges.java` for
this check. We don't need to delete, or look for
`ApplicationRegistration.java`.

Then I found another problem, in that `_GeneratePackageManagerJava`
and `_CompileJava` need to re-run. I added the stamp files for these
MSBuild targets to the `@(_OldStaticResources)` item group to fix
this.
  • Loading branch information
jonathanpeppers authored and jonpryor committed May 30, 2019
1 parent bce1291 commit acb0d91
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3706,23 +3706,35 @@ public void RemoveOldMonoPackageManager ()
using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) {
b.ThrowOnBuildFailure = false;
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
string target = "_CleanupOldStaticResources";
Assert.IsTrue (b.Output.IsTargetSkipped (target), $"`{target}` should be skipped.");
var targets = new [] {
"_CleanupOldStaticResources",
"_GeneratePackageManagerJava",
"_CompileJava",
};
Assert.IsTrue (b.Output.IsTargetSkipped (targets [0]), $"`{targets [0]}` should be skipped.");
var oldMonoPackageManager = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "src", "mono", "MonoPackageManager.java");
var appRegistration = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "src", "mono", "app", "ApplicationRegistration.java");
Directory.CreateDirectory (Path.GetDirectoryName (appRegistration));
var notifyTimeZoneChanges = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "src", "mono", "android", "app", "NotifyTimeZoneChanges.java");
Directory.CreateDirectory (Path.GetDirectoryName (notifyTimeZoneChanges));
File.WriteAllText (oldMonoPackageManager, @"package mono;
public class MonoPackageManager { }
class MonoPackageManager_Resources { }");
File.WriteAllText (appRegistration, @"package mono.android.app;
File.WriteAllText (notifyTimeZoneChanges, @"package mono.android.app;
public class ApplicationRegistration { }");
var oldMonoPackageManagerClass = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "bin", "classes" , "mono", "MonoPackageManager.class");
File.WriteAllText (oldMonoPackageManagerClass, "");
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
Assert.IsFalse (b.Output.IsTargetSkipped (target), $"`{target}` should not be skipped.");
Assert.IsFalse (File.Exists (oldMonoPackageManagerClass), $"{oldMonoPackageManagerClass} should have been deleted.");
Assert.IsFalse (File.Exists (oldMonoPackageManager), $"{oldMonoPackageManager} should have been deleted.");
Assert.IsFalse (File.Exists (appRegistration), $"{appRegistration} should have been deleted.");
foreach (var target in targets) {
Assert.IsFalse (b.Output.IsTargetSkipped (target), $"`{target}` should *not* be skipped.");
}
// Old files that should *not* exist
FileAssert.DoesNotExist (oldMonoPackageManager);
FileAssert.DoesNotExist (oldMonoPackageManagerClass);
FileAssert.DoesNotExist (notifyTimeZoneChanges);
// New files that should exist
var monoPackageManager_Resources = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "src", "mono", "MonoPackageManager_Resources.java");
var monoPackageManager_ResourcesClass = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "bin", "classes", "mono", "MonoPackageManager_Resources.class");
FileAssert.Exists (monoPackageManager_Resources);
FileAssert.Exists (monoPackageManager_ResourcesClass);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1920,25 +1920,25 @@ because xbuild doesn't support framework reference assemblies.
</Target>

<Target Name="_CleanupOldStaticResources"
Condition="Exists ('$(MonoAndroidIntermediate)android\src\mono\app\ApplicationRegistration.java')">
Condition=" Exists ('$(MonoAndroidIntermediate)android\src\mono\android\app\NotifyTimeZoneChanges.java') ">
<ItemGroup>
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\android\incrementaldeployment\MultiDexLoader.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\android\ResourcePatcher.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\MonoPackageManager.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\android\incrementaldeployment\IncrementalClassLoader.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\android\incrementaldeployment\Placeholder.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\app\ApplicationRegistration.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\app\NotifyTimeZoneChanges.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\android\app\NotifyTimeZoneChanges.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\src\mono\android\incrementaldeployment\MonkeyPatcher.java" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\android\incrementaldeployment\MultiDexLoader.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\android\ResourcePatcher.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\MonoPackageManager.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\MonoPackageManager_Resources.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\android\incrementaldeployment\IncrementalClassLoader*.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\android\incrementaldeployment\Placeholder.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\android\app\ApplicationRegistration.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\android\app\NotifyTimeZoneChanges.class" />
<_OldStaticResources Include="$(MonoAndroidIntermediate)android\bin\classes\mono\android\MonkeyPatcher.class" />
<_OldStaticResources Include="$(_AndroidStampDirectory)_GeneratePackageManagerJava.stamp" />
<_OldStaticResources Include="$(IntermediateOutputPath)_javac.stamp" />
</ItemGroup>
<Delete Files="@(_OldStaticResources)" />
</Target>
Expand Down

0 comments on commit acb0d91

Please sign in to comment.