Posts Tagged ‘버전관리’
Android Studio로 버전코드/버전네임 관리하기
PlayStore에 등록된 앱은 VersionCode와 VersionName의 두가지 속성을 가지고 있다.
VersionCode는 정수값을 이용하는데, 플레이 스토어 내부적으로 상위 버전을 구분하는데 사용되고, VersionName은 플레이 스토어에서 사용자에게 보여주기 위한 값으로 사용된다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.example" android:versionCode="0" android:versionName="0.0.0.0">
보통 AndroidManifest.xml에 위와 같이 정의하여 사용하는데, 안드로이드 스튜디오에서는 Gradle scripts의 Build.gradle(Module:app)에 정의된 아래 값에 의해 manifest에 정의된 값이 무시된다.
android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.android.example" minSdkVersion 14 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
자동화된 빌드 툴을 쓰지 않고 일일히 버전코드와 버전네임을 관리하는 것은 귀찮은 일인데, 이럴때 간단하게 버전 코드를 업데이트 해줄 방법은 다음과 같다.
apply plugin: 'com.android.application' import java.util.regex.Pattern android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.android.example" minSdkVersion 14 targetSdkVersion 21 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' } task('increaseVersionCode') << { def manifestFile = file("src/main/AndroidManifest.xml") def pattern = Pattern.compile("versionCode=\"(\\d+)\"") def manifestText = manifestFile.getText() def matcher = pattern.matcher(manifestText) matcher.find() def versionCode = Integer.parseInt(matcher.group(1)) def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"") manifestFile.write(manifestContent) } task('incrementVersionName') << { def manifestFile = file("src/main/AndroidManifest.xml") def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\"") def manifestText = manifestFile.getText() def matcherVersionNumber = patternVersionNumber.matcher(manifestText) matcherVersionNumber.find() def majorVersion = Integer.parseInt(matcherVersionNumber.group(1)) def minorVersion = Integer.parseInt(matcherVersionNumber.group(2)) def pointVersion = Integer.parseInt(matcherVersionNumber.group(3)) def buildVersion = Integer.parseInt(matcherVersionNumber.group(4)) def mNextVersionName = majorVersion + "." + minorVersion + "." + pointVersion + "." + (buildVersion + 1) def manifestContent = matcherVersionNumber.replaceAll("versionName=\"" + mNextVersionName + "\"") manifestFile.write(manifestContent) } tasks.whenTaskAdded { task -> if (task.name == 'generateReleaseBuildConfig' || task.name == 'generateDebugBuildConfig') { task.dependsOn 'increaseVersionCode' task.dependsOn 'incrementVersionName' } }
default config의 versionCode/versionName를 삭제한 후, Build.gradle에 위와 같이 task 구문을 추가해 주면 빌드 시마다 Manifest의 VersionCode가 +1씩 증가하게되고, VersionName은 0.0.0.0 (Major.Minor.Point.Build 버전) 순으로 형성되어 빌드 시마다 빌드버전이 +1씩 증가된다.
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PackageInfo pInfo = null; try { pInfo = getPackageManager().getPackageInfo( this.getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } int versionCode = pInfo.versionCode; String versionName = pInfo.versionName; TextView versionCodeTextView = (TextView) findViewById(R.id.versionCode); versionCodeTextView.setText("VersionCode:"+Integer.toString(versionCode)); TextView versionNameTextView = (TextView) findViewById(R.id.versionName); versionNameTextView.setText("VersionName:"+versionName); } }
매니페스트 상에서도 바로바로 업데이트 되는 것을 볼 수 있지만 위와 같이 버전명과 버전코드를 호출해서 확인도 가능하다.