如何将版本信息从共享库获取到 Android 清单中?

How to get version info from a shared library into the Android manifest?

我们有一个包含版本信息的共享库,我们的 Visual Studio 解决方案中的所有项目都引用了它。

在大多数情况下,我们可以引用每个项目的版本字符串,dll 会相应地反映信息。

我的问题是,我们的 Android 应用程序(基于 xamarin)。它有一个包含版本名称和版本代码的清单文件。

我们如何才能使我们的 android 清单文件中的这些值从我们的共享项目中读取?

注意:我对 xamarin 一无所知。

在 java 中,您可以像这样从清单中获取版本信息

public static String getAppVersionName(final Context context) {
    try {

        final String versionName = context.getPackageManager()
                .getPackageInfo(context.getPackageName(), 0).versionName;
        return versionName;
    } catch (final NameNotFoundException e) {
    }
    return null;
}

我假设 xamarin 也有一些机制可以调用 PackageManager 来获取 Packageinfo

我的理解是,这是不可能的。因为

The manifest file presents essential information about your app to the Android system, information the system must have before it can run any of the app's code.

来自Google的documentation

所以这是构建应用程序之前需要的文件。

共享项目 (SAP/PCL) 中的 C# 代码只有在编译成功后才能使用。因此,从逻辑上讲,在共享逻辑的 Android 清单文件中设置版本代码和版本名称是不可能的。

另一种标准方法是从 Android 中的字符串资源 (XML) 文件设置它。您可能必须将共享项目中的值复制并粘贴到 strings.xml 文件并在清单中引用它,例如

@string/versionCode

您可以使用依赖服务来完成此操作。这是一篇关于它们的精彩文章:https://developer.xamarin.com/guides/xamarin-forms/dependency-service/

您的想法是您的依赖服务会将 Android 特定信息公开给共享代码库。

例如,您可能在公共代码中声明了一个接口,例如:

public interface IPlatformVersionInfo
{
    string GetOSVersion (); 
}

现在,在您的 Android 库中实现它:

public class PlatformVersionInfo : IPlatformVersionInfo
{
    public string GetOSVersion () {
        return Android.OS.Build.VERSION.SdkInt.ToString ();
    }
}

最后,在您的公共代码中,您将使用您选择的依赖服务来调用它的一个实例:

var osVersion = DependencyService.Get<IPlatformVersionInfo>().GetOSVersion ();

当然这有点伪代码,根据您选择的依赖服务,代码可能看起来有点不同。