You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[NDK] Locate and select only compatible NDK versions (#103)
Context: actions/runner-images#2420
Context: dotnet/android#5499
Context: dotnet/android#5526
Context: android/ndk#1427
Context: https://developer.android.com/studio/command-line/variables#envar
Xamarin.Android is not (yet) compatible with the recently released
Android NDK r22 version. Azure build images have recently rolled out
an update which includes NDK r22 and, thus, it breaks builds for
customers using any form of Xamarin.Android AOT build.
In an attempt to detect broken/incompatible NDK versions as well as
to select the "best one", this commit adds code to scan the known NDK
locations in search of the preferred version.
Given an `AndroidSdkInfo` creation of:
var info = new AndroidSdkInfo (logger:logger,
androidSdkPath: sdkPath,
androidNdkPath: ndkPath,
javaSdkPath: javaPath);
var usedNdkPath = info.AndroidNdkPath;
If `ndkPath` is not `null` and otherwise valid, then `usedNdkPath`
is `ndkPath`.
If `ndkPath` is `null` or is otherwise invalid (missing `ndk-stack`,
etc.), then we search for an `info.AndroidNdkPath` value as follows:
1. If `androidSdkPath` is not `null` and valid, then we check for
Android SDK-relative NDK locations, in:
* `{androidSdkPath}/ndk/*`
* `{androidSdkPath}/ndk-bundle`
For each found SDK-relative NDK directory, we filter out NDKs for
which we cannot determine the package version, as well as those
which are "too old" (< `MinimumCompatibleNDKMajorVersion`) or
"too new" (> `MaximumCompatibleNDKMajorVersion`), currently r22.
We prefer the NDK location with the highest version number.
2. If `androidSdkPath` is not `null` and valid and if there are no
Android SDK-relative NDK locations, then we use the user-selected
"preferred NDK location". See also
`AndroidSdkInfo.SetPreferredAndroidNdkPath()`.
3. If `androidSdkPath` is not `null` and valid and if the preferred
NDK location isn't set or is invalid, then we check directories
specified in `$PATH`, and use the directory which contains
`ndk-stack`.
4. If `androidSdkPath` is not `null` and valid and `$PATH` didn't
contain `ndk-stack`, then we continue looking for NDK locations
within the Android SDK locations specified by the `$ANDROID_HOME`
and `$ANDROID_SDK_ROOT` environment variables.
As with (1), these likewise look for e.g. `${ANDROID_HOME}/ndk/*`
or `${ANDROID_SDK_ROOT}/ndk-bundle` directories and select the
NDK with the highest supported version.
5. If `androidSdkPath` is `null`, then *first* we try to find a
valid Android SDK directory, using on Unix:
a. The preferred Android SDK directory; see also
`AndroidSdkInfo.SetPreferredAndroidSdkPath().
b. The `$ANDROID_HOME` and `ANDROID_SDK_ROOT`
environment variables.
c. Directories within `$PATH` that contain `adb`.
Once an Android SDK is found, steps (1)…(4) are performed.
In (1) and (4), we now look for the Android SDK packages containing
the NDK. There are two kinds of such packages:
* `ndk-bundle` is the older package which allows for installation of
only one NDK inside the SDK directory
* `ndk/*` is a newer package which allows for installation of several
NDK versions in parallel. Each subdirectory of `ndk` is an `X.Y.Z`
version number of the NDK.
In each of these directories we look for the `source.properties` file
from which we then extract the NDK version and then we sort thus
discovered NDK instances using their version as the key, in the
descending order. The latest compatible (currently: less than 22 and
more than 15) version is selected and its path returned to the caller.
Logger(TraceLevel.Verbose,$"Skipping NDK in '{path}': version {ndkVer} is out of the accepted range (major version must be between {MinimumCompatibleNDKMajorVersion} and {MaximumCompatibleNDKMajorVersion}");
0 commit comments