【问题标题】:How to get version info from a shared library into the Android manifest?如何从共享库中获取版本信息到 Android 清单中?
【发布时间】:2016-04-11 11:38:09
【问题描述】:

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

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

我的问题是,我们的 Android 应用程序(基于 xamarin)。它有一个包含 versionName 和 versionCode 的清单文件。

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

【问题讨论】:

  • @Pooya 如问题所述,它是一个使用 xamarin 和 Visual Studio 的 android 项目。在这种情况下,它确实有版本信息 - Pooya 删除了他/她的评论,将其保留在这里以供参考
  • 我不相信有 API 可以设置这些值。您很可能需要为那些特定节点(versionNameversionCode)解析您的AndroidManifest.xml 并以这种方式替换它们然后重建。否则,手动递增并重建可能是最简单的。
  • @DustyRoberts 您必须在构建/签名/打包之前生成 Android 清单(或更新现有清单),因为清单成为 .apk 中的 signed 成员。只需解压缩签名的.apk,您会发现一个无法修改的签名清单,因为这会使整个包签名无效。

标签: android xamarin android-manifest versioning


【解决方案1】:

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

清单文件向 Android 系统提供有关您的应用的基本信息,这是系统在运行任何应用代码之前必须拥有的信息。

来自 Google 的 documentation

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

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

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

@string/versionCode

【讨论】:

  • darnit.... 让我看看这是否可以通过使用 T4 创建清单文件来实现
  • 嘿@DustyRoberts ... 只是出于好奇,T4 运气好吗?
  • 我删除了我的 androidmanifest.xml 文件并创建了一个生成该文件的 t4 模板。该版本现在是动态的:)
  • 太棒了 :-) 我会要求您将其发布为答案。
【解决方案2】:

注意:我对 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

【讨论】:

  • 我想设置值而不是获取它们。但是感谢这个,我在我正在做的另一个项目中需要这个。
【解决方案3】:

您可以通过使用依赖服务来做到这一点。这是一篇关于它们的精彩文章: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 ();

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

【讨论】:

  • 这有什么帮助? AndroidManifest 信息在编译期间添加。依赖服务仅在运行时启动。还是我错过了什么?
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多