Friday, March 29

ทำชีวิตให้ง่ายด้วย Build Variants

Google+ Pinterest LinkedIn Tumblr +

สวัสดีครับผู้อ่านทุกๆท่าน ผมกลับมาอีกครั้งหลังจากห่างหายกันไปนานกับบทความ Android วันนี้เราจะมาทำเรื่อง Build Variant กัน แต่มันคืออะไรหว่า

ท่านผู้อ่านเคยเจอกับ Project ที่มีความต่างกันไม่มากมั้ยครับ เช่น ระหว่าง Version Develop กับ Version Production ที่อาจจะแตกต่างกันแค่ URL ของ Web Service หรือ รูป Icon อะไรแบบนี้ ซึ่งกันจะสลับไปสลับมาโดยการไปแก้ Code , Comment Code บ่อยๆคงไม่ดีแน่ เกิดลืมแก้ไม่ครบกันพังอีก ต้องมาไล่อ่าน Code กันใหม่ เสียเวลาสุดๆ

แต่ Build Variant จะทำให้เราเหมือนมี 2 Project ที่มี Package Name ต่างกันได้ และอื่นๆอีกหลายอย่างทำให้เราไม่ต้องเข้าไปแก้ Code แค่สลับตอนเลือก Build ใน Android Studio ก็พอแล้ว

กล่าวโดยสรุปคือ จะช่วยให้เราสร้าง APK ที่มี Version ที่แตกต่างกันได้ โดยใช้ Project เดียวกัน ประโยชน์หลักๆ คือการทำ Demo Version กับ Paid Version หรือเราอยากจะทำหลาย APK เพื่อให้รองรับ Deveice ที่แตกต่างกันใน Google Play

การทำงานคือเราจะมี Project หลัก ที่มี Code และ Resource ปกติ กับตัว Project เสริมที่มีบางอย่างเช่น Code หรือ xml เพิ่มขึ้นมาแบบนี้

1-7-2558 17-14-06

สิ่งที่ทำได้(ที่ผมลองมาแล้ว)
1. Package Name ต่างกันได้ เช่น com.kamonway.helloworld.test1 กับ com.kamonway.helloworld.test2
2. Icon และ Drawable ต่างกันได้
3. Value เช่น strings.xml ต่างกันได้
4. Java Code ต่างกันได้

จะลองทำให้ดูทีละอย่างแล้วกันนะครับ เริ่มจากสร้าง Project ด้วย Android Studio ก่อนเลยผมใช้เป็น BlankActivity ธรรมดา Package Name ของผมคือ com.kamonway.hellobuildvariants สร้างมาแล้วลอง Run เล่นๆสักรอบนึงก่อน

1. Package Name
ให้เราเข้าไปที่ build.gradle แล้วเพิ่ม Code ด้านล่างนี้ไว้ใต้ buildTypes แล้วกด Sync Now โดยชื่อ Package Name สามารถตั้งคล้ายแบบเดิมหรือไม่ก็ได้

[xml] productFlavors {
production {
applicationId "com.kamonway.hellobuildvariants.production"
}

develop {
applicationId "com.kamonway.hellobuildvariants.develop"
}
}
[/xml]

จะได้แบบเต็มๆ เช่นนี้

[xml] apply plugin: ‘com.android.application’

android {
compileSdkVersion 22
buildToolsVersion "21.1.2"

defaultConfig {
applicationId "com.kamonway.hellobuildvariants"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}

productFlavors {
production {
applicationId "com.kamonway.hellobuildvariants.production"
}

develop {
applicationId "com.kamonway.hellobuildvariants.develop"
}
}
}

dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
compile ‘com.android.support:appcompat-v7:22.1.1’
}
[/xml]

จากนั้นเรามาเขียน Code เพิ่มสักหน่อยเพื่อดู Package Name ว่าเปลี่ยนไปจริงๆนะ
ใน MainActivity เพิ่ม Code สำหรับแสดง Package Name ใน Textview เข้าไป (ขอไม่สอน ทำID Textview นะ)

[java title=”MainActivity.java”] TextView hellotxt;
public static String PACKAGE_NAME;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hellotxt = (TextView) findViewById(R.id.hellotxt);

PACKAGE_NAME = getApplicationContext().getPackageName();
hellotxt.setText(PACKAGE_NAME);

}
[/java]

จากนั้นมาดูที่หน้าตาของ Android Studio กันคำว่า Build Variants ของผมอยู่ซ้ายล่างแบบนี้ กดเข้าไปแล้วจะมีแถบแสดงขึ้นมา

ดูตรงลูกศรสีแดง

ดูตรงลูกศรสีแดง

สังเกตตรง Build Variants ในแถบที่เพิ่งเปิดมากดได้นะครับ จะเป็นชื่อที่เราใส่ไปใน build.gradle จะได้มาทั้งหมด 4 ตัว โดย 1 ชื่อของ Build Variants จะได้ทั้ง Debug และ Release เหมือน App ปกติของเรา

1-7-2558 16-33-59

ถ้าเราเลือกสลับตัว Build Variants ใหม่ก็รอสัก 2 -3 วิเพื่อให้เวลามันสลับตัวเองหน่อยแล้วค่อยกด Run ตามปกติ มาดูกันว่าเป็นยังไง

รูปจาก Build develop debug

รูปจาก Build develop debug

รูปจาก Build production debug

รูปจาก Build production debug

จะเห็นว่า เราจะได้ แอพที่มี Package Name ต่างกันแล้ว

2. Icon และ Drawable
วิธีการคือใน Folder ของ Project เราให้เข้าใน app -> src จะเห็นว่ามี 2 Folder คือ androidTest และ main ซึ่งเป็น Project หลักของเรา

1-7-2558 16-42-05

ให้เราสร้างมาอีก 2 Folder คือ production และ develop (ชื่อต้องเหมือนกันกับใน build.gradle) แบบนี้

1-7-2558 16-42-27

จากนั้นสร้าง Folder res และสร้าง folder mipmap สำหรับเก็บ Icon อีกทีนึง(ของผม Icon App อยู่ใน mipmap แต่รุ่นเก่าๆจะอยู่ใน drawable) แบบนี้

1-7-2558 16-45-43

จากนั้นก็ Run ดู ทั้ง 2 Build Variants

Screenshot_2015-07-01-16-52-32

3. Values เช่น strings.xml
ทำคล้ายกับ Icon คือสร้าง Folder values ใน res และสร้าง strings.xml ขึ้นมา

[java title=”strings.xml ใน production”] <?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="Owner">Blog</string>
</resources>
[/java] [java title=”strings.xml ใน production”] <?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="Owner">Facebook Fanpage</string>
</resources>
[/java]

เพิ่ม Code ใน MainActivity ให้แสดงผลใน strings.xml ที่เราเพิ่งสร้างไป

[java title=”MainActivity.java”] @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hellotxt = (TextView) findViewById(R.id.hellotxt);

PACKAGE_NAME = getApplicationContext().getPackageName();
hellotxt.setText(PACKAGE_NAME + "\n" + getString(R.string.Owner));

}
[/java]

ผลออกมาก็เป็นเช่นนี้แล

develop

develop

production

production

4. Class เช่น Constants ต่างๆ
สร้าง Folder java ขึ้นมาใน Folder production จากนั้นก็สร้างชั้นของ Folder ตาม Package Name ของเราเช่น com.kamonway.hellobuildvariants จะได้แบบนี้

1-7-2558 16-55-04

การสร้าง Java file ก็ทำเหมือนปกติ สังเกตว่าเราจะมี Package Name เพิ่มขึ้นมาอีก 1 อันก็กด New -> Java Class ตามปกติ

1-7-2558 16-55-59

[java title=”Constant.java ใน production”] public class Constant {
public final static String BASE_URL = "https://www.kamonway.com/";
}
[/java] [java title=”Constant.java ใน develop”] public class Constant {
public final static String BASE_URL = "https://www.facebook.com/thisiskamonway";
}
[/java]

สร้าง develop ก็ทำแบบเดียวกัน ข้างใน Constants เป็นแบบนี้จะได้ต่างกันหน่อย
จากนั้นไปที่ MainActivity เพิ่ม Code เพื่อเรียกใช้ Constants มาแสดงใน TextView แบบนี้

[java title=”MainActivity.java”] @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hellotxt = (TextView) findViewById(R.id.hellotxt);

PACKAGE_NAME = getApplicationContext().getPackageName();
hellotxt.setText(PACKAGE_NAME + "\n" + Constant.BASE_URL + "\n" + getString(R.string.Owner));

}
[/java]

เราจะได้ออกมาเป็นเช่นนี้

develop

develop

production

production

สุดท้ายยยยยย Release
การทำ Release ก็เหมือนกับที่เราทำ Generate Signed APK ตามปกติแต่จะมีให้เราเลือกว่าจะใช้ production หรือ develop

1-7-2558 17-01-15

เป็นไงกันบ้าง การทำ Build Variants น่าจะช่วยให้ท่านผู้อ่านทำ Project ที่มี Code คล้ายๆกันได้ง่ายขึ้น ไม่ต้องไปนั่ง Comment นั่งแก้ Code ทุกครั้งที่ต้องสลับ Project แถมยังช่วยแก้ปัญหาลืมว่า ทำฟีเจอร์นี้ไปแล้วใน Project นึงแต่ลืมแก้ของอีก Project ได้ด้วย ช่วยลดเวลาไปได้เยอะ

สำหรับสาวก IOS ก็มีวิธีแบบนี้เหมือนกันนะครับ
[iOS]ทำงานกับ BackEnd หลายๆEnvironments(Production,Dev,Beta) ง่ายๆด้วย Build Configuration

บทความที่น่าสนใจ
การทำ Build Variants ภาค 2
การทำ In-App Billing แบบง่ายๆด้วย Library
A/B Testing in Google Play Store

Facebook Comments
Share.

About Author

สวัสดีครับ ผมไอซ์ กมลวัฒน์ ผู้ก่อตั้งช่อง Youtube Kamonway และเว็บไซต์ kamonway.com เพื่อช่วยแนะนำความรู้จากเกม และเป็นช่องทางที่ช่วยให้ทุกท่านเล่นเกมอย่างสนุกสนานยิ่งขึ้น

Comments are closed.