APP 版本控制

版本管理是app的一个重要部分,他主要的用途有:

  • 让用户了解当前的版本信息,了解升级或者降级信息等
  • 不同的版本可能提供的服务和功能有所差别,版本信息可以给我们一个标志来识别当前版本可提供的服务和功能。

目录

设置版本信息

官方推荐是在Gradle中进行版本设置,因为Gradle中设置的版本信息会在构建的时候合并到manifest文件中,并会替换掉manifest中有关版本信息的设置。并且在Gradle中进行设置的话还可以根据应用不同的Flavor进行不同的设置。

版本控制主要有这么两个属性:

-versionCode : 整数,是内部版本号,仅用于判断一个版本是否比另一个版本新,用户并不会看到。通常是跟随着发布版本增加该code。

-versionName : 字符串,用户能看到的版本号。

通常我们将这些设置放在gradle下的android {} 块内部使用defaultConfig {} 包裹它。要注意,如果你在productFlavors中定义了这些属性,他们会覆盖defaultConfig中的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
android {
...
defaultConfig {
...
versionCode 1
versionName "1.0.0"
}
productFlavors {
a {
...
versionName "1.0.0"
}
b {
...
}
}
}

在android中使用 PackageManager 的 getPackageInfo(java.lang.String, int) 方法可以获取版本信息。

1
2
3
4
5
6
7
8
9
10
11
public static String getVersion(Context context)//获取版本号
{
try {
PackageInfo pi=context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return pi.versionName;
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return context.getString(R.string.version_unknown);
}
}
1
2
3
4
5
6
7
8
9
10
11
public static int getVersionCode(Context context)//获取版本号(内部识别号)
{
try {
PackageInfo pi=context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return pi.versionCode;
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return 0;
}
}

如果使用 Instant Run,Android Studio 会自动将 versionCode 设置为 MAXINT,将 versionName 设置为 INSTANTRUN。

统一配置

顺便说一下一个可以统一所有的配置在一个地方的方法,这样可以便于我们管理版本。
首先在主工程的build.gradle里增加一个配置区

1
2
3
4
5
6
7
8
9
10
ext {
// Sdk and tools
minSdkVersion = 17
targetSdkVersion = 21
compileSdkVersion = 23
buildToolsVersion = "23.0.3"
// App dependencies
supportLibraryVersion = '23.3.0'
}

然后在module的build.gradle里使用

1
2
3
targetSdkVersion rootProject.ext.targetSdkVersion
compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 判断当前应用是否是debug状态
*/
public static boolean isApkInDebug(Context context) {
try {
ApplicationInfo info = context.getApplicationInfo();
return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
} catch (Exception e) {
return false;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
*检测其他应用是否处于debug模式。
*/
public static boolean isApkDebugable(Context context,String packageName) {
try {
PackageInfo pkginfo = context.getPackageManager().getPackageInfo(
packageName, 1);
if (pkginfo != null ) {
ApplicationInfo info= pkginfo.applicationInfo;
return (info.flags&ApplicationInfo.FLAG_DEBUGGABLE)!=0;
}
} catch (Exception e) {
}
return false;
}

Reference

https://developer.android.com/studio/publish/versioning.html

Share