dotnet / android

.NET for Android provides open-source bindings of the Android SDK for use with .NET managed languages such as C#
MIT License
1.92k stars 526 forks source link

-t:InstallAndroidDependencies could use a reasonable default AndroidSdkDirectory if not specified #9160

Open Redth opened 1 month ago

Redth commented 1 month ago

Android framework version

net8.0-android, net9.0-android

Affected platform version

macOS, Windows (presumably)

Description

When running dotnet build -t:InstallAndroidDependencies I must set a path to the Android SDK (eg: -p:AndroidSdkDirectory=/Users/username/Android/sdk).

Could we assume a reasonable default path for this variable if none is specified in this build task? We are likely going to provide guidance to a user to use the same path always, why not pick that by default?

jonpryor commented 4 weeks ago

We are likely going to provide guidance to a user to use the same path always, why not pick that by default?

On the one hand, are we? We've been quite reluctant to actually do so until now, for a variety of reasons.

On the other hand, a default would help immensely. I'm inclined to take a page out of $(MavenCacheDirectory) from 36597667f0ac70c8c3b7b204dd6883fb6ff0539d:

https://github.com/dotnet/android/blob/654440b2620746a1f21eaa2ee750b55d93141dbc/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Bindings.Maven.targets#L16-L18

and for $(AndroidSdkDirectory), use a fallback default of:

and similarly for $(JavaSdkDirectory), use a fallback value of:

Redth commented 2 weeks ago

For the Android SDK path itself, I can see being rather opinionated on a specific location for our own purposes. For JDK, I am a little more skeptical, since the easy path is downloading the microsoft openjdk installer, which defaults to a known location already. Why wouldn't we use this?

jonpryor commented 2 weeks ago

@Redth asked

Why wouldn't we use this?

Because it's another manual step.

Current world order: 4 manual steps:

  1. Install dotnet
  2. Install JDK (from where?!)
  3. dotnet workload install maui
  4. dotnet build -f net8.0-android -t:InstallAndroidDependencies …

Desired world order: one less manual step:

  1. Install dotnet
  2. dotnet workload install maui
  3. dotnet build -f net8.0-android -t:InstallAndroidDependencies …
jonpryor commented 2 weeks ago

My concern is for "clean" machines which don't have previous dependencies, and for which we aren't relying on the Visual Studio installer to install everything needed.

Redth commented 2 weeks ago

Ok for the JDK, when you use the Microsoft OpenJDK installers, the defaults end up being:

Windows

Windows installs to $env:PROGRAMFILES\Microsoft\ and will create a folder for the JDK version such as jdk-17.0.12.7-hotspot or jdk-11.0.16.101-hotspot. There's also an option in the installer to set the env variables (_set or override JAVAHOME): image

macOS

If you use the .pkg installer it will install to the path /Library/Java/JavaVirtualMachines/microsoft-17.jdk/Contents/Home where the version changes for the version of the JDK of course.

Redth commented 2 weeks ago

In the spirit of 'clean' machines I think it's important to use the conventions from the pkg/msi installers even if we aren't going to use them directly. I guess I'm not ultimately opinionated on using the official installer vs installing through the InstallAndroidDependencies target (which I presume uses the official archives from MS OpenJdk anyway?), but rather am confused at why:

  1. In our docs we still do tell people to manually download and install the OpenJDK first
  2. We still require you provide a -p:JavaSdkDirectory and then install it there again as well

Then of course the point of this issue is providing sensible defaults when no directory is specified, which although this issue was about AndroidSdkDirectory specifically, the conversation has also come in around JavaSdkDirectory too. Again here, we should infer a sensible default in my opinion, if none is specified, and we should also skip trying to install the JDK at all if we can locate one ourselves that is already installed and compatible.

jonpryor commented 2 weeks ago

@Redth: we should update our docs to tell people to install OpenJDK, and to not provide -p:JavaSdkDirectory=….

We should also verify that it works when we do so. If it doesn't work, that's a bug.

jonpryor commented 2 weeks ago

For .NET 9 Preview 7, -p:JavaSdkDirectory is required for -t:InstallAndroidDependencies.


Edited to completely reverse the logic: -p:JavaSdkDirectory is required. My previous test accidentally used .NET 8 Preview 7, instead of .NET 9 Preview 7. Doh!