Skip to content

Crash in r8 when building with .NET 11 #11672

@jonpryor

Description

@jonpryor

Android framework version

net11.0-android (Preview)

Affected platform version

.NET 11

Description

(Apologies for the longer repro.)

When building Uno's SamplesApp.netcoremobile when targeting .NET 11, r8 fails with a NullPointerException.

Investigation showed that a (the?) cause of the bug was the use of the r8 --no-tree-shaking option, "added" in 4bb4b2e.

Note that when targeting .NET 10, dotnet publish completes without error, no workaround required. .NET 10 is also using a different set of package versions.

Steps to Reproduce

  1. Cry 😭

  2. Clone unoplatform/uno:

    git clone https://github.com/unoplatform/uno.git
  3. Checkout the dev/jonpryor/jonp-try-net11-p5 branch:

    cd uno
    git checkout dev/jonpryor/jonp-try-net11-p5
  4. Prepare the build environment

    # update PATH as appropriate
    export PATH=$HOME/Downloads/dotnet-sdk-11.0.100-preview.5.26302.115:$PATH
    \cp build/ci/net11/_global.json global.json
  5. Publish the SamplesApp.netcoremobile project for net11.0-android, setting $(DoNotSetAndroidLinkTool)=true:

    dotnet publish -bl -f net11.0-android src/SamplesApp/SamplesApp.netcoremobile/SamplesApp.netcoremobile.csproj -p:UnoTargetFrameworkOverride=net11.0-android -p:DoNotSetAndroidLinkTool=true
    

Publish output shows the error:

    MSBUILD : java error JAVA0000: 
      Error in obj/Release/net11.0-android/lp/114/jl/classes.jar:androidx/core/location/LocationManagerCompat.class at Landroidx/core/location/LocationManagerCompat;->$r8$lambda$z8e3G9khg88yB8-hC19d9V6P1Gc(Landroid/location/LocationManager;Landroidx/core/location/LocationManagerCompat$GpsStatusTransport;)Ljava/lang/Boolean;:
      java.lang.NullPointerException
       Cannot invoke "com.android.tools.r8.androidapi.f$a.a()" because the return value of "com.android.tools.r8.androidapi.f.H()" is null
      Compilation failed with an internal error.
      java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: Landroidx/core/location/LocationManagerCompat;->$r8$lambda$z8e3G9khg88yB8-hC19d9V6P1Gc(Landroid/location/LocationManager;Landroidx/core/location/LocationManagerCompat$GpsStatusTransport;)Ljava/lang/Boolean;, orig
      in: obj/Release/net11.0-android/lp/114/jl/classes.jar
      androidx/core/location/LocationManagerCompat.class
        at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:127)
        at com.android.tools.r8.R8.main(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:5)
      java/lang/Boolean;, origin: obj/Release/net11.0-android/lp/114/jl/classes.jar
      androidx/core/location/LocationManagerCompat.class
        at Version.fakeStackEntry(Version_9.1.31.java:0)
        at com.android.tools.r8.r0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1)
        at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:81)
        at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:32)
        at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:31)
        at com.android.tools.r8.R8.b(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:62)
        at com.android.tools.r8.R8.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1757)
        at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:114)
        ... 1 more
      java.lang.NullPointerException
       Cannot invoke "com.android.tools.r8.androidapi.f$a.a()" because the return value of "com.android.tools.r8.androidapi.f.H()" is null
        at com.android.tools.r8.androidapi.f.b(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:10)
        at com.android.tools.r8.androidapi.f.d(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:3)
        at com.android.tools.r8.androidapi.f.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1)
        at com.android.tools.r8.graph.i3.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:507)
        at com.android.tools.r8.ir.optimize.s0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1488)
        at com.android.tools.r8.ir.optimize.s0.b(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:16)
        at com.android.tools.r8.ir.optimize.s0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:157)
        at com.android.tools.r8.ir.optimize.s0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1314)
        at com.android.tools.r8.ir.optimize.s0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:142)
        at com.android.tools.r8.internal.d91.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:503)
        at com.android.tools.r8.internal.d91.c(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:27)
        at com.android.tools.r8.internal.d91.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:219)
        at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:131)
        at com.android.tools.r8.internal.d91.b(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:5)
        at com.android.tools.r8.internal.d91.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:212)
        at com.android.tools.r8.internal.g73.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:208)
        at com.android.tools.r8.internal.f73.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:52)
        at com.android.tools.r8.internal.eg4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:2)
        at com.android.tools.r8.internal.eg4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:17)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1428)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
      java.lang.RuntimeException: java.util.concurrent.ExecutionException: com.android.tools.r8.internal.nw0: java.lang.NullPointerException
       Cannot invoke "com.android.tools.r8.androidapi.f$a.a()" because the return value of "com.android.tools.r8.androidapi.f.H()" is null
                at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:128)
                at com.android.tools.r8.R8.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1371)
                at com.android.tools.r8.R8.c(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:11)
                at com.android.tools.r8.R8.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1756)
                at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:28)
                at com.android.tools.r8.R8.b(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:62)
                at com.android.tools.r8.R8.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1757)
                at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:114)
                at com.android.tools.r8.R8.main(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:5)
      java.lang.NullPointerException
       Cannot invoke "com.android.tools.r8.androidapi.f$a.a()" because the return value of "com.android.tools.r8.androidapi.f.H()" is null
                at java.base/java.util.concurrent.ForkJoinTask.reportExecutionException(ForkJoinTask.java:605)
                at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:981)
                at com.android.tools.r8.internal.fg4.forEach(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:4)
                at com.android.tools.r8.internal.fg4.awaitFutures(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1)
                at com.android.tools.r8.internal.hf4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:20)
                at com.android.tools.r8.internal.hf4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:31)
                at com.android.tools.r8.internal.hf4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:4)
                at com.android.tools.r8.internal.eg4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:15)
                at com.android.tools.r8.internal.eg4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:5)
                at com.android.tools.r8.internal.eg4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:1)
                at com.android.tools.r8.internal.f73.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:30)
                at com.android.tools.r8.internal.g73.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:47)
                at com.android.tools.r8.internal.g73.b(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:4)
                at com.android.tools.r8.R8.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:377)
                ... 7 more
      java.lang.NullPointerException
       Cannot invoke "com.android.tools.r8.androidapi.f$a.a()" because the return value of "com.android.tools.r8.androidapi.f.H()" is null
                at com.android.tools.r8.internal.lw0.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:146)
                at com.android.tools.r8.internal.d91.b(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:5)
                at com.android.tools.r8.internal.d91.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:212)
                at com.android.tools.r8.internal.g73.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:208)
                at com.android.tools.r8.internal.f73.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:52)
                at com.android.tools.r8.internal.eg4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:2)
                at com.android.tools.r8.internal.eg4.a(R8_9.1.31_ffb8f76e0cfe19f6a6aff10b55ad38bc82c7544bc91f5b7fd86bc80f9b2412e7:17)
                at java.base/java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1428)
                at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
                at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
                at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
                at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
                at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
      java.lang.NullPointerException
       Cannot invoke "com.android.tools.r8.androidapi.f$a.a()" because the return value of "com.android.tools.r8.androidapi.f.H()" is null]
      Directory 'obj/Release/net11.0-android/lp/114' is from 'androidx.core.core.aar'.

Build failed with 1 error(s) and 35 warning(s) in 270.4s

Did you find any workaround?

Set $(AndroidLinkTool)=r8. This causes us to hit the EnableShrinking code path, avoiding the inclusion of --no-tree-shaking:

if (EnableShrinking) {
if (!AcwMapFile.IsNullOrEmpty ()) {
var acwMap = MonoAndroidHelper.LoadMapFile (BuildEngine4, Path.GetFullPath (AcwMapFile), StringComparer.OrdinalIgnoreCase);
var javaTypes = new List<string> (acwMap.Values.Count);
foreach (var v in acwMap.Values) {
javaTypes.Add (v);
}
javaTypes.Sort (StringComparer.Ordinal);
using (var appcfg = File.CreateText (ProguardGeneratedApplicationConfiguration)) {
foreach (var java in javaTypes) {
appcfg.WriteLine ($"-keep class {java} {{ *; }}");
}
}
}
if (!ProguardCommonXamarinConfiguration.IsNullOrWhiteSpace ()) {
using (var xamcfg = File.CreateText (ProguardCommonXamarinConfiguration)) {
GetType ().Assembly.GetManifestResourceStream ("proguard_xamarin.cfg").CopyTo (xamcfg.BaseStream);
if (IgnoreWarnings) {
xamcfg.WriteLine ("-ignorewarnings");
}
if (!ProguardMappingFileOutput.IsNullOrEmpty ()) {
xamcfg.WriteLine ("-keepattributes SourceFile");
xamcfg.WriteLine ("-keepattributes LineNumberTable");
xamcfg.WriteLine ($"-printmapping \"{Path.GetFullPath (ProguardMappingFileOutput)}\"");
}
}
}

This is done automatically within SamplesApp.netcoremobile.csproj unless $(DoNotSetAndroidLinkTool)=true, which is why we set it above: https://github.com/unoplatform/uno/blob/dev/jonpryor/jonp-try-net11-p5/src/SamplesApp/SamplesApp.netcoremobile/SamplesApp.netcoremobile.csproj#L59-L61

	<PropertyGroup Condition=" '$(DoNotSetAndroidLinkTool)' != 'true' And '$(TargetFramework)' == 'net11.0-android' ">
		<AndroidLinkTool>r8</AndroidLinkTool>
	</PropertyGroup>

Relevant log output

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area: App+Library BuildIssues when building Library projects or Application projects.needs-triageIssues that need to be assigned.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions