版本控制是应用升级和维护策略的关键组成部分。版本控制很重要,因为:
Android 系统不会使用应用版本信息对第三方应用的升级、降级或兼容性进行限制,而是由您负责在您的应用内执行版本限制,或通知用户版本限制与局限性。不过,Android 系统会根据构建文件中 minSdkVersion 设置的说明强制执行系统版本兼容性。该设置允许应用指定与其兼容的最低系统 API。如需了解详细信息,请参阅 指定最低系统 API 版本 。
要为您的应用定义版本信息,请在 Gradle 构建文件中为版本设置设定相应的值。这些值随后将在构建流程中合并到您应用的清单文件中。
可配置两个设置,您应始终为它们定义相应的值:
您可以将这些设置包含到 defaultConfig {} 块中(嵌套在模块的 buildgradle 文件的 android {} 块内部),为它们定义默认值。随后,您可以通过为各个构建类型或产品风味定义单独的值,为应用的不同版本替换这些默认值。下面的 buildgradle 文件显示了 defaultConfig {} 块和 productFlavors {} 块中的 versionCode 和 versionName 设置。
在本示例的 defaultConfig {} 块中, versionCode 值表示当前 APK 包含应用的第二个版本, versionName 字符串则指定应用将以版本 11 向用户显示。此 buildgradle 文件还定义了两个产品风味,即“demo”和“full”。由于“demo”产品风味将 versionName 定义为“11-demo”,“demo”将使用此 versionName ,而不是默认值。“full”产品风味块未定义 versionName ,因此它将使用默认值 11。
Android 框架提供了一个 API,让您可以查询系统,获取有关应用的版本信息。要获取版本信息,请使用 PackageManager 的 getPackageInfo(javalangString, int) 方法。
如果您的应用需要特定的最低版本的 Android 平台,您可以在应用的 buildgradle 文件中以 API 级别设置的形式指定版本要求。在构建流程中,这些设置将合并到您应用的清单文件中。指定 API 级别要求可确保只能将您的应用安装在运行兼容的 Android 平台版本的设备上。
存在两种 API 级别设置:
要在 buildgradle 文件中指定默认的 API 级别要求,请将上面的一个或多个设置添加到 defaultConfig {} 块中,嵌套在 android {} 块内。您还可以通过将设置添加到构建类型或产品风味的方式,为应用的不同版本替换这些默认值。下面的 buildgradle 文件可以指定 defaultConfig {} 块中默认的 minSdkVersion 和 targetSdkVersion 设置,并为一个产品风味替换 minSdkVersion 。
在准备安装您的应用时,系统将检查这些设置的值,并将其与系统版本比较。如果 minSdkVersion 值大于系统版本,系统将阻止应用安装。
如果您不指定这些设置,系统将假设您的应用与所有平台版本兼容。
如需了解详细信息,请参阅 <uses-sdk> 清单元素文档以及 API 级别 文档。有关 Gradle 构建设置,请参阅 配置构建变体 。
安卓的APK么?
安卓的APK是个压缩包格式,我给你个思路 具体代码你去写 还是比较简单的
分为两步:①上传按钮点击时解压APK压缩包
②获取压缩包内AndroidManifestxml(apk的包名,版本号,版本名称都在此XML文件内)
③解析这个XML
既然答了 我就完善一下:(在codeplex上面找到的)
using AndroidXml;
using IonicZip;
using System;
using SystemCollectionsGeneric;
using SystemIO;
using SystemLinq;
using SystemText;
using SystemThreadingTasks;
using SystemXml;
namespace APKRead
{
class NamespaceInfo
{
public string Prefix { get; set; }
public string Uri { get; set; }
}
class Program
{
static List<AndroidInfo> androidInfos = new List<AndroidInfo>();
static void Main(string[] args)
{
//要分析的文件名称
var manifest = "AndroidManifestxml";
//读取apk,通过解压的方式读取
using (var zip = ZipFileRead("Newsapk"))
{
using (Stream zipstream = zip[manifest]OpenReader())
{
//将解压出来的文件保存到一个路径(必须这样)
using (var fileStream = FileCreate(manifest, (int)zipstreamLength))
{
// Initialize the bytes array with the stream length and then fill it with data
byte[] bytesInStream = new byte[zipstreamLength];
zipstreamRead(bytesInStream, 0, bytesInStreamLength);
// Use write method to write to the file specified above
fileStreamWrite(bytesInStream, 0, bytesInStreamLength);
}
}
}
//读取解压文件的字节数
byte[] data = FileReadAllBytes(manifest);
if (dataLength == 0)
{
throw new IOException("Empty file");
}
#region 读取文件内容
using (var stream = new MemoryStream(data))
{
var reader = new AndroidXmlReader(stream);
while (readerRead())
{
switch (readerNodeType)
{
case XmlNodeTypeElement:
{
AndroidInfo info = new AndroidInfo();
androidInfosAdd(info);
infoName = readerName;
infoSettings = new List<AndroidSetting>();
for (int i = 0; i < readerAttributeCount; i++)
{
readerMoveToAttribute(i);
AndroidSetting setting = new AndroidSetting() { Name = readerName, Value = readerValue };
infoSettingsAdd(setting);
}
readerMoveToElement();
break;
}
}
}
}
#endregion
FileDelete(manifest);
StringBuilder builder = new StringBuilder();
foreach (var androidInfo in androidInfos)
{
builderAppend(stringFormat("{0}:",androidInfoName));
foreach (var setting in androidInfoSettings)
{
builderAppend("{");
builderAppend(stringFormat("'{0}':'{1}'",settingName,settingValue));
builderAppend("},");
}
builderAppend("\n\n");
}
ConsoleWriteLine(builderToString());
}
}
/// <summary>
/// android应用程序信息
/// </summary>
public class AndroidInfo
{
public string Name { get; set; }
public List<AndroidSetting> Settings { get; set; }
}
/// <summary>
/// 设置
/// </summary>
public class AndroidSetting
{
public string Name { get; set; }
public string Value { get; set; }
}
}
//引用的IonicZip库可以直接通过 nuget下载。
我要在上传APK的同时来解析APK的签名是否和以前版本一致否则不能升级,所以我需要上传的时候来解析APK的签名
这里,应该还需要一个比较,这里有个问题。
你上传的版本一定是在本地。
那么你之前的版本是在什么地方呢?
一般用的都是下载最新版本,上传倒是没怎么用
如下是java解析APK,来自CSDN论坛:
package comjustsyaxml;
import javaioFile;
import brutandrolibAndrolibException;
import brutandrolibApkDecoder;
/
使用apktool解析apk包文件名 : ATooljava
/
public class ATool {
/
@param args
@throws AndrolibException
/
public static void main(String[] args) throws Exception {
File inFile = new File("D:\\adobeapk");
ApkDecoder decoder = new ApkDecoder();
decodersetOutDir(new File("D:\\apktool"));
decodersetApkFile(inFile);
decoderdecode();
}
}
以上就是关于对您的应用进行版本控制全部的内容,包括:对您的应用进行版本控制、C#中,上传apk时,怎样获取apk的基本信息、java程序解析APK 的签名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)