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
-
Cry 😭
-
Clone unoplatform/uno:
git clone https://github.com/unoplatform/uno.git
-
Checkout the dev/jonpryor/jonp-try-net11-p5 branch:
cd uno
git checkout dev/jonpryor/jonp-try-net11-p5
-
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
-
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
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-shakingoption, "added" in 4bb4b2e.Note that when targeting .NET 10,
dotnet publishcompletes without error, no workaround required. .NET 10 is also using a different set of package versions.Steps to Reproduce
Cry 😭
Clone unoplatform/uno:
Checkout the dev/jonpryor/jonp-try-net11-p5 branch:
cd uno git checkout dev/jonpryor/jonp-try-net11-p5Prepare the build environment
Publish the SamplesApp.netcoremobile project for net11.0-android, setting
$(DoNotSetAndroidLinkTool)=true:Publish output shows the error:
Did you find any workaround?
Set
$(AndroidLinkTool)=r8. This causes us to hit theEnableShrinkingcode path, avoiding the inclusion of--no-tree-shaking:android/src/Xamarin.Android.Build.Tasks/Tasks/R8.cs
Lines 97 to 123 in e4c31f2
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-L61Relevant log output