From 5b3863b2cef16b3c3b65652968ed2fbbf8e6427d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 09:23:31 -0500 Subject: [PATCH 1/7] Bump to dotnet/installer/main@6150605bd0 8.0.100-preview.6.23276.3 (#8083) Changes: https://github.com/dotnet/installer/compare/3b24233fbe...6150605bd0 Updates: Microsoft.Dotnet.Sdk.Internal: from 8.0.100-preview.5.23275.7 to 8.0.100-preview.6.23276.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6001d30f272..621306d5132 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,8 +1,8 @@ - + https://github.com/dotnet/installer - 3b24233fbe5fbd68fd2eb4f33263db9486a2cc19 + 6150605bd0a63b57ef3d8a8cc7355131ceeceb5a https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 15120f82cd1..2fc01e2a9e3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -1,7 +1,7 @@ - 8.0.100-preview.5.23275.7 + 8.0.100-preview.6.23276.3 8.0.0-preview.5.23272.14 8.0.0-preview.5.23272.14 7.0.0-beta.22103.1 From 0c97d20e02347d211ba17c65eb5ea85ac2b3523a Mon Sep 17 00:00:00 2001 From: VS MobileTools Engineering Service 2 Date: Tue, 30 May 2023 07:25:14 -0700 Subject: [PATCH 2/7] Localized file check-in by OneLocBuild Task (#8078) Context: https://aka.ms/onelocbuild Context: https://aka.ms/AllAboutLoc * Localized file check-in by OneLocBuild Task: Build definition ID 17928: Build ID 7833379 * Localized file check-in by OneLocBuild Task: Build definition ID 17928: Build ID 7834780 --- .../Properties/Resources.cs.resx | 8 ++++---- .../Properties/Resources.de.resx | 8 ++++---- .../Properties/Resources.es.resx | 8 ++++---- .../Properties/Resources.fr.resx | 8 ++++---- .../Properties/Resources.it.resx | 8 ++++---- .../Properties/Resources.ja.resx | 8 ++++---- .../Properties/Resources.ko.resx | 8 ++++---- .../Properties/Resources.pl.resx | 8 ++++---- .../Properties/Resources.pt-BR.resx | 8 ++++---- .../Properties/Resources.ru.resx | 8 ++++---- .../Properties/Resources.tr.resx | 8 ++++---- .../Properties/Resources.zh-Hans.resx | 8 ++++---- .../Properties/Resources.zh-Hant.resx | 8 ++++---- 13 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx index 466d03e8234..dcc9db775c6 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.cs.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Adresář sady Android SDK se nenašel. Nainstalujte sadu Android SDK podle pokynů na stránce https://aka.ms/dotnet-android-install-sdk +Pokud chcete pro sestavení z příkazového řádku použít vlastní cestu SDK, nastavte vlastnost AndroidSdkDirectory nástroje MSBuild na vlastní cestu. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Adresář sady Java SDK se nenašel. Nainstalujte sadu Java SDK podle pokynů na stránce https://aka.ms/dotnet-android-install-sdk +Pokud chcete pro sestavení z příkazového řádku použít vlastní cestu JDK, nastavte vlastnost JavaSdkDirectory nástroje MSBuild na vlastní cestu. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx index c303412a3ce..2785a70fd85 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.de.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Das Android SDK Verzeichnis wurde nicht gefunden. Installieren Sie die Android SDK, indem Sie den folgenden Anweisungen folgen: https://aka.ms/dotnet-android-install-sdk +Um einen benutzerdefinierten SDK-Pfad für einen Befehlszeilenbuild zu verwenden, legen Sie die MSBuild-Eigenschaft "AndroidSdkDirectory" auf den benutzerdefinierten Pfad fest. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Das Java SDK-Verzeichnis wurde nicht gefunden. Installieren Sie das Java SDK, indem Sie den folgenden Anweisungen folgen: https://aka.ms/dotnet-android-install-sdk +Um einen benutzerdefinierten JDK-Pfad für einen Befehlszeilenbuild zu verwenden, legen Sie die MSBuild-Eigenschaft "JavaSdkDirectory" auf den benutzerdefinierten Pfad fest. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx index 19a87fe365a..d0e75a10990 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.es.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + No se encontró el directorio Android SDK. Instale el Android SDK siguiendo las instrucciones de: https://aka.ms/dotnet-android-install-sdk +Para usar una ruta de acceso de SDK personalizada para una compilación de línea de comandos, establezca la propiedad "AndroidSdkDirectory" de MSBuild en la ruta de acceso personalizada. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + No se encontró el directorio del SDK de Java. Instale el SDK de Java siguiendo las instrucciones de: https://aka.ms/dotnet-android-install-sdk +Para usar una ruta de acceso de JDK personalizada para una compilación de línea de comandos, establezca la propiedad "JavaSdkDirectory" de MSBuild en la ruta de acceso personalizada. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx index 548b78f6a4a..7b66f2975e8 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.fr.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Le répertoire Android SDK est introuvable. Installez le Android SDK en suivant les instructions fournies à l’adresse suivante : https://aka.ms/dotnet-android-install-sdk +Pour utiliser un chemin d’accès SDK personnalisé pour une build de ligne de commande, définissez la propriété MSBuild « AndroidSdkDirectory » sur le chemin personnalisé. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Le répertoire du Kit de développement logiciel (SDK) Java est introuvable. Installez le Kit de développement logiciel (SDK) Java en suivant les instructions fournies dans : https://aka.ms/dotnet-android-install-sdk +Pour utiliser un chemin JDK personnalisé pour une build de ligne de commande, définissez la propriété MSBuild « JavaSdkDirectory » sur le chemin personnalisé. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx index d88d6ef97f4..36a6638f6bd 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.it.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Impossibile trovare la directory di Android SDK. Installare Android SDK seguendo le istruzioni riportate in: https://aka.ms/dotnet-android-install-sdk +Per usare un percorso SDK personalizzato per una compilazione della riga di comando, impostare la proprietà MSBuild 'AndroidSdkDirectory' sul percorso personalizzato. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Impossibile trovare la directory di Java SDK. Installare Java SDK seguendo le istruzioni riportate in: https://aka.ms/dotnet-android-install-sdk +Per usare un percorso JDK personalizzato per una compilazione della riga di comando, impostare la proprietà MSBuild 'JavaSdkDirectory' sul percorso personalizzato. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx index b32b3c6716a..7ce8b85c8c6 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ja.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Android SDK ディレクトリが見つかりませんでした。Android SDK をインストールするには、次にしたがってください: https://aka.ms/dotnet-android-install-sdk +コマンド ライン ビルドにカスタム SDK パスを使用するには、'AndroidSdkDirectory' MSBuild プロパティをカスタム パスに設定します。 The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Java SDK ディレクトリが見つかりませんでした。Java SDK をインストールするには、次にしたがってください: https://aka.ms/dotnet-android-install-sdk +コマンド ライン ビルドにカスタム JDK パスを使用するには、'JavaSdkDirectory' MSBuild プロパティをカスタム パスに設定します。 The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx index c8a4eb36d6f..ec3a4c0126e 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ko.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Android SDK 디렉터리를 찾을 수 없습니다. 다음 지침에 따라 Android SDK 설치하세요. https://aka.ms/dotnet-android-install-sdk +명령줄 빌드에 사용자 지정 SDK 경로를 사용하려면 'AndroidSdkDirectory' MSBuild 속성을 사용자 지정 경로로 설정합니다. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Java SDK 디렉터리를 찾을 수 없습니다. 다음 지침에 따라 Java SDK를 설치하세요. https://aka.ms/dotnet-android-install-sdk +명령줄 빌드에 사용자 지정 JDK 경로를 사용하려면 'JavaSdkDirectory' MSBuild 속성을 사용자 지정 경로로 설정합니다. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx index 9dbad7d3492..1d444b40554 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pl.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Nie można odnaleźć katalogu zestawu Android SDK. Zainstaluj zestaw Android SDK, postępując zgodnie z instrukcjami w temacie: https://aka.ms/dotnet-android-install-sdk +Aby użyć niestandardowej ścieżki zestawu SDK dla kompilacji wiersza polecenia, ustaw ścieżkę niestandardową właściwości "AndroidSdkDirectory" programu MSBuild. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Nie można odnaleźć katalogu zestawu Java SDK. Zainstaluj zestaw Java SDK, postępując zgodnie z instrukcjami na stronie https://aka.ms/dotnet-android-install-sdk +Aby użyć niestandardowej ścieżki zestawu JDK dla kompilacji wiersza polecenia, ustaw właściwości „JavaSdkDirectory” programu MSBuild na ścieżkę niestandardową. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx index de039f71470..2e5b3d0193e 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.pt-BR.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Não foi possível encontrar o diretório do SDK do Android. Instale o SDK do Android seguindo as instruções em: https://aka.ms/dotnet-android-install-sdk +Para usar um caminho SDK personalizado para um build de linha de comando, defina a propriedade MSBuild ''AndroidSdkDirectory'' como o caminho personalizado. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Não foi possível encontrar o diretório do SDK do Java. Instale o SDK do Java seguindo as instruções em: https://aka.ms/dotnet-android-install-sdk +Para usar um caminho JDK personalizado para um build de linha de comando, defina a propriedade MSBuild ''JavaSdkDirectory'' como o caminho personalizado. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx index 48c851ef0cf..63bb0088fd1 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.ru.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Не удалось найти каталог пакета SDK для Android. Установите пакет SDK для Android, следуя инструкциям на странице https://aka.ms/dotnet-android-install-sdk +Чтобы использовать настраиваемый путь SDK для сборки командной строки, установите для свойства MSBuild "AndroidSdkDirectory" настраиваемый путь. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Не удалось найти каталог пакета SDK для Java. Установите пакет SDK для Java, следуя инструкциям на странице https://aka.ms/dotnet-android-install-sdk +Чтобы использовать настраиваемый путь JDK для сборки командной строки, установите для свойства MSBuild "JavaSdkDirectory" настраиваемый путь. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx index 24933b93a34..7357171be8b 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.tr.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + Android SDK dizini bulunamadı. https://aka.ms/dotnet-android-install-sdk adresindeki yönergeleri izleyerek Android SDK’yi yükleyin. +Bir komut satırı derlemesi için özel bir SDK yolu kullanmak için 'AndroidSdkDirectory' MSBuild özelliğini özel yola ayarlayın. The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + Java SDK dizini bulunamadı. https://aka.ms/dotnet-android-install-sdk adresindeki yönergeleri izleyerek Java SDK’yi yükleyin. +Bir komut satırı derlemesi için özel bir SDK yolu kullanmak için 'JavaSdkDirectory' MSBuild özelliğini özel yola ayarlayın. The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx index 65c304d6ce3..e83bb142cc2 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hans.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + 找不到 Android SDK 目录。按照以下说明安装 Android SDK: https://aka.ms/dotnet-android-install-sdk +若要对命令行生成使用自定义 SDK 路径,请将 "AndroidSdkDirectory" MSBuild 属性设置为自定义路径。 The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + 找不到 Java SDK 目录。按照以下说明安装 Java SDK: https://aka.ms/dotnet-android-install-sdk +若要对命令行生成使用自定义 JDK 路径,请将 "JavaSdkDirectory" MSBuild 属性设置为自定义路径。 The following terms should not be translated: JavaSdkDirectory diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx index 18fabc97ff4..123e8633528 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.zh-Hant.resx @@ -881,13 +881,13 @@ In this message, the term "handheld app" means "app for handheld devices." {3} - The Android SDK installer program name - The Android SDK directory could not be found. Install the Android SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom SDK path for a command line build, set the 'AndroidSdkDirectory' MSBuild property to the custom path. + 找不到 Android SDK 目錄。請遵循下列指示安裝 Android SDK: https://aka.ms/dotnet-android-install-sdk +若要在命令列組建中使用自訂 SDK 路徑,請將 'AndroidSdkDirectory' MSBuild 屬性設定為自訂路徑。 The following terms should not be translated: AndroidSdkDirectory - The Java SDK directory could not be found. Install the Java SDK by following the instructions at: https://aka.ms/dotnet-android-install-sdk -To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MSBuild property to the custom path. + 找不到 JAVA SDK 目錄。請遵循下列指示安裝 JAVA SDK: https://aka.ms/dotnet-android-install-sdk +若要在命令列組建中使用自訂 JDK 路徑,請將 'JavaSdkDirectory' MSBuild 屬性設定為自訂路徑。 The following terms should not be translated: JavaSdkDirectory From fc4509efb886cfb67fdd69ebafdca7b8ab721ff9 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 30 May 2023 10:38:34 -0500 Subject: [PATCH 3/7] [profiled-aot] update AOT profile for .NET 8 Preview 5 (#8077) Various APIs in the BCL changed, but nothing concerning has appeared. Testing the new profile on a Pixel 5 device, `dotnet new android` an average of 10 runs: Before: Average(ms): 172.1 Std Err(ms): 2.20328038262143 Std Dev(ms): 6.96738433305099 After: Average(ms): 166.3 Std Err(ms): 2.29031778484025 Std Dev(ms): 7.24262076568666 --- src/profiled-aot/Directory.Build.props | 2 + src/profiled-aot/dotnet.aotprofile | Bin 239649 -> 239563 bytes src/profiled-aot/dotnet.aotprofile.txt | 146 ++++++++++++------------- 3 files changed, 75 insertions(+), 73 deletions(-) diff --git a/src/profiled-aot/Directory.Build.props b/src/profiled-aot/Directory.Build.props index e3c07d765f6..f395b28b993 100644 --- a/src/profiled-aot/Directory.Build.props +++ b/src/profiled-aot/Directory.Build.props @@ -4,6 +4,8 @@ true true false + + $(NoWarn);CA1305 diff --git a/src/profiled-aot/dotnet.aotprofile b/src/profiled-aot/dotnet.aotprofile index cfbd2228952e2587c478b8fb195698afb2c8d276..b55ef4e98ee53d560208062d6002ec9fd898a1f9 100644 GIT binary patch delta 40720 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 delta 40866 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 G3;qv_@) bool System.Boolean:TryParse (string,bool&) bool System.Boolean:TryParse (System.ReadOnlySpan`1,bool&) - bool System.Buffers.IndexOfAnyValues:TryGetSingleRange (System.ReadOnlySpan`1,byte&,byte&) - bool System.Buffers.IndexOfAnyValues:TryGetSingleRange (System.ReadOnlySpan`1,char&,char&) + bool System.Buffers.SearchValues:TryGetSingleRange (System.ReadOnlySpan`1,byte&,byte&) + bool System.Buffers.SearchValues:TryGetSingleRange (System.ReadOnlySpan`1,char&,char&) bool System.Char:IsDigit (char) bool System.Char:IsLatin1 (char) bool System.Char:IsLetterOrDigit (char) bool System.Char:IsWhiteSpace (char) bool System.Char:IsWhiteSpaceLatin1 (char) bool System.Char:System.ISpanFormattable.TryFormat (System.Span`1,int&,System.ReadOnlySpan`1,System.IFormatProvider) - bool System.Char:System.Numerics.INumberBase.TryConvertFromTruncating (int,char&) bool System.Collections.Concurrent.ConcurrentQueue`1:TryDequeue (object&) bool System.Collections.Concurrent.ConcurrentQueueSegment`1:TryDequeue (object&) bool System.Collections.Concurrent.ConcurrentQueueSegment`1:TryEnqueue (object) @@ -120,6 +119,7 @@ Methods: bool System.Globalization.CalendarData:GetCalendarInfo (string,System.Globalization.CalendarId,System.Globalization.CalendarDataType,string&) bool System.Globalization.CalendarData:IcuLoadCalendarDataFromSystem (string,System.Globalization.CalendarId) bool System.Globalization.CalendarData:LoadCalendarDataFromSystemCore (string,System.Globalization.CalendarId) + bool System.Globalization.CompareInfo:GetIsAsciiEqualityOrdinal (string) bool System.Globalization.CompareInfo:IcuStartsWith (System.ReadOnlySpan`1,System.ReadOnlySpan`1,System.Globalization.CompareOptions,int*) bool System.Globalization.CompareInfo:IsPrefix (string,string,System.Globalization.CompareOptions) bool System.Globalization.CompareInfo:IsPrefix (System.ReadOnlySpan`1,System.ReadOnlySpan`1,System.Globalization.CompareOptions) @@ -137,9 +137,11 @@ Methods: bool System.Globalization.GlobalizationMode:TryGetStringValue (string,string,string&) bool System.Globalization.GlobalizationMode/Settings:get_Invariant () bool System.Globalization.Ordinal:EqualsIgnoreCase_Scalar (char&,char&,int) + bool System.Globalization.Ordinal:EqualsIgnoreCase_Vector128 (char&,char&,int) bool System.Globalization.TimeSpanFormat:TryFormat (System.TimeSpan,System.Span`1,int&,System.ReadOnlySpan`1,System.IFormatProvider) bool System.Int32:TryFormat (System.Span`1,int&,System.ReadOnlySpan`1,System.IFormatProvider) bool System.Int32:TryParse (System.ReadOnlySpan`1,int&) + bool System.Int32:TryParse (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.IFormatProvider,int&) bool System.Int64:TryParse (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.IFormatProvider,long&) bool System.IO.BufferedStream:get_CanSeek () bool System.IO.DelegatingStream:get_CanSeek () @@ -208,8 +210,6 @@ Methods: bool System.Net.Http.HttpResponseMessage:get_IsSuccessStatusCode () bool System.Net.Http.HttpRuleParser:ContainsNewLine (string,int) bool System.Net.Http.QPack.QPackEncoder:EncodeNameString (string,System.Span`1,int&) - bool System.Number:TryFormatInt32 (int,int,System.ReadOnlySpan`1,System.IFormatProvider,System.Span`1,int&) - bool System.Number:TryFormatUInt32 (uint,System.ReadOnlySpan`1,System.IFormatProvider,System.Span`1,int&) bool System.Number:TryUInt32ToDecStr (uint,System.Span`1,int&) bool System.OrdinalIgnoreCaseComparer:Equals (string,string) bool System.Private.CoreLib.GateThread/DelayHelper:ShouldPerformGateActivities (int,bool) @@ -298,13 +298,14 @@ Methods: bool System.String:Equals (string,System.StringComparison) bool System.String:EqualsOrdinalIgnoreCase (string,string) bool System.String:EqualsOrdinalIgnoreCaseNoLengthCheck (string,string) + bool System.String:IsNullOrWhiteSpace (string) bool System.String:op_Equality (string,string) bool System.String:op_Inequality (string,string) bool System.String:StartsWith (char) bool System.String:StartsWith (string,System.StringComparison) bool System.String:StartsWith (string) bool System.SZGenericArrayEnumeratorBase:MoveNext () - bool System.Text.Ascii:IsValid (System.ReadOnlySpan`1) + bool System.Text.Ascii:IsValidCore (uint16&,int) bool System.Threading.CancellationToken:get_IsCancellationRequested () bool System.Threading.CancellationTokenSource:TransitionToCancellationRequested () bool System.Threading.CancellationTokenSource/Registrations:Unregister (long,System.Threading.CancellationTokenSource/CallbackNode) @@ -378,11 +379,7 @@ Methods: bool System.Type:get_IsValueType () bool System.Type:op_Equality (System.Type,System.Type) bool System.Type:op_Inequality (System.Type,System.Type) - bool System.UInt16:TryConvertFromTruncating (uint,uint16&) - bool System.UInt16:TryFormat (System.Span`1,int&,System.ReadOnlySpan`1,System.IFormatProvider) - bool System.UInt16:TryParse (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,uint16&) bool System.UInt16:TryParse (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.IFormatProvider,uint16&) - bool System.UInt32:TryConvertFromTruncating (uint16,uint&) bool System.Uri:CheckForUnicodeOrEscapedUnreserved (string) bool System.Uri:get_DisablePathAndQueryCanonicalization () bool System.Uri:get_IsDefaultPort () @@ -398,13 +395,14 @@ Methods: byte Java.Interop.NativeMethods:java_interop_jnienv_is_same_object (intptr,intptr,intptr) byte System.IO.BinaryReader:ReadByte () byte[] System.ArraySegment`1:get_Array () - byte[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:Rent (int) + byte[] System.Buffers.SharedArrayPool`1:Rent (int) byte[] System.GC:AllocateArray (int,bool) byte[] System.GC:AllocateUninitializedArray (int,bool) byte[] System.Net.Http.HPack.HPackEncoder:EncodeLiteralHeaderFieldWithoutIndexingNewNameToAllocatedArray (string) byte[] System.Net.Http.HPack.HPackEncoder:EncodeLiteralHeaderFieldWithoutIndexingToAllocatedArray (int) byte[] System.Net.Http.QPack.QPackEncoder:EncodeLiteralHeaderFieldWithoutNameReferenceToArray (string) byte[] System.Net.Http.QPack.QPackEncoder:EncodeLiteralHeaderFieldWithStaticNameReferenceToArray (int) + byte[] System.ReadOnlySpan`1:ToArray () byte[] System.Reflection.AssemblyNameHelpers:ComputePublicKeyToken (byte[]) byte[] System.Reflection.AssemblyNameParser:ParsePKT (string,bool) byte[] System.TimeZoneInfo/AndroidTzData:GetTimeZoneData (string) @@ -413,7 +411,7 @@ Methods: byte* System.Text.Unicode.Utf8Utility:GetPointerToFirstInvalidByte (byte*,int,int&,int&) char System.Numerics.INumber`1:Max (char,char) char System.Numerics.INumber`1:Min (char,char) - char[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:Rent (int) + char[] System.Buffers.SharedArrayPool`1:Rent (int) char[] System.GC:AllocateArray (int,bool) char[] System.GC:AllocateUninitializedArray (int,bool) char[] System.IO.Path:GetInvalidPathChars () @@ -457,13 +455,13 @@ Methods: int System.Array:GetLowerBoundInternal (System.Runtime.CompilerServices.ObjectHandleOnStack,int) int System.ArraySegment`1:get_Count () int System.ArraySegment`1:get_Offset () - int System.Buffers.IndexOfAny5Values`2:IndexOfAny (System.ReadOnlySpan`1) - int System.Buffers.IndexOfAnyLatin1CharValues:IndexOfAny (char&,int) - int System.Buffers.IndexOfAnyLatin1CharValues:IndexOfAny (char&,int) - int System.Buffers.IndexOfAnyLatin1CharValues:IndexOfAny (System.ReadOnlySpan`1) - int System.Buffers.IndexOfAnyLatin1CharValues:IndexOfAnyExcept (System.ReadOnlySpan`1) - int System.Buffers.IndexOfAnyLatin1CharValues:LastIndexOfAny (char&,int) - int System.Buffers.IndexOfAnyLatin1CharValues:LastIndexOfAny (System.ReadOnlySpan`1) + int System.Buffers.Any5SearchValues`2:IndexOfAny (System.ReadOnlySpan`1) + int System.Buffers.Latin1CharSearchValues:IndexOfAny (char&,int) + int System.Buffers.Latin1CharSearchValues:IndexOfAny (char&,int) + int System.Buffers.Latin1CharSearchValues:IndexOfAny (System.ReadOnlySpan`1) + int System.Buffers.Latin1CharSearchValues:IndexOfAnyExcept (System.ReadOnlySpan`1) + int System.Buffers.Latin1CharSearchValues:LastIndexOfAny (char&,int) + int System.Buffers.Latin1CharSearchValues:LastIndexOfAny (System.ReadOnlySpan`1) int System.Collections.ArrayList:Add (object) int System.Collections.ArrayList:get_Count () int System.Collections.Generic.ArraySortHelper`1:InternalBinarySearch (string[],int,int,string,System.Collections.Generic.IComparer`1) @@ -525,7 +523,9 @@ Methods: int System.Globalization.IcuLocaleData:SearchCultureName (string) int System.Globalization.Ordinal:CompareStringIgnoreCase (char&,int,char&,int) int System.Globalization.Ordinal:IndexOf (string,string,int,int,bool) + int System.Int32:Parse (string,System.Globalization.NumberStyles,System.IFormatProvider) int System.Int32:Parse (string) + int System.Int32:Parse (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.IFormatProvider) int System.IO.BinaryReader:Read7BitEncodedInt () int System.IO.BinaryReader:ReadInt32 () int System.IO.FileStream:Read (byte[],int,int) @@ -568,8 +568,7 @@ Methods: int System.Net.PathList:GetCookiesCount () int System.Net.PathList/PathListComparer:System.Collections.IComparer.Compare (object,object) int System.Net.Primitives.Interop/Sys:GetDomainName (byte*,int) - int System.Number:ParseInt32 (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo) - int System.Numerics.BitOperations:Log2SoftwareFallback (uint) + int System.Number:ParseBinaryInteger (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo) int System.Object:GetHashCode () int System.OrdinalCaseSensitiveComparer:Compare (string,string) int System.Private.CoreLib.Interop/Globalization:g____PInvoke|3_0 (intptr,uint16*,System.Globalization.CalendarId,System.Globalization.CalendarDataType,intptr) @@ -618,13 +617,12 @@ Methods: int System.Runtime.InteropServices.Marshal:GetLastSystemError () int System.RuntimeType:GetHashCode () int System.SpanHelpers:IndexOf (char&,int,char&,int) - int System.SpanHelpers:IndexOfAnyInRange (char&,char,char,int) int System.SpanHelpers:IndexOfAnyValueType (int16&,int16,int16,int16,int16,int) int System.SpanHelpers:IndexOfAnyValueType (int16&,int16,int16,int16,int16,int16,int) int System.SpanHelpers:IndexOfNullByte (byte*) int System.SpanHelpers:IndexOfNullCharacter (char*) int System.SpanHelpers:LastIndexOf (char&,int,char&,int) - int System.SpanHelpers:LastIndexOfValueType (int16&,int16,int) + int System.SpanHelpers:NonPackedIndexOfAnyInRangeUnsignedNumber (uint16&,uint16,uint16,int) int System.SpanHelpers:NonPackedIndexOfAnyValueType (int16&,int16,int16,int) int System.SpanHelpers:NonPackedIndexOfAnyValueType (int16&,int16,int16,int16,int) int System.SpanHelpers:NonPackedIndexOfValueType (int16&,int16,int) @@ -889,6 +887,7 @@ Methods: Microsoft.Win32.SafeHandles.SafeFileHandle Microsoft.Win32.SafeHandles.SafeFileHandle:Open (string,Interop/Sys/OpenFlags,int,System.Func`4) Microsoft.Win32.SafeHandles.SafeFileHandle Microsoft.Win32.SafeHandles.SafeFileHandle:Open (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.IO.FileOptions,long,System.IO.UnixFileMode,long&,System.IO.UnixFileMode&,System.Func`4) Microsoft.Win32.SafeHandles.SafeFileHandle Microsoft.Win32.SafeHandles.SafeFileHandle:Open (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.IO.FileOptions,long,System.Nullable`1,System.Func`4) + Microsoft.Win32.SafeHandles.SafeFileHandle System.Activator:CreateInstance () Microsoft.Win32.SafeHandles.SafeFileHandle System.Private.CoreLib.Interop/Sys:Open (string,Interop/Sys/OpenFlags,int) Microsoft.Win32.SafeHandles.SafeWaitHandle System.Threading.EventWaitHandle:ValidateHandle () Microsoft.Win32.SafeHandles.SafeWaitHandle System.Threading.WaitHandle:get_SafeWaitHandle () @@ -941,6 +940,7 @@ Methods: object System.RuntimeType:CreateInstanceForAnotherGenericParameter (System.Type,System.RuntimeType,System.RuntimeType) object System.RuntimeType:CreateInstanceInternal (System.Runtime.CompilerServices.QCallTypeHandle) object System.RuntimeType:CreateInstanceMono (bool,bool) + object System.RuntimeType:CreateInstanceOfT () object System.Threading.PortableThreadPool:CreateThreadLocalCompletionCountObject () object System.Threading.PortableThreadPool:GetOrCreateThreadLocalCompletionCountObject () object System.Threading.ThreadInt64PersistentCounter:CreateThreadLocalCountObject () @@ -954,7 +954,7 @@ Methods: object[] System.Reflection.CustomAttribute:GetCustomAttributesBase (System.Reflection.ICustomAttributeProvider,System.Type,bool) object[] System.Reflection.CustomAttribute:GetPseudoCustomAttributes (System.Reflection.ICustomAttributeProvider,System.Type) object& System.Collections.Generic.Dictionary`2:FindValue (string) - object& System.Net.Http.Headers.HttpHeaders:g__GrowEntriesAndAddDefault|74_0 (System.Net.Http.Headers.HeaderDescriptor) + object& System.Net.Http.Headers.HttpHeaders:g__GrowEntriesAndAddDefault|73_0 (System.Net.Http.Headers.HeaderDescriptor) object& System.Net.Http.Headers.HttpHeaders:GetValueRefOrAddDefault (System.Net.Http.Headers.HeaderDescriptor) object& System.Net.Http.Headers.HttpHeaders:GetValueRefOrNullRef (System.Net.Http.Headers.HeaderDescriptor) string Android.Runtime.AndroidTypeManager:GetReplacementTypeCore (string) @@ -1111,6 +1111,8 @@ Methods: string System.UriParser:get_SchemeName () string Xamarin.Android.Net.AndroidMessageHandler:EncodeUrl (System.Uri) string[] System.Collections.Generic.List`1:ToArray () + string[] System.Globalization.CultureData:AbbreviatedDayNames (System.Globalization.CalendarId) + string[] System.Globalization.CultureData:AbbreviatedMonthNames (System.Globalization.CalendarId) string[] System.Globalization.CultureData:get_LongTimes () string[] System.Globalization.CultureData:get_ShortTimes () string[] System.Globalization.CultureData:GetNativeDigits () @@ -1118,6 +1120,12 @@ Methods: string[] System.Globalization.CultureData:LongDates (System.Globalization.CalendarId) string[] System.Globalization.CultureData:ShortDates (System.Globalization.CalendarId) string[] System.Globalization.CultureData:YearMonths (System.Globalization.CalendarId) + string[] System.Globalization.DateTimeFormatInfo:get_AbbreviatedDayNames () + string[] System.Globalization.DateTimeFormatInfo:get_AbbreviatedMonthNames () + string[] System.Globalization.DateTimeFormatInfo:InternalGetAbbreviatedDayOfWeekNames () + string[] System.Globalization.DateTimeFormatInfo:InternalGetAbbreviatedDayOfWeekNamesCore () + string[] System.Globalization.DateTimeFormatInfo:InternalGetAbbreviatedMonthNames () + string[] System.Globalization.DateTimeFormatInfo:InternalGetAbbreviatedMonthNamesCore () string[] System.Net.Http.Headers.HttpHeaders:GetStoreValuesAsStringArray (System.Net.Http.Headers.HeaderDescriptor,System.Net.Http.Headers.HttpHeaders/HeaderStoreItemInfo) string[] System.String:Split (char,System.StringSplitOptions) string[] System.String:SplitInternal (System.ReadOnlySpan`1,int,System.StringSplitOptions) @@ -1132,13 +1140,13 @@ Methods: System.Attribute[] System.Reflection.CustomAttribute:GetCustomAttributesInternal (System.Reflection.ICustomAttributeProvider,System.Type,bool) System.Buffers.ArrayPool`1 System.Buffers.ArrayPool`1:get_Shared () System.Buffers.ArrayPool`1 System.Buffers.ArrayPool`1:get_Shared () - System.Buffers.IndexOfAnyValues`1 System.Buffers.IndexOfAnyValues:Create (System.ReadOnlySpan`1) - System.Buffers.IndexOfAnyValues`1 System.Buffers.IndexOfAnyValues:Create (System.ReadOnlySpan`1) System.Buffers.OperationStatus System.Text.Ascii:ChangeCase (System.ReadOnlySpan`1,System.Span`1,int&) System.Buffers.OperationStatus System.Text.Unicode.Utf8Utility:TranscodeToUtf16 (byte*,int,char*,int,byte*&,char*&) System.Buffers.OperationStatus System.Text.Unicode.Utf8Utility:TranscodeToUtf8 (char*,int,byte*,int,char*&,byte*&) - System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:InitializeTlsBucketsAndTrimming () - System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:InitializeTlsBucketsAndTrimming () + System.Buffers.SearchValues`1 System.Buffers.SearchValues:Create (System.ReadOnlySpan`1) + System.Buffers.SearchValues`1 System.Buffers.SearchValues:Create (System.ReadOnlySpan`1) + System.Buffers.SharedArrayPool`1/ThreadLocalArray[] System.Buffers.SharedArrayPool`1:InitializeTlsBucketsAndTrimming () + System.Buffers.SharedArrayPool`1/ThreadLocalArray[] System.Buffers.SharedArrayPool`1:InitializeTlsBucketsAndTrimming () System.Collections.Generic.Comparer`1 System.Collections.Generic.Comparer`1:CreateComparer () System.Collections.Generic.Comparer`1 System.Collections.Generic.Comparer`1:get_Default () System.Collections.Generic.Dictionary`2> System.Runtime.Loader.AssemblyLoadContext:get_AllContexts () @@ -1224,7 +1232,7 @@ Methods: System.Globalization.DateTimeFormatInfo System.Globalization.DateTimeFormatInfo:GetInstance (System.IFormatProvider) System.Globalization.DaylightTimeStruct System.TimeZoneInfo:GetDaylightTime (int,System.TimeZoneInfo/AdjustmentRule,System.Nullable`1) System.Globalization.NumberFormatInfo System.Globalization.CultureInfo:get_NumberFormat () - System.Globalization.NumberFormatInfo System.Globalization.NumberFormatInfo:g__GetProviderNonNull|44_0 (System.IFormatProvider) + System.Globalization.NumberFormatInfo System.Globalization.NumberFormatInfo:g__GetProviderNonNull|58_0 (System.IFormatProvider) System.Globalization.NumberFormatInfo System.Globalization.NumberFormatInfo:get_CurrentInfo () System.Globalization.NumberFormatInfo System.Globalization.NumberFormatInfo:get_InvariantInfo () System.Globalization.NumberFormatInfo System.Globalization.NumberFormatInfo:GetInstance (System.IFormatProvider) @@ -1281,9 +1289,9 @@ Methods: System.Nullable`1 System.Net.Http.Headers.HttpContentHeaders:get_ContentLength () System.Nullable`1 System.TimeZoneInfo:TZif_ParseOffsetString (System.ReadOnlySpan`1) System.Nullable`1 System.TimeZoneInfo:TZif_CreateTransitionTimeFromPosixRule (System.ReadOnlySpan`1,System.ReadOnlySpan`1) - System.Number/ParsingStatus System.Number:TryParseInt32IntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,int&) - System.Number/ParsingStatus System.Number:TryParseInt64IntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,long&) - System.Number/ParsingStatus System.Number:TryParseUInt32IntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,uint&) + System.Number/ParsingStatus System.Number:TryParseBinaryIntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,int&) + System.Number/ParsingStatus System.Number:TryParseBinaryIntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,long&) + System.Number/ParsingStatus System.Number:TryParseBinaryIntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,uint16&) System.ParsingError System.Uri:CheckSchemeSyntax (System.ReadOnlySpan`1,System.UriParser&) System.ParsingError System.Uri:ParseScheme (string,System.Uri/Flags&,System.UriParser&) System.ParsingError System.Uri:PrivateParseMinimal () @@ -1294,7 +1302,6 @@ Methods: System.ReadOnlySpan`1 System.Globalization.IcuLocaleData:get_NameIndexToNumericData () System.ReadOnlySpan`1 System.Globalization.IcuLocaleData:GetCultureName (int) System.ReadOnlySpan`1 System.IO.BinaryReader:InternalRead (int) - System.ReadOnlySpan`1 System.Numerics.BitOperations:get_Log2DeBruijn () System.ReadOnlySpan`1 System.Text.UTF8Encoding:get_PreambleSpan () System.ReadOnlySpan`1 System.Text.UTF8Encoding/UTF8EncodingSealed:get_Preamble () System.ReadOnlySpan`1 System.IO.Path:TrimEndingDirectorySeparator (System.ReadOnlySpan`1) @@ -1336,7 +1343,6 @@ Methods: System.Reflection.ConstructorInfo System.Type:GetConstructor (System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[]) System.Reflection.ConstructorInfo System.Type:GetConstructor (System.Type[]) System.Reflection.ConstructorInfo[] System.RuntimeType/ListBuilder`1:ToArray () - System.Reflection.ConstructorInvoker System.Reflection.RuntimeConstructorInfo:get_Invoker () System.Reflection.CorElementType System.RuntimeType:GetCorElementType () System.Reflection.CorElementType System.RuntimeTypeHandle:GetCorElementType (System.Runtime.CompilerServices.QCallTypeHandle) System.Reflection.CorElementType System.RuntimeTypeHandle:GetCorElementType (System.RuntimeType) @@ -1363,7 +1369,6 @@ Methods: System.Reflection.MethodInfo System.RuntimeType:GetMethodImpl (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[]) System.Reflection.MethodInfo System.Type:GetMethod (string,System.Reflection.BindingFlags) System.Reflection.MethodInfo System.Type:GetMethod (string) - System.Reflection.MethodInvoker System.Reflection.RuntimeMethodInfo:get_Invoker () System.Reflection.MonoMethodInfo System.Reflection.MonoMethodInfo:GetMethodInfo (intptr) System.Reflection.ParameterInfo[] System.Reflection.MethodBase:GetParametersNoCopy () System.Reflection.ParameterInfo[] System.Reflection.MonoMethodInfo:get_parameter_info (intptr,System.Reflection.MemberInfo) @@ -1415,7 +1420,6 @@ Methods: System.RuntimeType/TypeCache System.RuntimeType:get_Cache () System.RuntimeTypeHandle System.RuntimeType:get_TypeHandle () System.Span`1 System.Text.ValueUtf8Converter:ConvertAndTerminateString (System.ReadOnlySpan`1) - System.Span`1 System.Collections.Generic.ValueListBuilder`1:AppendSpan (int) System.Span`1 System.Runtime.InteropServices.CollectionsMarshal:AsSpan (System.Collections.Generic.List`1) System.Text.Decoder System.Text.UTF8Encoding:GetDecoder () System.Text.Encoding System.Text.Encoding:get_UTF8 () @@ -1437,7 +1441,7 @@ Methods: System.Threading.ExecutionContext& System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__Core|27_0>d>:get_Context () System.Threading.ExecutionContext& System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__63>:get_Context () System.Threading.ExecutionContext& System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__DisposeSourceAsync|1_0>d>:get_Context () - System.Threading.LowLevelLifoSemaphore/Counts System.Threading.LowLevelLifoSemaphore/Counts:InterlockedCompareExchange (System.Threading.LowLevelLifoSemaphore/Counts,System.Threading.LowLevelLifoSemaphore/Counts) + System.Threading.LowLevelLifoSemaphoreBase/Counts System.Threading.LowLevelLifoSemaphoreBase/Counts:InterlockedCompareExchange (System.Threading.LowLevelLifoSemaphoreBase/Counts,System.Threading.LowLevelLifoSemaphoreBase/Counts) System.Threading.PortableThreadPool/ThreadCounts System.Threading.PortableThreadPool/ThreadCounts:InterlockedCompareExchange (System.Threading.PortableThreadPool/ThreadCounts,System.Threading.PortableThreadPool/ThreadCounts) System.Threading.SemaphoreSlim System.IO.Stream:EnsureAsyncActiveSemaphoreInitialized () System.Threading.SynchronizationContext Android.App.Application:get_SynchronizationContext () @@ -1468,7 +1472,6 @@ Methods: System.Threading.Tasks.Task Xamarin.Android.Net.AndroidMessageHandler:SetupRequest (System.Net.Http.HttpRequestMessage,Java.Net.HttpURLConnection) System.Threading.Tasks.Task/ContingentProperties System.Threading.Tasks.Task:EnsureContingentPropertiesInitializedUnsafe () System.Threading.Tasks.Task`1 System.Threading.SemaphoreSlim:WaitAsync (int,System.Threading.CancellationToken) - System.Threading.Tasks.Task`1 System.Threading.Tasks.Task:FromResult (bool) System.Threading.Tasks.Task`1 System.Threading.Tasks.TaskCache:CreateCacheableTask (bool) System.Threading.Tasks.Task`1 System.IO.Stream:BeginEndReadAsync (byte[],int,int) System.Threading.Tasks.Task`1 System.IO.Stream:BeginReadInternal (byte[],int,int,System.AsyncCallback,object,bool,bool) @@ -1514,7 +1517,7 @@ Methods: System.Threading.TimerQueue System.Collections.Generic.List`1:get_Item (int) System.Threading.TimerQueue[] System.Threading.TimerQueue:CreateTimerQueues () System.Threading.TimerQueue[] System.Threading.TimerQueue:get_Instances () - System.Threading.WaitSubsystem/ThreadWaitInfo System.Threading.Thread:g__AllocateWaitInfo|51_0 () + System.Threading.WaitSubsystem/ThreadWaitInfo System.Threading.Thread:g__AllocateWaitInfo|52_0 () System.Threading.WaitSubsystem/ThreadWaitInfo System.Threading.Thread:get_WaitInfo () System.Threading.WaitSubsystem/ThreadWaitInfo/WaitedListNode System.Private.CoreLib.ThreadWaitInfo/WaitedListNode:get_NextThread () System.Threading.WaitSubsystem/ThreadWaitInfo/WaitedListNode[] System.Threading.WaitSubsystem/ThreadWaitInfo:GetWaitedListNodeArray (int) @@ -1605,10 +1608,8 @@ Methods: uint System.Collections.Hashtable:InitHash (object,int,uint&,uint&) uint System.Private.CoreLib.GateThread/DelayHelper:GetNextDelay (int) uint System.Threading.TimerQueueTimer:GetMilliseconds (System.TimeSpan,string) - uint System.UInt32:Log2 (uint) uintptr System.Text.Ascii:ChangeCase (uint16*,uint16*,uintptr) uintptr System.Text.Ascii:GetIndexOfFirstNonAsciiByte_Default (byte*,uintptr) - uintptr System.Text.Ascii:GetIndexOfFirstNonAsciiChar_Default (char*,uintptr) uintptr System.Text.Ascii:NarrowUtf16ToAscii (char*,byte*,uintptr) uintptr System.Text.Ascii:WidenAsciiToUtf16 (byte*,char*,uintptr) ulong System.Marvin:GenerateSeed () @@ -1838,6 +1839,7 @@ Methods: void Mono.SafeStringMarshal:GFree (intptr) void System.AppContext:Setup (char**,char**,int) void System.ArgumentException:ThrowIfNullOrEmpty (string,string) + void System.ArgumentException:ThrowIfNullOrWhiteSpace (string,string) void System.ArgumentOutOfRangeException:ThrowIfGreaterThan (int,int,string) void System.ArgumentOutOfRangeException:ThrowIfGreaterThan (long,long,string) void System.ArgumentOutOfRangeException:ThrowIfGreaterThanOrEqual (int,int,string) @@ -1868,6 +1870,8 @@ Methods: void System.Boolean:.cctor () void System.Buffer:BulkMoveWithWriteBarrier (byte&,byte&,uintptr,intptr) void System.Buffer:Memmove (byte&,byte&,uintptr) + void System.Buffers.Any5SearchValues`2:.ctor (System.ReadOnlySpan`1) + void System.Buffers.AnyByteSearchValues:.ctor (System.ReadOnlySpan`1) void System.Buffers.ArrayPool`1:.cctor () void System.Buffers.ArrayPool`1:.ctor () void System.Buffers.ArrayPool`1:.cctor () @@ -1875,20 +1879,16 @@ Methods: void System.Buffers.ArrayPoolEventSource:.cctor () void System.Buffers.ArrayPoolEventSource:.ctor () void System.Buffers.BitVector256:Set (int) - void System.Buffers.IndexOfAny5Values`2:.ctor (System.ReadOnlySpan`1) - void System.Buffers.IndexOfAnyAsciiSearcher:ComputeBitmap256 (System.ReadOnlySpan`1,System.Runtime.Intrinsics.Vector128`1&,System.Runtime.Intrinsics.Vector128`1&,System.Buffers.BitVector256&) - void System.Buffers.IndexOfAnyByteValues:.ctor (System.ReadOnlySpan`1) - void System.Buffers.IndexOfAnyLatin1CharValues:.ctor (System.ReadOnlySpan`1) - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c:.cctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c:.ctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c:.cctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c:.ctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/PerCoreLockedStacks:.cctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/PerCoreLockedStacks:.cctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:.ctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:Return (byte[],bool) - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:.ctor () - void System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1:Return (char[],bool) + void System.Buffers.IndexOfAnyAsciiSearcher:ComputeBitmap256 (System.ReadOnlySpan`1,System.Runtime.Intrinsics.Vector256`1&,System.Runtime.Intrinsics.Vector256`1&,System.Buffers.BitVector256&) + void System.Buffers.Latin1CharSearchValues:.ctor (System.ReadOnlySpan`1) + void System.Buffers.SharedArrayPool`1/<>c:.cctor () + void System.Buffers.SharedArrayPool`1/<>c:.ctor () + void System.Buffers.SharedArrayPool`1/<>c:.cctor () + void System.Buffers.SharedArrayPool`1/<>c:.ctor () + void System.Buffers.SharedArrayPool`1:.ctor () + void System.Buffers.SharedArrayPool`1:Return (byte[],bool) + void System.Buffers.SharedArrayPool`1:.ctor () + void System.Buffers.SharedArrayPool`1:Return (char[],bool) void System.Collections.ArrayList:EnsureCapacity (int) void System.Collections.ArrayList:set_Capacity (int) void System.Collections.ArrayList:set_Item (int,object) @@ -1988,16 +1988,12 @@ Methods: void System.DateTime:.ctor (ulong) void System.DateTime:GetDate (int&,int&,int&) void System.DateTimeFormat:.cctor () - void System.DateTimeFormat:FormatDigits (System.Collections.Generic.ValueListBuilder`1&,int,int,bool) void System.DateTimeFormat:FormatDigits (System.Collections.Generic.ValueListBuilder`1&,int,int) void System.DateTimeOffset:.cctor () void System.DateTimeOffset:.ctor (int16,System.DateTime) void System.DateTimeOffset:.ctor (long,System.TimeSpan) void System.DBNull:.cctor () void System.DBNull:.ctor () - void System.Decimal:.cctor () - void System.Decimal:.ctor (int,int,int,bool,byte) - void System.Decimal:.ctor (int) void System.DefaultBinder:.cctor () void System.DefaultBinder:.ctor () void System.Diagnostics.Stopwatch:.cctor () @@ -2053,10 +2049,8 @@ Methods: void System.Globalization.GregorianCalendar:.ctor () void System.Globalization.GregorianCalendar:.ctor (System.Globalization.GregorianCalendarTypes) void System.Globalization.NumberFormatInfo:.cctor () - void System.Globalization.NumberFormatInfo:.ctor () void System.Globalization.NumberFormatInfo:.ctor (System.Globalization.CultureData) void System.Globalization.NumberFormatInfo:InitializeInvariantAndNegativeSignFlags () - void System.Globalization.NumberFormatInfo:ValidateParseStyleInteger (System.Globalization.NumberStyles) void System.Globalization.TextInfo:.cctor () void System.Globalization.TextInfo:.ctor (System.Globalization.CultureData,bool) void System.Globalization.TextInfo:.ctor (System.Globalization.CultureData) @@ -2218,7 +2212,7 @@ Methods: void System.Net.Http.HttpClient:CheckRequestBeforeSend (System.Net.Http.HttpRequestMessage) void System.Net.Http.HttpClient:CheckRequestMessage (System.Net.Http.HttpRequestMessage) void System.Net.Http.HttpClient:Dispose (bool) - void System.Net.Http.HttpClient:FinishSend (System.Threading.CancellationTokenSource,bool,bool,bool) + void System.Net.Http.HttpClient:FinishSend (System.Net.Http.HttpResponseMessage,System.Threading.CancellationTokenSource,bool,bool,bool) void System.Net.Http.HttpClient:PrepareRequestMessage (System.Net.Http.HttpRequestMessage) void System.Net.Http.HttpClient:SetOperationStarted () void System.Net.Http.HttpClient/<g__Core|83_0>d:MoveNext () @@ -2292,7 +2286,7 @@ Methods: void System.Private.CoreLib.ThreadWaitInfo/WaitedListNode:UnregisterWait (System.Threading.WaitSubsystem/WaitableObject) void System.Private.CoreLib.WorkerThread/<>c:.cctor () void System.Private.CoreLib.WorkerThread/<>c:.ctor () - void System.Private.CoreLib.WorkerThread/<>c:<.cctor>b__13_0 () + void System.Private.CoreLib.WorkerThread/<>c:<.cctor>b__15_0 () void System.Random/XoshiroImpl:.ctor () void System.Reflection.Assembly:.cctor () void System.Reflection.AssemblyName:.ctor (string) @@ -2424,6 +2418,11 @@ Methods: void System.Runtime.InteropServices.Marshal:SetLastPInvokeError (int) void System.Runtime.InteropServices.Marshal:SetLastSystemError (int) void System.Runtime.InteropServices.Marshalling.ArrayMarshaller`2/ManagedToUnmanagedIn:.cctor () + void System.Runtime.InteropServices.Marshalling.SafeHandleMarshaller`1/ManagedToUnmanagedIn:Free () + void System.Runtime.InteropServices.Marshalling.SafeHandleMarshaller`1/ManagedToUnmanagedIn:FromManaged (System.Runtime.InteropServices.SafeHandle) + void System.Runtime.InteropServices.Marshalling.SafeHandleMarshaller`1/ManagedToUnmanagedOut:.ctor () + void System.Runtime.InteropServices.Marshalling.SafeHandleMarshaller`1/ManagedToUnmanagedOut:Free () + void System.Runtime.InteropServices.Marshalling.SafeHandleMarshaller`1/ManagedToUnmanagedOut:FromUnmanaged (intptr) void System.Runtime.InteropServices.Marshalling.Utf8StringMarshaller:Free (byte*) void System.Runtime.InteropServices.Marshalling.Utf8StringMarshaller/ManagedToUnmanagedIn:Free () void System.Runtime.InteropServices.Marshalling.Utf8StringMarshaller/ManagedToUnmanagedIn:FromManaged (string,System.Span`1) @@ -2465,7 +2464,7 @@ Methods: void System.String:.ctor (char*) void System.String:.ctor (sbyte*) void System.String:.ctor (System.ReadOnlySpan`1) - void System.String:FillStringChecked (string,int,string) + void System.String:CopyStringContent (string,int,string) void System.String:MakeSeparatorListAny (System.ReadOnlySpan`1,System.ReadOnlySpan`1,System.Collections.Generic.ValueListBuilder`1&) void System.String:memcpy (byte*,byte*,int) void System.String:memset (byte*,int,int) @@ -2531,17 +2530,18 @@ Methods: void System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object) void System.Threading.LowLevelLifoSemaphore:.ctor (int,int,int,System.Action) void System.Threading.LowLevelLifoSemaphore:Create (int) - void System.Threading.LowLevelLifoSemaphore:Release (int) void System.Threading.LowLevelLifoSemaphore:ReleaseCore (int) void System.Threading.LowLevelLifoSemaphore:ReleaseInternal (intptr,int) - void System.Threading.LowLevelLifoSemaphore/Counts:AddUpToMaxCountOfWaitersSignaledToWake (uint) - void System.Threading.LowLevelLifoSemaphore/Counts:DecrementCountOfWaitersSignaledToWake () - void System.Threading.LowLevelLifoSemaphore/Counts:DecrementSpinnerCount () - void System.Threading.LowLevelLifoSemaphore/Counts:DecrementWaiterCount () - void System.Threading.LowLevelLifoSemaphore/Counts:IncrementSpinnerCount () - void System.Threading.LowLevelLifoSemaphore/Counts:IncrementWaiterCount () - void System.Threading.LowLevelLifoSemaphore/Counts:set_SignalCount (uint) - void System.Threading.LowLevelLifoSemaphore/Counts:SetUInt32Value (uint,byte) + void System.Threading.LowLevelLifoSemaphoreBase:.ctor (int,int,int,System.Action) + void System.Threading.LowLevelLifoSemaphoreBase:Release (int) + void System.Threading.LowLevelLifoSemaphoreBase/Counts:AddUpToMaxCountOfWaitersSignaledToWake (uint) + void System.Threading.LowLevelLifoSemaphoreBase/Counts:DecrementCountOfWaitersSignaledToWake () + void System.Threading.LowLevelLifoSemaphoreBase/Counts:DecrementSpinnerCount () + void System.Threading.LowLevelLifoSemaphoreBase/Counts:DecrementWaiterCount () + void System.Threading.LowLevelLifoSemaphoreBase/Counts:IncrementSpinnerCount () + void System.Threading.LowLevelLifoSemaphoreBase/Counts:IncrementWaiterCount () + void System.Threading.LowLevelLifoSemaphoreBase/Counts:set_SignalCount (uint) + void System.Threading.LowLevelLifoSemaphoreBase/Counts:SetUInt32Value (uint,byte) void System.Threading.LowLevelLock:.cctor () void System.Threading.LowLevelLock:.ctor () void System.Threading.LowLevelLock:Acquire () From 03c804262b635089d2d7dab5290eef7d00c66ee2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 14:43:07 -0400 Subject: [PATCH 4/7] Bump to xamarin/Java.Interop/main@8c9eece (#8073) Changes: https://github.com/xamarin/java.interop/compare/93c50fef9eca85110977ee47ddaa053f2ed47d59...8c9eece2b3692f7d3b12dc0b39b4aa386bc6cc3d * xamarin/java.interop@8c9eece2: [build] Enable NuGet's Central Package Management (xamarin/java.interop#1114) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- external/Java.Interop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/Java.Interop b/external/Java.Interop index 93c50fef9ec..8c9eece2b36 160000 --- a/external/Java.Interop +++ b/external/Java.Interop @@ -1 +1 @@ -Subproject commit 93c50fef9eca85110977ee47ddaa053f2ed47d59 +Subproject commit 8c9eece2b3692f7d3b12dc0b39b4aa386bc6cc3d From fbf5c15f967d8b766d73f62f25103a60a03dd087 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Thu, 1 Jun 2023 10:37:48 +0100 Subject: [PATCH 5/7] Bump LibZipSharp to 3.0.0 (#8061) Changes * Add Version to Native Library https://github.com/xamarin/LibZipSharp/commit/45f4c1d9f9114605a7b58f66747492b41442769d * Add net7.0 assembly to package https://github.com/xamarin/LibZipSharp/commit/a3958a6d2ebd6a566a76cb6dd30893fa976305d6 * Keep netcoreapp3.1 https://github.com/xamarin/LibZipSharp/commit/1a0f3420781c636dd7d4865fdbd45cd345f26fd9 --- Directory.Build.props | 2 +- build-tools/debian-metadata/rules | 2 +- build-tools/installers/create-installers.targets | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 1132c799f44..aebf6102cc3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -40,7 +40,7 @@ - 2.1.0 + 3.0.0 1.0.0 0.11.4 13.0.1 diff --git a/build-tools/debian-metadata/rules b/build-tools/debian-metadata/rules index 09d288dedbc..0db5a1752d6 100755 --- a/build-tools/debian-metadata/rules +++ b/build-tools/debian-metadata/rules @@ -21,7 +21,7 @@ override_dh_install: rm -f bin/*/lib/xamarin.android/xbuild/Xamarin/Android/opt.exe rm -f bin/*/lib/xamarin.android/xbuild/Xamarin/Android/aapt2.exe rm -f bin/*/lib/xamarin.android/xbuild/Xamarin/Android/libwinpthread-1.dll - rm -f bin/*/lib/xamarin.android/xbuild/Xamarin/Android/libZipSharpNative.dll + rm -f bin/*/lib/xamarin.android/xbuild/Xamarin/Android/libZipSharpNative-*.dll rm -f bin/*/lib/xamarin.android/xbuild/Xamarin/Android/runtimes/*/libMono.Unix.so dh_install diff --git a/build-tools/installers/create-installers.targets b/build-tools/installers/create-installers.targets index f73ffc36c7b..9262466ae77 100644 --- a/build-tools/installers/create-installers.targets +++ b/build-tools/installers/create-installers.targets @@ -267,12 +267,12 @@ <_MSBuildTargetsSrcFiles Include="$(MSBuildTargetsSrcDir)\Xamarin.Android.DefaultOutputPaths.targets" /> - <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x86\libZipSharpNative.dll" /> - <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x86\libZipSharpNative.pdb" /> - <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x64\libZipSharpNative.dll" /> - <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x64\libZipSharpNative.pdb" /> - <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)arm64\libZipSharpNative.dll" /> - <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)arm64\libZipSharpNative.pdb" /> + <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x86\libZipSharpNative-*.dll" /> + <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x86\libZipSharpNative-*.pdb" /> + <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x64\libZipSharpNative-*.dll" /> + <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)x64\libZipSharpNative-*.pdb" /> + <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)arm64\libZipSharpNative-*.dll" /> + <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)arm64\libZipSharpNative-*.pdb" /> <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)aapt2.exe" /> <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)binutils\bin\as.exe" /> <_MSBuildFilesWin Include="$(MicrosoftAndroidSdkOutDir)binutils\bin\ld.exe" /> @@ -324,7 +324,7 @@ <_MSBuildFilesUnixSign Include="$(MicrosoftAndroidSdkOutDir)lib\host-$(HostOS)\libmonosgen-2.0.$(LibExtension)" ExcludeFromAndroidNETSdk="true" /> <_MSBuildFilesUnixSign Include="$(MicrosoftAndroidSdkOutDir)lib\host-$(HostOS)\libxamarin-app.$(LibExtension)" ExcludeFromAndroidNETSdk="true" /> <_MSBuildFilesUnixSign Include="$(MicrosoftAndroidSdkOutDir)lib\host-$(HostOS)\libxa-internal-api.$(LibExtension)" ExcludeFromAndroidNETSdk="true" /> - <_MSBuildFilesUnixSign Include="$(MicrosoftAndroidSdkOutDir)libZipSharpNative.$(LibExtension)" /> + <_MSBuildFilesUnixSign Include="$(MicrosoftAndroidSdkOutDir)libZipSharpNative-*.$(LibExtension)" /> <_MSBuildFilesUnixSign Include="$(MicrosoftAndroidSdkOutDir)libMono.Unix.$(LibExtension)" /> From 827318d49b8f29d1cb3db1bbda3869b1164c80a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 10:55:35 -0400 Subject: [PATCH 6/7] Bump to xamarin/Java.Interop/main@72b041a (#8089) Changes: https://github.com/xamarin/java.interop/compare/8c9eece2b3692f7d3b12dc0b39b4aa386bc6cc3d...72b041a542f2929828e84587b1c6c5b44be90f81 * xamarin/java.interop@72b041a5: Localized file check-in by OneLocBuild Task: Build definition ID 12262: Build ID 7838962 (xamarin/java.interop#1111) * xamarin/java.interop@54d14d00: LEGO: Merge pull request 1117 Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- external/Java.Interop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/Java.Interop b/external/Java.Interop index 8c9eece2b36..72b041a542f 160000 --- a/external/Java.Interop +++ b/external/Java.Interop @@ -1 +1 @@ -Subproject commit 8c9eece2b3692f7d3b12dc0b39b4aa386bc6cc3d +Subproject commit 72b041a542f2929828e84587b1c6c5b44be90f81 From 941e04c22546227c5e1ae0eca9cda30740d14f9e Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Thu, 1 Jun 2023 11:13:49 -0400 Subject: [PATCH 7/7] [XABT] Prefer `SupportedOSPlatformVersion` over `minSdkVersion` (#8026) Fixes: https://github.com/xamarin/xamarin-android/issues/8040 I noticed that we were not writing a supported (by us) `//uses-sdk/@android:minSdkVersion` value to the generated `AndroidManifest.xml` file for projects which included a manifest that declared a `targetSdkVersion`. In these cases, we would always write a `//uses-sdk/@android:minSdkVersion` value of `19` to `AndroidManifest.xml`, as that was the minimum API level the Android NDK supported. (This was also a mistake, as *MonoVM* has API-21 as the minimum supported target. This mistake is corrected.) Fix this to always use the value of `$(SupportedOSPlatformVersion)` as the `minSdkVersion` attribute in the `AndroidManifest.xml` file. If this value is not explicitly set in the project file, it will now default to `$(AndroidMinimumSupportedApiLevel)` instead of `$(TargetPlatformVersion)`. The `XA4216` error/warning code has been expanded+repurposed. The warning that would display when the `minSdkVersion` attribute in `AndroidManifest.xml` was less than our minimum supported API level has been converted into an error: error XA4216: The deployment target '19' is not supported (the minimum is '21'). Please increase (or remove) the //uses-sdk/@android:minSdkVersion value in your project file. A similar error is now reported when `$(SupportedOSPlatformVersion)` is less than `$(AndroidMinimumSupportedApiLevel)` error XA4216: The deployment target '19' is not supported (the minimum is '21'). Please increase the $(SupportedOSPlatformVersion) property value in your project file. An error condition has been added for when `//uses-sdk/@android:minSdkVersion` in `AndroidManifest.xml` does not match `$(SupportedOSPlatformVersion)`: error XA1036: AndroidManifest.xml //uses-sdk/@android:minSdkVersion '19' does not match the $(SupportedOSPlatformVersion) value '21.0' in the project file (if there is no $(SupportedOSPlatformVersion) value in the project file, then a default value has been assumed). Either change the value in the AndroidManifest.xml to match the $(SupportedOSPlatformVersion) value, or remove the value in the AndroidManifest.xml (and add a $(SupportedOSPlatformVersion) value to the project file if it doesn't already exist). A few multidex related tests have been updated/removed as they are only valid with a `minSdkVersion` of 20 or lower. --- Configuration.props | 2 +- Documentation/guides/messages/README.md | 4 +- Documentation/guides/messages/xa1036.md | 27 +++ Documentation/guides/messages/xa4216.md | 34 +++- build-tools/scripts/NDKVersionInfo.targets | 15 -- build-tools/scripts/XABuildConfig.cs.in | 2 +- .../xaprepare/Application/KnownProperties.cs | 1 + .../Application/Properties.Defaults.cs.in | 1 + .../xaprepare/Steps/Step_GenerateFiles.cs | 2 +- .../xaprepare/xaprepare/xaprepare.targets | 1 + ...soft.Android.Sdk.DefaultProperties.targets | 3 + .../Properties/Resources.Designer.cs | 21 ++- .../Properties/Resources.resx | 21 ++- .../Tasks/GenerateJavaStubs.cs | 8 +- .../Tasks/GetJavaPlatformJar.cs | 29 ++-- .../Xamarin.Android.Build.Tests/AotTests.cs | 2 +- .../Xamarin.Android.Build.Tests/BuildTest.cs | 23 +-- .../Xamarin.Android.Build.Tests/BuildTest2.cs | 60 +------ .../ManifestTest.cs | 157 +++++++++++++++++- .../PackagingTest.cs | 2 +- .../Tasks/GetDependenciesTests.cs | 2 +- .../Xamarin.Android.Build.Tests/XASdkTests.cs | 30 ---- .../Android/XASdkProject.cs | 2 - .../XamarinAndroidApplicationProject.cs | 15 +- .../Common/DotNetStandard.cs | 4 - .../Common/DotNetXamarinProject.cs | 16 +- .../Common/XamarinProject.cs | 7 +- .../Utilities/ManifestDocument.cs | 31 ++-- .../Utilities/MonoAndroidHelper.cs | 17 ++ .../Xamarin.Android.Tooling.targets | 1 + .../BuildTests/Properties/AndroidManifest.xml | 2 +- .../Tests/DebuggingTest.cs | 3 +- .../Tests/InstallAndRunTests.cs | 10 +- .../Tests/MonoAndroidExportTest.cs | 4 +- 34 files changed, 355 insertions(+), 204 deletions(-) create mode 100644 Documentation/guides/messages/xa1036.md delete mode 100644 build-tools/scripts/NDKVersionInfo.targets diff --git a/Configuration.props b/Configuration.props index 4e40ffde653..46cf077de5f 100644 --- a/Configuration.props +++ b/Configuration.props @@ -22,7 +22,7 @@ v4.7.2 v4.7.1 26 - + 21 33 diff --git a/Documentation/guides/messages/README.md b/Documentation/guides/messages/README.md index 235d1d866f9..af06e1bd243 100644 --- a/Documentation/guides/messages/README.md +++ b/Documentation/guides/messages/README.md @@ -135,6 +135,8 @@ or 'Help->Report a Problem' in Visual Studio for Mac. + [XA1032](xa1032.md):Failed to resolve '{0}' from '{1}'. Please check your `AndroidHttpClientHandlerType` setting. + [XA1033](xa1033.md): Could not resolve '{0}'. Please check your `AndroidHttpClientHandlerType` setting. + [XA1035](xa1035.md): The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. ++ [XA1036](xa1036.md): AndroidManifest.xml //uses-sdk/@android:minSdkVersion '29' does not match the $(SupportedOSPlatformVersion) value '21' in the project file (if there is no $(SupportedOSPlatformVersion) value in the project file, then a default value has been assumed). +Either change the value in the AndroidManifest.xml to match the $(SupportedOSPlatformVersion) value, or remove the value in the AndroidManifest.xml (and add a $(SupportedOSPlatformVersion) value to the project file if it doesn't already exist). ## XA2xxx: Linker @@ -163,7 +165,7 @@ or 'Help->Report a Problem' in Visual Studio for Mac. + XA4213: The type '{type}' must provide a public default constructor + [XA4214](xa4214.md): The managed type \`Library1.Class1\` exists in multiple assemblies: Library1, Library2. Please refactor the managed type names in these assemblies so that they are not identical. + [XA4215](xa4215.md): The Java type \`com.contoso.library1.Class1\` is generated by more than one managed type. Please change the \[Register\] attribute so that the same Java type is not emitted. -+ [XA4216](xa4216.md): AndroidManifest.xml //uses-sdk/@android:minSdkVersion '{min_sdk?.Value}' is less than API-{XABuildConfig.NDKMinimumApiAvailable}, this configuration is not supported. ++ [XA4216](xa4216.md): The deployment target '19' is not supported (the minimum is '21'). Please increase the $(SupportedOSPlatformVersion) property value in your project file. + XA4217: Cannot override Kotlin-generated method '{method}' because it is not a valid Java method name. This method can only be overridden from Kotlin. + [XA4218](xa4218.md): Unable to find //manifest/application/uses-library at path: {path} + XA4219: Cannot find binding generator for language {language} or {defaultLanguage}. diff --git a/Documentation/guides/messages/xa1036.md b/Documentation/guides/messages/xa1036.md new file mode 100644 index 00000000000..d566ebafdbb --- /dev/null +++ b/Documentation/guides/messages/xa1036.md @@ -0,0 +1,27 @@ +--- +title: Xamarin.Android error XA1036 +description: XA1036 error code +ms.date: 5/22/2023 +--- +# Xamarin.Android error XA1036 + +## Example messages + +``` +error XA1036: AndroidManifest.xml //uses-sdk/@android:minSdkVersion '29' does not match the $(SupportedOSPlatformVersion) value '21' in the project file (if there is no $(SupportedOSPlatformVersion) value in the project file, then a default value has been assumed). +Either change the value in the AndroidManifest.xml to match the $(SupportedOSPlatformVersion) value, or remove the value in the AndroidManifest.xml (and add a $(SupportedOSPlatformVersion) value to the project file if it doesn't already exist). +``` + +## Issue + +This error indicates that you have a mismatch between the minSdkVersion +element set in your AndroidManifest.xml and the $(SupportedOSPlatformVersion) +property value in your project file. + + +## Solution + +Raise the value of `//uses-sdk/@android:minSdkVersion` in *AndroidManifest.xml* +to match the $(SupportedOSPlatformVersion), or remove `//uses-sdk/@android:minSdkVersion` +from *AndroidManifest.xml* and set $(SupportedOSPlatformVersion) in your project +file if it is unset. diff --git a/Documentation/guides/messages/xa4216.md b/Documentation/guides/messages/xa4216.md index 32c28b67048..bae557715fb 100644 --- a/Documentation/guides/messages/xa4216.md +++ b/Documentation/guides/messages/xa4216.md @@ -1,23 +1,39 @@ --- -title: Xamarin.Android warning XA4216 -description: XA4216 warning code +title: Xamarin.Android error XA4216 +description: XA4216 error code ms.date: 02/07/2019 --- -# Xamarin.Android warning XA4216 +# Xamarin.Android error XA4216 ## Example messages ``` -warning XA4216: AndroidManifest.xml //uses-sdk/@android:minSdkVersion '15' is less than API-16, this configuration is not supported. +error XA4216: The deployment target '19' is not supported (the minimum is '21'). Please increase the $(SupportedOSPlatformVersion) property value in your project file. +``` + +``` +error XA4216: The deployment target '19' is not supported (the minimum is '21'). Please increase (or remove) the //uses-sdk/@android:minSdkVersion value in your AndroidManifest.xml. +``` + +``` +warning XA4216: AndroidManifest.xml //uses-sdk/@android:targetSdkVersion '19' is less than API-21, this configuration is not supported. ``` ## Issue -This warning indicates your application is targeting an API level that -Xamarin.Android does not support. +This error or warning indicates your application is targeting an unsupported API level. ## Solution -Raise the value of `//uses-sdk/@android:minSdkVersion` or -`//uses-sdk/@android:targetSdkVersion` in *AndroidManifest.xml* to a -higher API level that is supported. +Edit your csproj and increase the '$(SupportedOSPlatformVersion)' +property value to something greater than or equal to the minimum supported version. + +or + +Edit your AndroidManifest.xml and remove `//uses-sdk/@android:minSdkVersion`, +or increase it to something greater than or equal to the minimum supported version. + +or + +Edit your AndroidManifest.xml and remove `//uses-sdk/@android:targetSdkVersion`, +or increase it to something greater than or equal to the minimum supported version. diff --git a/build-tools/scripts/NDKVersionInfo.targets b/build-tools/scripts/NDKVersionInfo.targets deleted file mode 100644 index 8cdccd8b95f..00000000000 --- a/build-tools/scripts/NDKVersionInfo.targets +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - diff --git a/build-tools/scripts/XABuildConfig.cs.in b/build-tools/scripts/XABuildConfig.cs.in index dcd82345540..1dc9f717dc7 100644 --- a/build-tools/scripts/XABuildConfig.cs.in +++ b/build-tools/scripts/XABuildConfig.cs.in @@ -11,7 +11,7 @@ namespace Xamarin.Android.Tools public const string XamarinAndroidVersion = "@XAMARIN_ANDROID_VERSION@"; public const string XamarinAndroidCommitHash = "@XAMARIN_ANDROID_COMMIT_HASH@"; public const string XamarinAndroidBranch = "@XAMARIN_ANDROID_BRANCH@"; - public const int NDKMinimumApiAvailable = @NDK_MINIMUM_API_AVAILABLE@; + public const int AndroidMinimumDotNetApiLevel = @ANDROID_DEFAULT_MINIMUM_DOTNET_API_LEVEL@; public const int AndroidLatestStableApiLevel = @ANDROID_LATEST_STABLE_API_LEVEL@; public const int AndroidLatestUnstableApiLevel = @ANDROID_LATEST_UNSTABLE_API_LEVEL@; public const int AndroidDefaultTargetDotnetApiLevel = @ANDROID_DEFAULT_TARGET_DOTNET_API_LEVEL@; diff --git a/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs b/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs index 50768d4a6a4..a4df4d587f1 100644 --- a/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs +++ b/build-tools/xaprepare/xaprepare/Application/KnownProperties.cs @@ -5,6 +5,7 @@ static class KnownProperties public const string AndroidCmakeUrlPrefix = "AndroidCmakeUrlPrefix"; public const string AndroidCmakeVersion = "AndroidCmakeVersion"; public const string AndroidCmakeVersionPath = "AndroidCmakeVersionPath"; + public const string AndroidMinimumDotNetApiLevel = "AndroidMinimumDotNetApiLevel"; public const string AndroidDefaultTargetDotnetApiLevel = "AndroidDefaultTargetDotnetApiLevel"; public const string AndroidLatestStableApiLevel = "AndroidLatestStableApiLevel"; public const string AndroidLatestUnstableApiLevel = "AndroidLatestUnstableApiLevel"; diff --git a/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in b/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in index 486b859d669..4f461e18369 100644 --- a/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in +++ b/build-tools/xaprepare/xaprepare/Application/Properties.Defaults.cs.in @@ -9,6 +9,7 @@ namespace Xamarin.Android.Prepare properties.Add (KnownProperties.AndroidCmakeUrlPrefix, StripQuotes ("@AndroidCmakeUrlPrefix@")); properties.Add (KnownProperties.AndroidCmakeVersion, StripQuotes ("@AndroidCmakeVersion@")); properties.Add (KnownProperties.AndroidCmakeVersionPath, StripQuotes (@"@AndroidCmakeVersionPath@")); + properties.Add (KnownProperties.AndroidMinimumDotNetApiLevel, StripQuotes ("@AndroidMinimumDotNetApiLevel@")); properties.Add (KnownProperties.AndroidDefaultTargetDotnetApiLevel, StripQuotes ("@AndroidDefaultTargetDotnetApiLevel@")); properties.Add (KnownProperties.AndroidLatestStableApiLevel, StripQuotes ("@AndroidLatestStableApiLevel@")); properties.Add (KnownProperties.AndroidLatestUnstableApiLevel, StripQuotes ("@AndroidLatestUnstableApiLevel@")); diff --git a/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs b/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs index 07684b87ff9..6fe698f44ea 100644 --- a/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs +++ b/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs @@ -168,7 +168,6 @@ GeneratedFile Get_XABuildConfig_cs (Context context) var replacements = new Dictionary (StringComparer.Ordinal) { { "@NDK_REVISION@", context.BuildInfo.NDKRevision }, { "@NDK_RELEASE@", BuildAndroidPlatforms.AndroidNdkVersion }, - { "@NDK_MINIMUM_API_AVAILABLE@", context.BuildInfo.NDKMinimumApiAvailable }, { "@NDK_VERSION_MAJOR@", context.BuildInfo.NDKVersionMajor }, { "@NDK_VERSION_MINOR@", context.BuildInfo.NDKVersionMinor }, { "@NDK_VERSION_MICRO@", context.BuildInfo.NDKVersionMicro }, @@ -177,6 +176,7 @@ GeneratedFile Get_XABuildConfig_cs (Context context) { "@NDK_X86_API@", BuildAndroidPlatforms.NdkMinimumAPILegacy32.ToString ().ToString () }, { "@NDK_X86_64_API@", BuildAndroidPlatforms.NdkMinimumAPI.ToString ().ToString () }, { "@XA_SUPPORTED_ABIS@", context.Properties.GetRequiredValue (KnownProperties.AndroidSupportedTargetJitAbis).Replace (':', ';') }, + { "@ANDROID_DEFAULT_MINIMUM_DOTNET_API_LEVEL@", context.Properties.GetRequiredValue (KnownProperties.AndroidMinimumDotNetApiLevel) }, { "@ANDROID_DEFAULT_TARGET_DOTNET_API_LEVEL@", context.Properties.GetRequiredValue (KnownProperties.AndroidDefaultTargetDotnetApiLevel) }, { "@ANDROID_LATEST_STABLE_API_LEVEL@", context.Properties.GetRequiredValue (KnownProperties.AndroidLatestStableApiLevel) }, { "@ANDROID_LATEST_UNSTABLE_API_LEVEL@", context.Properties.GetRequiredValue (KnownProperties.AndroidLatestUnstableApiLevel) }, diff --git a/build-tools/xaprepare/xaprepare/xaprepare.targets b/build-tools/xaprepare/xaprepare/xaprepare.targets index 37ecd5712bf..3ba0ccfd582 100644 --- a/build-tools/xaprepare/xaprepare/xaprepare.targets +++ b/build-tools/xaprepare/xaprepare/xaprepare.targets @@ -43,6 +43,7 @@ + diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets index 7767b0e23c8..0221899748f 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets @@ -25,6 +25,9 @@ --> <_GetChildProjectCopyToPublishDirectoryItems>false true + + + $(AndroidMinimumSupportedApiLevel) $(SupportedOSPlatformVersion).0 diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs b/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs index a086eaa35f3..a5f6eb2399f 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs @@ -945,7 +945,7 @@ public static string XA4215_Details { } /// - /// Looks up a localized string similar to AndroidManifest.xml //uses-sdk/@android:minSdkVersion '{0}' is less than API-{1}, this configuration is not supported.. + /// Looks up a localized string similar to The deployment target '{1}' is not supported (the minimum is '{2}'). Please increase (or remove) the //uses-sdk/@android:minSdkVersion value in your AndroidManifest.xml.. /// public static string XA4216_MinSdkVersion { get { @@ -953,6 +953,15 @@ public static string XA4216_MinSdkVersion { } } + /// + /// Looks up a localized string similar to The deployment target '{1}' is not supported (the minimum is '{2}'). Please increase the $(SupportedOSPlatformVersion) property value in your project file.. + /// + public static string XA4216_SupportedOSPlatformVersion { + get { + return ResourceManager.GetString("XA4216_SupportedOSPlatformVersion", resourceCulture); + } + } + /// /// Looks up a localized string similar to AndroidManifest.xml //uses-sdk/@android:targetSdkVersion '{0}' is less than API-{1}, this configuration is not supported.. /// @@ -1485,5 +1494,15 @@ public static string XA1034 { return ResourceManager.GetString("XA1034", resourceCulture); } } + + /// + /// Looks up a localized string similar to AndroidManifest.xml //uses-sdk/@android:minSdkVersion '{0}' does not match the $(SupportedOSPlatformVersion) value '{1}' in the project file (if there is no $(SupportedOSPlatformVersion) value in the project file, then a default value has been assumed). + ///Either change the value in the AndroidManifest.xml to match the $(SupportedOSPlatformVersion) value, or remove the value in the AndroidManifest.xml (and add a $(SupportedOSPlatformVersion) value to the project file if it doesn't already exist).. + /// + public static string XA1036 { + get { + return ResourceManager.GetString("XA1036", resourceCulture); + } + } } } diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx index cdda2379449..768256ab6e6 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx @@ -497,6 +497,13 @@ Please change the value to an assembly-qualifed type name which inherits from '{ The 'BundleAssemblies' property is deprecated and it has no effect on the application build. Equivalent functionality is implemented by the 'AndroidUseAssemblyStore' and 'AndroidEnableAssemblyCompression' properties. The following are literal names and should not be translated: 'BundleAssemblies', 'AndroidUseAssemblyStore', 'AndroidEnableAssemblyCompression' + + AndroidManifest.xml //uses-sdk/@android:minSdkVersion '{0}' does not match the $(SupportedOSPlatformVersion) value '{1}' in the project file (if there is no $(SupportedOSPlatformVersion) value in the project file, then a default value has been assumed). +Either change the value in the AndroidManifest.xml to match the $(SupportedOSPlatformVersion) value, or remove the value in the AndroidManifest.xml (and add a $(SupportedOSPlatformVersion) value to the project file if it doesn't already exist). + The following are literal names and should not be translated: AndroidManifest.xml, //uses-sdk/@android:minSdkVersion, $(SupportedOSPlatformVersion) +{0} - The minimum SDK version number +{1} - The SupportedOSPlatformVersion property value + Use of AppDomain.CreateDomain() detected in assembly: {0}. .NET 6 and higher will only support a single AppDomain, so this API will no longer be available in Xamarin.Android once .NET 6 is released. The following are literal names and should not be translated: AppDomain.CreateDomain(), AppDomain @@ -607,12 +614,18 @@ Please change the value to an assembly-qualifed type name which inherits from '{ The two spaces indentation at the beginning of this message should be preserved in the translations where possible. {0} - The generated Java type name {1} - The managed type name + + + The deployment target '{0}' is not supported (the minimum is '{1}'). Please increase the $(SupportedOSPlatformVersion) property value in your project file. + The following are literal names and should not be translated: Microsoft.Android, $(SupportedOSPlatformVersion) +{0} - The value of $(SupportedOSPlatformVersion) +{1} - The minimum $(SupportedOSPlatformVersion) supported by this version of the SDK - AndroidManifest.xml //uses-sdk/@android:minSdkVersion '{0}' is less than API-{1}, this configuration is not supported. - The following are literal names and should not be translated: AndroidManifest.xml, //uses-sdk/@android:minSdkVersion, API-{1} -{0} - The minimum SDK version number -{1} - The API version number + The deployment target '{0}' is not supported (the minimum is '{1}'). Please increase (or remove) the //uses-sdk/@android:minSdkVersion value in your AndroidManifest.xml. + The following are literal names and should not be translated: Microsoft.Android, //uses-sdk/@android:minSdkVersion, AndroidManifest.xml +{0} - The value of //uses-sdk/@android:minSdkVersion +{1} - The minimum $(SupportedOSPlatformVersion) supported by this version of the SDK AndroidManifest.xml //uses-sdk/@android:targetSdkVersion '{0}' is less than API-{1}, this configuration is not supported. diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs index e1c36a308d8..69584ae7893 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs @@ -329,12 +329,6 @@ void Run (DirectoryAssemblyResolver res, bool useMarshalMethods) Log.LogCodedError ("XA4215", Properties.Resources.XA4215_Details, kvp.Key, typeName); } - // NOTE: $(SupportedOSPlatformVersion) will potentially be 21.0 - string minSdkVersion = null; - if (Version.TryParse (SupportedOSPlatformVersion, out var version)) { - minSdkVersion = version.Major.ToString (); - } - // Step 3 - Merge [Activity] and friends into AndroidManifest.xml var manifest = new ManifestDocument (ManifestTemplate) { PackageName = PackageName, @@ -344,7 +338,7 @@ void Run (DirectoryAssemblyResolver res, bool useMarshalMethods) Resolver = res, SdkDir = AndroidSdkDir, TargetSdkVersion = AndroidSdkPlatform, - MinSdkVersion = minSdkVersion, + MinSdkVersion = MonoAndroidHelper.ConvertSupportedOSPlatformVersionToApiLevel (SupportedOSPlatformVersion).ToString (), Debug = Debug, MultiDex = MultiDex, NeedsInternet = NeedsInternet, diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs index 2757d54b138..171913f78e3 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs @@ -25,6 +25,8 @@ public class GetJavaPlatformJar : AndroidTask public bool DesignTimeBuild { get; set; } + public string SupportedOSPlatformVersion { get; set; } + [Output] public string JavaPlatformJarPath { get; set; } @@ -37,6 +39,11 @@ public override bool RunTask () XAttribute target_sdk = null; + int supportedOsPlatformVersionAsInt = MonoAndroidHelper.ConvertSupportedOSPlatformVersionToApiLevel (SupportedOSPlatformVersion); + if (supportedOsPlatformVersionAsInt < XABuildConfig.AndroidMinimumDotNetApiLevel) { + Log.LogCodedError ("XA4216", Properties.Resources.XA4216_SupportedOSPlatformVersion, supportedOsPlatformVersionAsInt, XABuildConfig.AndroidMinimumDotNetApiLevel); + } + // Look for targetSdkVersion in the user's AndroidManifest.xml if (!string.IsNullOrWhiteSpace (AndroidManifest)) { if (!File.Exists (AndroidManifest)) { @@ -58,22 +65,24 @@ public override bool RunTask () platform = target_sdk.Value; var min_sdk = uses_sdk.Attribute (androidNs + "minSdkVersion"); - if (min_sdk != null && (!int.TryParse (min_sdk.Value, out int minSdkVersion) || minSdkVersion < XABuildConfig.NDKMinimumApiAvailable)) { - Log.LogWarningForXmlNode ( - code: "XA4216", - file: AndroidManifest, - node: min_sdk, - message: Properties.Resources.XA4216_MinSdkVersion, - messageArgs: new object [] { min_sdk?.Value, XABuildConfig.NDKMinimumApiAvailable } - ); + if (min_sdk != null) { + var failedToParseMinSdk = !int.TryParse (min_sdk.Value, out int minSdkVersion); + + if (failedToParseMinSdk || minSdkVersion < XABuildConfig.AndroidMinimumDotNetApiLevel) { + Log.LogCodedError ("XA4216", Properties.Resources.XA4216_MinSdkVersion, min_sdk?.Value, XABuildConfig.AndroidMinimumDotNetApiLevel); + } + + if (failedToParseMinSdk || minSdkVersion != supportedOsPlatformVersionAsInt) { + Log.LogCodedError ("XA1036", Properties.Resources.XA1036, min_sdk?.Value, SupportedOSPlatformVersion); + } } - if (target_sdk != null && (!int.TryParse (target_sdk.Value, out int targetSdkVersion) || targetSdkVersion < XABuildConfig.NDKMinimumApiAvailable)) { + if (target_sdk != null && (!int.TryParse (target_sdk.Value, out int targetSdkVersion) || targetSdkVersion < XABuildConfig.AndroidMinimumDotNetApiLevel)) { Log.LogWarningForXmlNode ( code: "XA4216", file: AndroidManifest, node: target_sdk, message: Properties.Resources.XA4216_TargetSdkVersion, - messageArgs: new object [] { target_sdk?.Value, XABuildConfig.NDKMinimumApiAvailable } + messageArgs: new object [] { target_sdk?.Value, XABuildConfig.AndroidMinimumDotNetApiLevel } ); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs index 48ea5d3d6f4..db875ef9278 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs @@ -154,7 +154,7 @@ public void BuildAotApplicationWithNdkAndBundleAndÜmläüts (string supportedAb // Set //uses-sdk/@android:minSdkVersion so that LLVM uses the right libc.so proj.AndroidManifest = $@" - + "; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index 0502d83076d..d87c9421df4 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -1747,27 +1747,6 @@ public void BuildOutsideVisualStudio () } } - [Test] - public void WarningForMinSdkVersion () - { - int minSdkVersion = XABuildConfig.NDKMinimumApiAvailable; - int tooLowSdkVersion = minSdkVersion - 1; - var proj = new XamarinAndroidApplicationProject { - MinSdkVersion = tooLowSdkVersion.ToString (), - TargetSdkVersion = null, - }; - using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { - Assert.IsTrue (b.Build (proj), "Build should have succeeded."); - Assert.IsTrue ( - StringAssertEx.ContainsText ( - b.LastBuildOutput, - $"warning XA4216: AndroidManifest.xml //uses-sdk/@android:minSdkVersion '{tooLowSdkVersion}' is less than API-{minSdkVersion}, this configuration is not supported." - ), - $"Should receive a warning when //uses-sdk/@android:minSdkVersion=\"{tooLowSdkVersion}\"" - ); - } - } - [Test] public void RemoveOldMonoPackageManager () { @@ -2313,7 +2292,7 @@ public class MainActivity : Activity if (int.TryParse (apiLevel, out int a) && a < maxApiLevel) disabledIssues += ",OldTargetApi"; proj.SetProperty ("AndroidLintDisabledIssues", disabledIssues); - proj.MinSdkVersion = "24"; + proj.SupportedOSPlatformVersion = "24"; proj.TargetSdkVersion = apiLevel; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); StringAssertEx.DoesNotContain ("XA0102", b.LastBuildOutput, "Output should not contain any XA0102 warnings"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs index 06858a6e456..1569d1bdcb0 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs @@ -1171,17 +1171,6 @@ XamarinAndroidApplicationProject CreateMultiDexRequiredApplication (string debug return proj; } - [Test] - [Category ("Minor")] - public void BuildApplicationOver65536Methods () - { - var proj = CreateMultiDexRequiredApplication (); - using (var b = CreateApkBuilder ()) { - b.ThrowOnBuildFailure = false; - Assert.IsFalse (b.Build (proj), "Without MultiDex option, build should fail"); - } - } - [Test] public void CreateMultiDexWithSpacesInConfig () { @@ -1213,11 +1202,12 @@ public void BuildMultiDexApplication () Assert.IsTrue (b.Build (proj), "Build should have succeeded."); Assert.IsTrue (File.Exists (Path.Combine (Root, b.ProjectDirectory, intermediateDir, "android/bin/classes.dex")), "multidex-ed classes.zip exists"); - var multidexKeepPath = Path.Combine (Root, b.ProjectDirectory, intermediateDir, "multidex.keep"); - Assert.IsTrue (File.Exists (multidexKeepPath), "multidex.keep exists"); - Assert.IsTrue (File.ReadAllLines (multidexKeepPath).Length > 1, "multidex.keep must contain more than one line."); - if (!Builder.UseDotNet) + if (!Builder.UseDotNet) { + var multidexKeepPath = Path.Combine (Root, b.ProjectDirectory, intermediateDir, "multidex.keep"); + Assert.IsTrue (File.Exists (multidexKeepPath), "multidex.keep exists"); + Assert.IsTrue (File.ReadAllLines (multidexKeepPath).Length > 1, "multidex.keep must contain more than one line."); Assert.IsTrue (b.LastBuildOutput.ContainsText (Path.Combine (proj.TargetFrameworkVersion, "mono.android.jar")), proj.TargetFrameworkVersion + "/mono.android.jar should be used."); + } Assert.IsFalse (b.LastBuildOutput.ContainsText ("Duplicate zip entry"), "Should not get warning about [META-INF/MANIFEST.MF]"); } } @@ -1236,13 +1226,11 @@ public void BuildAfterMultiDexIsNotRequired () Assert.IsTrue (b.Build (proj), "Build should have succeeded."); FileAssert.Exists (Path.Combine (androidBinDir, "classes.dex")); FileAssert.Exists (Path.Combine (androidBinDir, "classes2.dex")); - FileAssert.Exists (Path.Combine (androidBinDir, "classes3.dex")); using (var zip = ZipHelper.OpenZip (apkPath)) { var entries = zip.Select (e => e.FullName).ToList (); Assert.IsTrue (entries.Contains ("classes.dex"), "APK must contain `classes.dex`."); Assert.IsTrue (entries.Contains ("classes2.dex"), "APK must contain `classes2.dex`."); - Assert.IsTrue (entries.Contains ("classes3.dex"), "APK must contain `classes3.dex`."); } //Now build project again after it no longer requires multidex, remove the *HUGE* AndroidJavaSource build items @@ -1259,44 +1247,6 @@ public void BuildAfterMultiDexIsNotRequired () var entries = zip.Select (e => e.FullName).ToList (); Assert.IsTrue (entries.Contains ("classes.dex"), "APK must contain `classes.dex`."); Assert.IsFalse (entries.Contains ("classes2.dex"), "APK must *not* contain `classes2.dex`."); - Assert.IsFalse (entries.Contains ("classes3.dex"), "APK must *not* contain `classes3.dex`."); - } - } - } - - [Test] - public void MultiDexCustomMainDexFileList ([Values ("19", "21")] string minSdkVersion) - { - var expected = new [] { - "android/support/multidex/ZipUtil$CentralDirectory.class", - "android/support/multidex/MultiDexApplication.class", - "android/support/multidex/MultiDex$V19.class", - "android/support/multidex/ZipUtil.class", - "android/support/multidex/MultiDexExtractor$1.class", - "android/support/multidex/MultiDexExtractor.class", - "android/support/multidex/MultiDex.class", - "MyTest.class", - }; - var proj = CreateMultiDexRequiredApplication (); - proj.MinSdkVersion = minSdkVersion; - proj.TargetSdkVersion = null; - proj.SetProperty ("AndroidEnableMultiDex", "True"); - proj.OtherBuildItems.Add (new BuildItem ("MultiDexMainDexList", "mymultidex.keep") { TextContent = () => "MyTest.class", Encoding = Encoding.ASCII }); - proj.OtherBuildItems.Add (new BuildItem ("AndroidJavaSource", "MyTest.java") { TextContent = () => "public class MyTest {}", Encoding = Encoding.ASCII }); - using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { - Assert.IsTrue (b.Build (proj), "build should succeed. Run will fail."); - string androidBinDir = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "bin"); - Assert.IsTrue (b.Build (proj), "Build should have succeeded."); - FileAssert.Exists (Path.Combine (androidBinDir, "classes.dex")); - FileAssert.Exists (Path.Combine (androidBinDir, "classes2.dex")); - if (minSdkVersion == "21") { - //NOTE: d8/r8 does not support custom dex list files in this case - return; - } - //NOTE: d8 has the list in a different order, so we should do an unordered comparison - var actual = File.ReadAllLines (Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "multidex.keep")); - foreach (var item in expected) { - Assert.IsTrue (actual.Contains (item), $"multidex.keep did not contain `{item}`"); } } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs index 4559fada920..7642eeabe6b 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs @@ -8,6 +8,8 @@ using System.Xml.XPath; using Xamarin.Tools.Zip; using System.Collections.Generic; +using Xamarin.Android.Tasks; +using Xamarin.Android.Tools; namespace Xamarin.Android.Build.Tests { @@ -439,7 +441,7 @@ public void DirectBootAwareAttribute () /* pattern */ "{abi}{minSDK:00}{versionCode:000}", /* props */ null, /* shouldBuild */ true, - /* expected */ "219012;319012", + /* expected */ "221012;321012", }, new object[] { /* seperateApk */ true, @@ -449,7 +451,7 @@ public void DirectBootAwareAttribute () /* pattern */ "{abi}{minSDK:00}{screen}{versionCode:000}", /* props */ "screen=24", /* shouldBuild */ true, - /* expected */ "21924012;31924012", + /* expected */ "22124012;32124012", }, new object[] { /* seperateApk */ true, @@ -459,7 +461,7 @@ public void DirectBootAwareAttribute () /* pattern */ "{abi}{minSDK:00}{screen}{foo:0}{versionCode:000}", /* props */ "screen=24;foo=$(Foo)", /* shouldBuild */ true, - /* expected */ "219241012;319241012", + /* expected */ "221241012;321241012", }, new object[] { /* seperateApk */ true, @@ -469,7 +471,7 @@ public void DirectBootAwareAttribute () /* pattern */ "{abi}{minSDK:00}{screen}{foo:00}{versionCode:000}", /* props */ "screen=24;foo=$(Foo)", /* shouldBuild */ false, - /* expected */ "2192401012;3192401012", + /* expected */ "2212401012;3212401012", }, }; @@ -479,7 +481,8 @@ public void VersionCodeTests (bool seperateApk, string abis, string versionCode, { var proj = new XamarinAndroidApplicationProject () { IsRelease = true, - MinSdkVersion = null, + MinSdkVersion = "21", + SupportedOSPlatformVersion = "21.0", }; proj.SetProperty ("Foo", "1"); proj.SetProperty ("GenerateApplicationManifest", "false"); // Disable $(AndroidVersionCode) support @@ -964,5 +967,149 @@ public void ExportedErrorMessage () Assert.IsTrue (b.LastBuildOutput.ContainsText ($"AndroidManifest.xml(12,5): java{extension} error AMM0000:"), "Should recieve AMM0000 error"); Assert.IsTrue (b.LastBuildOutput.ContainsText ("Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported`"), "Should recieve AMM0000 error"); } + + static object [] SupportedOSTestSources = new object [] { + new object[] { + /* minSdkVersion */ "", + /* removeUsesSdk */ true, + }, + new object[] { + /* minSdkVersion */ "", + /* removeUsesSdk */ false, + }, + new object[] { + /* minSdkVersion */ "21.0", + /* removeUsesSdk */ true, + }, + new object[] { + /* minSdkVersion */ "31", + /* removeUsesSdk */ false, + }, + new object[] { + /* minSdkVersion */ $"{XABuildConfig.AndroidDefaultTargetDotnetApiLevel}.0", + /* removeUsesSdk */ false, + }, + }; + [Test] + [TestCaseSource(nameof (SupportedOSTestSources))] + public void SupportedOSPlatformVersion (string minSdkVersion, bool removeUsesSdkElement) + { + var proj = new XamarinAndroidApplicationProject { + EnableDefaultItems = true, + SupportedOSPlatformVersion = minSdkVersion, + }; + + // An empty SupportedOSPlatformVersion property will default to AndroidMinimumDotNetApiLevel + if (string.IsNullOrEmpty (minSdkVersion)) { + minSdkVersion = XABuildConfig.AndroidMinimumDotNetApiLevel.ToString (); + } + + if (removeUsesSdkElement) { + proj.AndroidManifest = $@" + + + +"; + } + + // Call AccessibilityTraversalAfter from API level 22 + // https://developer.android.com/reference/android/view/View#getAccessibilityTraversalAfter() + proj.MainActivity = proj.DefaultMainActivity.Replace ("button!.Click", "button!.AccessibilityTraversalAfter.ToString ();\nbutton!.Click"); + + var builder = CreateApkBuilder (); + Assert.IsTrue (builder.Build (proj), "`dotnet build` should succeed"); + + var minSdkVersionInt = MonoAndroidHelper.ConvertSupportedOSPlatformVersionToApiLevel (minSdkVersion); + if (minSdkVersionInt < 22) { + StringAssertEx.Contains ("warning CA1416", builder.LastBuildOutput, "Should get warning about Android 22 API"); + } else { + builder.AssertHasNoWarnings (); + } + + var manifestPath = Path.Combine (Root, builder.ProjectDirectory, proj.IntermediateOutputPath, "android", "AndroidManifest.xml"); + FileAssert.Exists (manifestPath); + var manifest = XDocument.Load (manifestPath); + XNamespace ns = "http://schemas.android.com/apk/res/android"; + Assert.AreEqual (minSdkVersionInt.ToString (), manifest.Root.Element ("uses-sdk").Attribute (ns + "minSdkVersion").Value); + } + + static object [] SupportedOSErrorsTestSources = new object [] { + new object[] { + /* minSdkVersion */ "", + /* supportedOSPlatVers */ "", + }, + new object[] { + /* minSdkVersion */ "19", + /* supportedOSPlatVers */ "", + }, + new object[] { + /* minSdkVersion */ $"{XABuildConfig.AndroidDefaultTargetDotnetApiLevel}", + /* supportedOSPlatVers */ "", + }, + new object[] { + /* minSdkVersion */ "", + /* supportedOSPlatVers */ "19.0", + }, + new object[] { + /* minSdkVersion */ "19", + /* supportedOSPlatVers */ "19", + }, + new object[] { + /* minSdkVersion */ "29", + /* supportedOSPlatVers */ $"{XABuildConfig.AndroidDefaultTargetDotnetApiLevel}.0", + }, + }; + [Test] + [TestCaseSource(nameof (SupportedOSErrorsTestSources))] + public void SupportedOSPlatformVersionErrors (string minSdkVersion, string supportedOSPlatVers) + { + var proj = new XamarinAndroidApplicationProject { + EnableDefaultItems = true, + MinSdkVersion = minSdkVersion, + SupportedOSPlatformVersion = supportedOSPlatVers, + }; + + // Mismatch error can only occur when minSdkVersion is set in the manifest + bool wasMinSdkVersionEmpty = false; + + // Empty values will default to AndroidMinimumDotNetApiLevel + int minDotnetApiLevel = XABuildConfig.AndroidMinimumDotNetApiLevel; + if (string.IsNullOrEmpty (minSdkVersion)) { + wasMinSdkVersionEmpty = true; + minSdkVersion = minDotnetApiLevel.ToString (); + } + if (string.IsNullOrEmpty (supportedOSPlatVers)) { + supportedOSPlatVers = minDotnetApiLevel.ToString (); + } + var minSdkVersionInt = MonoAndroidHelper.ConvertSupportedOSPlatformVersionToApiLevel (minSdkVersion); + var supportedOSPlatVersInt = MonoAndroidHelper.ConvertSupportedOSPlatformVersionToApiLevel (supportedOSPlatVers); + var builder = CreateApkBuilder (); + builder.ThrowOnBuildFailure = false; + var buildResult = builder.Build (proj); + + if (supportedOSPlatVersInt < minDotnetApiLevel) { + Assert.IsFalse (buildResult, "SupportedOSPlatformVersion version too low, build should fail."); + StringAssertEx.Contains ("error XA4216", builder.LastBuildOutput, "Should get error XA4216."); + StringAssertEx.Contains ("Please increase the $(SupportedOSPlatformVersion) property value in your project file", + builder.LastBuildOutput, "Should get error about SupportedOSPlatformVersion being too low."); + } + + if (minSdkVersionInt < minDotnetApiLevel ) { + Assert.IsFalse (buildResult, "minSdkVersion too low, build should fail."); + StringAssertEx.Contains ("error XA4216", builder.LastBuildOutput, "Should get error XA4216."); + StringAssertEx.Contains ("Please increase (or remove) the //uses-sdk/@android:minSdkVersion value in your AndroidManifest.xml", + builder.LastBuildOutput, "Should get error about minSdkVersion being too low."); + } + + if (minSdkVersionInt != supportedOSPlatVersInt && !wasMinSdkVersionEmpty) { + Assert.IsFalse (buildResult, $"Min version mismatch {minSdkVersionInt} != {supportedOSPlatVersInt}, build should fail."); + StringAssertEx.Contains ("error XA1036", builder.LastBuildOutput, "Should get error about min version mismatch."); + } + + if (minSdkVersionInt == supportedOSPlatVersInt && minSdkVersionInt >= minDotnetApiLevel && supportedOSPlatVersInt >= minDotnetApiLevel) { + Assert.IsTrue (buildResult, "compatible min versions, build should succeed"); + } + } + } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs index e4f349982f7..cd353e5001d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs @@ -1007,7 +1007,7 @@ public void ExtractNativeLibsTrue () { var proj = new XamarinAndroidApplicationProject { // This combination produces android:extractNativeLibs="false" by default - MinSdkVersion = "23", + SupportedOSPlatformVersion = "23", ManifestMerger = "manifestmerger.jar", }; using (var b = CreateApkBuilder ()) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/GetDependenciesTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/GetDependenciesTests.cs index 707e8b9bc0b..c9454b6564c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/GetDependenciesTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/GetDependenciesTests.cs @@ -103,7 +103,7 @@ public void ManifestFileExists () var manifestFile = Path.Combine (path, "AndroidManifest.xml"); File.WriteAllText (manifestFile, @" - + "); task.PlatformToolsVersion = "26.0.3"; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs index 2840c248451..9ba397c83ae 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs @@ -808,36 +808,6 @@ public void DotNetBuild (string runtimeIdentifiers, bool isRelease, bool aot, bo } } - - // TODO: - // Causes warning: D8 : warning : An API level of 32 is not supported by this compiler. Please use an API level of 31 or earlier - // Add a 32 parameter here when we get a newer version of r8. - [Test] - public void SupportedOSPlatformVersion ([Values (21, 31)] int minSdkVersion) - { - var proj = new XASdkProject { - SupportedOSPlatformVersion = minSdkVersion.ToString (), - }; - // Call AccessibilityTraversalAfter from API level 22 - // https://developer.android.com/reference/android/view/View#getAccessibilityTraversalAfter() - proj.MainActivity = proj.DefaultMainActivity.Replace ("button!.Click", "button!.AccessibilityTraversalAfter.ToString ();\nbutton!.Click"); - - var dotnet = CreateDotNetBuilder (proj); - Assert.IsTrue (dotnet.Build (), "`dotnet build` should succeed"); - - if (minSdkVersion < 22) { - StringAssertEx.Contains ("warning CA1416", dotnet.LastBuildOutput, "Should get warning about Android 22 API"); - } else { - dotnet.AssertHasNoWarnings (); - } - - var manifestPath = Path.Combine (FullProjectDirectory, proj.IntermediateOutputPath, "android", "AndroidManifest.xml"); - FileAssert.Exists (manifestPath); - var manifest = XDocument.Load (manifestPath); - XNamespace ns = "http://schemas.android.com/apk/res/android"; - Assert.AreEqual (minSdkVersion.ToString (), manifest.Root.Element ("uses-sdk").Attribute (ns + "minSdkVersion").Value); - } - [Test] public void DotNetBuildXamarinForms ([Values (true, false)] bool useInterpreter) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs index ec5b58011bf..6bdab872fd3 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XASdkProject.cs @@ -79,8 +79,6 @@ public XASdkProject (string outputType = "Exe", [CallerMemberName] string packag Sources.Add (new BuildItem.Source ($"Resources\\Resource.designer{Language.DefaultExtension}") { TextContent = () => string.Empty }); } - protected override bool UseDotNet => true; - public string OutputPath => Path.Combine ("bin", Configuration, TargetFramework.ToLowerInvariant ()); public string IntermediateOutputPath => Path.Combine ("obj", Configuration, TargetFramework.ToLowerInvariant ()); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs index 1feaf5e2d8e..63ecc5231f1 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs @@ -46,6 +46,7 @@ public XamarinAndroidApplicationProject (string debugConfigurationName = "Debug" SetProperty (KnownProperties.ImplicitUsings, "enable"); SetProperty ("XamarinAndroidSupportSkipVerifyVersions", "True"); SetProperty ("_FastDeploymentDiagnosticLogging", "True"); + SupportedOSPlatformVersion = "21.0"; // Workaround for AndroidX, see: https://github.com/xamarin/AndroidSupportComponents/pull/239 Imports.Add (new Import (() => "Directory.Build.targets") { @@ -66,8 +67,8 @@ public XamarinAndroidApplicationProject (string debugConfigurationName = "Debug" SetProperty (ReleaseProperties, "AndroidLinkMode", "SdkOnly"); SetProperty (DebugProperties, KnownProperties.EmbedAssembliesIntoApk, "False", "'$(EmbedAssembliesIntoApk)' == ''"); SetProperty (ReleaseProperties, KnownProperties.EmbedAssembliesIntoApk, "True", "'$(EmbedAssembliesIntoApk)' == ''"); + MinSdkVersion = "19"; } - AndroidManifest = default_android_manifest; if (Builder.UseDotNet) { TargetSdkVersion = XABuildConfig.AndroidDefaultTargetDotnetApiLevel.ToString (); @@ -99,9 +100,17 @@ public virtual string DefaultMainActivity { public string TargetSdkVersion { get; set; } /// - /// Defaults to API 19 + /// Set this to add the `android:minSdkVersion` attribute to the AndroidManifest.xml file /// - public string MinSdkVersion { get; set; } = "19"; + public string MinSdkVersion { get; set; } + + /// + /// Defaults to 21.0 + /// + public string SupportedOSPlatformVersion { + get { return GetProperty (KnownProperties.SupportedOSPlatformVersion); } + set { SetProperty (KnownProperties.SupportedOSPlatformVersion, value); } + } string AotAssembliesPropertyName => Builder.UseDotNet ? KnownProperties.RunAOTCompilation : KnownProperties.AotAssemblies; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetStandard.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetStandard.cs index 7426e1d273d..e45acde512a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetStandard.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetStandard.cs @@ -30,10 +30,6 @@ public string PackageTargetFallback { get { return GetProperty ("PackageTargetFallback"); } set { SetProperty ("PackageTargetFallback", value); } } - public string TargetFramework { - get { return GetProperty ("TargetFramework"); } - set { SetProperty ("TargetFramework", value); } - } /// /// Projects targeting net7.0 require ref/runtime packs on NuGet.org or dotnet6/dotnet7 diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetXamarinProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetXamarinProject.cs index a6ef3a10b97..acf8296b71e 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetXamarinProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetXamarinProject.cs @@ -26,9 +26,9 @@ protected DotNetXamarinProject (string debugConfigurationName = "Debug", string SetProperty ("AssemblyName", () => AssemblyName ?? ProjectName); if (Builder.UseDotNet) { - SetProperty ("TargetFramework", "net8.0-android"); - SetProperty ("EnableDefaultItems", "false"); - SetProperty ("AppendTargetFrameworkToOutputPath", "false"); + TargetFramework = "net8.0-android"; + EnableDefaultItems = false; + AppendTargetFrameworkToOutputPath = false; } else { AddReferences ("System"); // default SetProperty ("Platform", "AnyCPU", "'$(Platform)' == ''"); @@ -77,7 +77,15 @@ public string IntermediateOutputPath { public string Sdk { get; set; } = "Microsoft.NET.Sdk"; - public bool EnableDefaultItems => false; + public bool EnableDefaultItems { + get { return string.Equals (GetProperty ("EnableDefaultItems"), "true", StringComparison.OrdinalIgnoreCase); } + set { SetProperty ("EnableDefaultItems", value.ToString ()); } + } + + public bool AppendTargetFrameworkToOutputPath { + get { return string.Equals (GetProperty ("AppendTargetFrameworkToOutputPath"), "true", StringComparison.OrdinalIgnoreCase); } + set { SetProperty ("AppendTargetFrameworkToOutputPath", value.ToString ()); } + } public void AddReferences (params string [] references) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinProject.cs index 14b6a7d7783..e274ef9f638 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/XamarinProject.cs @@ -88,7 +88,7 @@ public XamarinProject (string debugConfigurationName = "Debug", string releaseCo Packages = new List (); Imports = new List (); - if (UseDotNet) { + if (Builder.UseDotNet) { //NOTE: for SDK-style projects, we need $(Configuration) set before Microsoft.NET.Sdk.targets Imports.Add (new Import ("Directory.Build.props") { TextContent = () => @@ -114,7 +114,10 @@ public void AddReference (XamarinProject other, string include = null) References.Add (new BuildItem.ProjectReference (include, other.ProjectName, other.ProjectGuid)); } - protected virtual bool UseDotNet => Builder.UseDotNet; + public string TargetFramework { + get { return GetProperty ("TargetFramework"); } + set { SetProperty ("TargetFramework", value); } + } public string GetProperty (string name) { diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs index 3f648c5cfcb..05de2bd0c86 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs @@ -117,14 +117,19 @@ public string VersionCode { public bool HasVersionCode => doc.Root.Attribute (versionCodeAttributeName) != null; + // If MinSdkVersionName can't be parsed, set it to XABuildConfig.AndroidMinimumDotNetApiLevel + string TryParseMinSdkVersionName () + { + int minSdkVersion; + if (!int.TryParse (MinSdkVersionName, out minSdkVersion)) + minSdkVersion = XABuildConfig.AndroidMinimumDotNetApiLevel; + return minSdkVersion.ToString (); + } + public string GetMinimumSdk () { - int defaultMinSdkVersion = MonoAndroidHelper.SupportedVersions.MinStableVersion.ApiLevel; var minAttr = doc.Root.Element ("uses-sdk")?.Attribute (androidNs + "minSdkVersion"); if (minAttr == null) { - int minSdkVersion; - if (!int.TryParse (MinSdkVersionName, out minSdkVersion)) - minSdkVersion = defaultMinSdkVersion; - return Math.Min (minSdkVersion, defaultMinSdkVersion).ToString (); + return TryParseMinSdkVersionName (); } return minAttr.Value; } @@ -295,24 +300,20 @@ public IList Merge (TaskLoggingHelper log, TypeDefinitionCache cache, Li app.Add (new XElement ("meta-data", new XAttribute (androidNs + "name", "com.google.android.wearable.beta.app"), new XAttribute (androidNs + "resource", "@xml/wearable_app_desc"))); } - // If no is specified, add it with both minSdkVersion and - // targetSdkVersion set to TargetFrameworkVersion + string minSdkVersionString = TryParseMinSdkVersionName (); + + // If no is specified, add it with both minSdkVersion and targetSdkVersion if (!manifest.Elements ("uses-sdk").Any ()) { manifest.AddFirst ( new XElement ("uses-sdk", - new XAttribute (androidNs + "minSdkVersion", MinSdkVersionName), + new XAttribute (androidNs + "minSdkVersion", minSdkVersionString), new XAttribute (androidNs + "targetSdkVersion", TargetSdkVersionName))); } - // If no minSdkVersion is specified, set it to TargetFrameworkVersion + // If no minSdkVersion is specified, set it var uses = manifest.Element ("uses-sdk"); - if (uses.Attribute (androidNs + "minSdkVersion") == null) { - int minSdkVersion; - if (!int.TryParse (MinSdkVersionName, out minSdkVersion)) - minSdkVersion = XABuildConfig.NDKMinimumApiAvailable; - minSdkVersion = Math.Min (minSdkVersion, XABuildConfig.NDKMinimumApiAvailable); - uses.SetAttributeValue (androidNs + "minSdkVersion", minSdkVersion.ToString ()); + uses.SetAttributeValue (androidNs + "minSdkVersion", minSdkVersionString); } string targetSdkVersion; diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs index bbea9a58667..8579f37a8c0 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs @@ -544,5 +544,22 @@ public static string GetRelativePathForAndroidAsset (string assetsDirectory, ITa return Convert.ToString (obj, CultureInfo.InvariantCulture); } + + /// + /// Converts $(SupportedOSPlatformVersion) to an API level, as it can be a version (21.0), or an int (21). + /// + /// The version to parse + /// The API level that corresponds to $(SupportedOSPlatformVersion), or 0 if parsing fails. + public static int ConvertSupportedOSPlatformVersionToApiLevel (string version) + { + int apiLevel = 0; + if (version.IndexOf ('.') == -1) { + version += ".0"; + } + if (Version.TryParse (version, out var parsedVersion)) { + apiLevel = parsedVersion.Major; + } + return apiLevel; + } } } diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Tooling.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Tooling.targets index 73af03e487f..ff86b19b484 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Tooling.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Tooling.targets @@ -101,6 +101,7 @@ projects. AndroidSdkPlatform="$(_AndroidApiLevel)" AndroidManifest="$(_AndroidManifestAbs)" DesignTimeBuild="$(DesignTimeBuild)" + SupportedOSPlatformVersion="$(SupportedOSPlatformVersion)" > diff --git a/tests/CodeBehind/BuildTests/Properties/AndroidManifest.xml b/tests/CodeBehind/BuildTests/Properties/AndroidManifest.xml index 62875447de2..a0230c27bfe 100644 --- a/tests/CodeBehind/BuildTests/Properties/AndroidManifest.xml +++ b/tests/CodeBehind/BuildTests/Properties/AndroidManifest.xml @@ -1,6 +1,6 @@  - + diff --git a/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs b/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs index dafe5d5a031..cffcf4e3279 100755 --- a/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs +++ b/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs @@ -25,9 +25,10 @@ public void ClearDebugProperties () void SetTargetFrameworkAndManifest(XamarinAndroidApplicationProject proj, Builder builder) { builder.LatestTargetFrameworkVersion (out string apiLevel); + proj.SupportedOSPlatformVersion = "24"; proj.AndroidManifest = $@" - + "; diff --git a/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs b/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs index 8504f47d421..8e8c6b1b360 100644 --- a/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs +++ b/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs @@ -79,7 +79,7 @@ public void GlobalLayoutEvent_ShouldRegisterAndFire_OnActivityLaunch ([Values (f proj = new XamarinAndroidApplicationProject () { IsRelease = isRelease, - MinSdkVersion = "23", + SupportedOSPlatformVersion = "23", TargetSdkVersion = null, }; if (isRelease || !CommercialBuildAvailable) { @@ -959,10 +959,10 @@ public void CheckResouceIsOverridden ([Values (true, false)] bool useAapt2) b.ThrowOnBuildFailure = false; string apiLevel; app.TargetFrameworkVersion = b.LatestTargetFrameworkVersion (out apiLevel); - + app.SupportedOSPlatformVersion = "24"; app.AndroidManifest = $@" - + "; @@ -996,10 +996,10 @@ public void CheckResouceIsOverridden ([Values (true, false)] bool useAapt2) app.AndroidUseAapt2 = useAapt2; app.LayoutMain = app.LayoutMain.Replace ("@string/hello", "@string/hello_me"); app.TargetFrameworkVersion = b.LatestTargetFrameworkVersion (out apiLevel); - + app.SupportedOSPlatformVersion = "24"; app.AndroidManifest = $@" - + "; diff --git a/tests/MSBuildDeviceIntegration/Tests/MonoAndroidExportTest.cs b/tests/MSBuildDeviceIntegration/Tests/MonoAndroidExportTest.cs index 69af71239fd..64f74a973ea 100644 --- a/tests/MSBuildDeviceIntegration/Tests/MonoAndroidExportTest.cs +++ b/tests/MSBuildDeviceIntegration/Tests/MonoAndroidExportTest.cs @@ -110,10 +110,10 @@ protected override void OnCreate (Bundle bundle) using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { string apiLevel; proj.TargetFrameworkVersion = b.LatestTargetFrameworkVersion (out apiLevel); - + proj.SupportedOSPlatformVersion = "24.0"; proj.AndroidManifest = $@" - + ";