Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从共享库中获取版本信息到Android清单中?_Android_Xamarin_Android Manifest_Versioning - Fatal编程技术网

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

如何从共享库中获取版本信息到Android清单中?,android,xamarin,android-manifest,versioning,Android,Xamarin,Android Manifest,Versioning,我们有一个共享库,其中包含版本信息,并由我们的VisualStudio解决方案中的所有项目引用 在大多数情况下,我们可以引用每个项目中的版本字符串,dll会相应地反映信息 我的问题是,我们的Android应用程序(基于xamarin)。它有一个清单文件,其中包含versionName和versionCode 我们如何使android清单文件中的这些值从共享项目中读取?注意:我对xamarin一无所知 在java中,您可以从清单中获取versioninfo,如下所示 public static S

我们有一个共享库,其中包含版本信息,并由我们的VisualStudio解决方案中的所有项目引用

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

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


我们如何使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信息在编译期间添加。依赖项服务仅在运行时启动。还是我遗漏了什么?