maui
maui copied to clipboard
Compiler warning when using deprecated API on old version of Android
Description
In Android, I want to call PackageManager.GetPackageInfo. From Android 33 this is deprecated and replaced with an overload. So, I check which version to use:
PackageManager manager = PackageManager!;
PackageInfo info;
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
info = manager.GetPackageInfo(PackageName!, PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData));
}
else
{
info = manager.GetPackageInfo(PackageName!, PackageInfoFlags.MetaData)!;
}
But the compiler says the second call is deprecated, despite it is only used in older version:
warning CS0618: 'PackageManager.GetPackageInfo(string, PackageInfoFlags)' is obsolete: 'deprecated'
I guess this is a bug :-)
Steps to Reproduce
- Create a new MAUI app.
- In MainActivity.cs, add this code:
protected override void OnResume()
{
base.OnResume();
PackageManager manager = PackageManager!;
PackageInfo info;
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
info = manager.GetPackageInfo(PackageName!, PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData));
}
else
{
info = manager.GetPackageInfo(PackageName!, PackageInfoFlags.MetaData)!;
}
string version = info.VersionName!;
}
Link to public reproduction project repository
https://github.com/pekspro/MauiIssues/tree/11319_Compiler_warning_when_using_deprecated_API
Version with bug
7.0 (current)
Last version that worked well
Unknown/Other
Affected platforms
Android
Affected platform versions
Windows 10.0.17763.0, Android 11
Did you find any workaround?
Suppress the warning like this:
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
info = manager.GetPackageInfo(PackageName!, PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData));
}
else
{
#pragma warning disable 618
info = manager.GetPackageInfo(PackageName!, PackageInfoFlags.MetaData)!;
#pragma warning restore 618
}
Relevant log output
I found these defintions:
[System.Obsolete("deprecated")]
[Register("getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Ljava_lang_String_IHandler")]
public abstract PackageInfo? GetPackageInfo(string packageName, [GeneratedEnum] PM.PackageInfoFlags flags);
[Register("getPackageInfo", "(Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Ljava_lang_String_Landroid_content_pm_PackageManager_PackageInfoFlags_Handler", ApiSince = 33)]
[SupportedOSPlatform("android33.0")]
public virtual PackageInfo GetPackageInfo(string packageName, PackageInfoFlags flags);
[ObsoletedOSPlatform("android33.0")]
[Register("getPackageInfo", "(Landroid/content/pm/VersionedPackage;I)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Landroid_content_pm_VersionedPackage_IHandler", ApiSince = 26)]
[SupportedOSPlatform("android26.0")]
public abstract PackageInfo? GetPackageInfo(VersionedPackage versionedPackage, [GeneratedEnum] PM.PackageInfoFlags flags);
[Register("getPackageInfo", "(Landroid/content/pm/VersionedPackage;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo;", "GetGetPackageInfo_Landroid_content_pm_VersionedPackage_Landroid_content_pm_PackageManager_PackageInfoFlags_Handler", ApiSince = 33)]
[SupportedOSPlatform("android33.0")]
public virtual PackageInfo GetPackageInfo(VersionedPackage versionedPackage, PackageInfoFlags flags);
We've moved this issue to the Backlog milestone. This means that it is not going to be worked on for the coming release. We will reassess the backlog following the current release and consider this item at that time. To learn more about our issue management process and to have better expectation regarding different types of issues you can read our Triage Process.
I got a similar warning: CA1416: Validate platform compatibility
Solution:
internal static class AndroidGuard
{
/// <summary>Guard: Android 11 R (API 30) or greater</summary>
[SupportedOSPlatformGuard("android30.0")]
public static bool IsApi30OrGreater { get; } = OperatingSystem.IsAndroidVersionAtLeast(30);
}
if (AndroidGuard.IsApi30OrGreater)
{
// The analyzer also respects System.Diagnostics.Debug.Assert as a means for
// preventing the code from being reached on unsupported platforms.
System.Diagnostics.Debug.Assert(AndroidGuard.IsApi30OrGreater);
// Call Android API that requires API 30 or greater...
}
Verified this on Visual Studio Enterprise 17.7.0 Preview 1.0. Repro on Android 13.0-API33 with below Project: 11319.zip