如何从共享库中获取版本信息到Android清单中?
我们有一个共享库,其中包含版本信息,并由我们的VisualStudio解决方案中的所有项目引用 在大多数情况下,我们可以引用每个项目中的版本字符串,dll会相应地反映信息 我的问题是,我们的Android应用程序(基于xamarin)。它有一个清单文件,其中包含versionName和versionCode如何从共享库中获取版本信息到Android清单中?,android,xamarin,android-manifest,versioning,Android,Xamarin,Android Manifest,Versioning,我们有一个共享库,其中包含版本信息,并由我们的VisualStudio解决方案中的所有项目引用 在大多数情况下,我们可以引用每个项目中的版本字符串,dll会相应地反映信息 我的问题是,我们的Android应用程序(基于xamarin)。它有一个清单文件,其中包含versionName和versionCode 我们如何使android清单文件中的这些值从共享项目中读取?注意:我对xamarin一无所知 在java中,您可以从清单中获取versioninfo,如下所示 public static S
我们如何使android清单文件中的这些值从共享项目中读取?注意:我对xamarin一无所知 在java中,您可以从清单中获取versioninfo,如下所示
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我的理解是,这是不可能的。因为 清单文件向Android系统提供有关应用程序的基本信息,这些信息是系统在运行任何应用程序代码之前必须具备的 来自谷歌的 因此,这是应用程序构建之前所需的文件 共享项目(SAP/PCL)中的C#代码只有在成功编译后才能使用。因此,从共享逻辑在Android清单文件中逻辑设置版本代码和版本名称是不可能的 另一个标准方法是在Android中从字符串资源(XML)文件设置它。您可能需要将共享项目中的值复制并粘贴到strings.xml文件中,并在清单中引用它,如
@string/versionCode
您可以通过使用依赖项服务来实现这一点。下面是一篇关于它们的精彩文章: 这样做的想法是,您的依赖项服务将向共享代码库公开特定于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 ();
var osVersion=DependencyService.Get().GetOSVersion();
当然,这是一些伪代码,根据您选择的依赖项服务,代码看起来可能有点不同。@Pooya如问题中所述,这是一个使用xamarin和visual studio的android项目。在这种情况下,它确实有版本信息-Pooya删除了他/她的评论,将其保留在此处以供参考。我认为没有API来设置这些值。您很可能需要为这些特定节点(
versionName
和versionCode
)解析AndroidManifest.xml
),并以这种方式替换它们,然后重新生成。否则,手动递增并重新生成可能是最简单的。@DustyRoberts您将不得不在生成/签名/打包之前生成Android清单(或更新现有清单),因为清单将成为.apk
中的signed
成员。只需解压缩一个已签名的.apk
,您将发现一个无法修改的已签名清单,因为这将使整个包签名无效。我希望设置值而不是获取它们。但是为了这个,我在另一个项目中需要这个。。。。让我看看这是否可以通过使用T4Hey@DustyRoberts创建清单文件来实现。。。出于好奇,T4是否成功?我删除了我的androidmanifest.xml文件,并创建了一个生成该文件的T4模板。这个版本现在是动态的:)太好了:-)我想请你把它作为一个答案发布。这有什么帮助?AndroidManifest信息在编译期间添加。依赖项服务仅在运行时启动。还是我遗漏了什么?