web analytics

ลองใช้งาน Build Variants ใน Android Studio

cover

สวัสดีครับ ผมยังคงเดินทางไปเรื่อยๆ ชีวิตมีแต่เรื่องเครียดๆ วันนี้เลยต้องหาอะไรสักอย่างมาเขียน นอกเรื่องแอปของผมบ้างก็ดีเหมือนกัน วันนี้จะนำเสนอเกี่ยวกับ Build variants ครับ จริงๆ ผมเป็นคนทำแอปแบบตัวคนเดียวพเนจร เลยไม่เคยใช้งานเจ้านี่จนกระทั่งวันนี้ ได้แค่อ่านผ่านๆ แล้วก็เข้าใจว่ามันคืออะไรเท่านั้นเอง จนวันนี้ต้องใช้งานมันเลยมาเขียนบล็อกบันทึกไว้ครับ

 

เรื่องมีอยู่ว่า

แอป Cryptostory ของผมนั้นมีฟีเจอร์ที่ใช้งาน API ของเว็บเทรด crypto ในไทยชื่อ BX ทีนี้ ผมอยากจะแยกฟีเจอร์นี้ออกมาเป็นแอปตัวใหม่ เพราะคนที่หาแอปของ BX ไม่เจอแอปของผม แล้วก็เกิดอาการแบบว่า อ่าวมีด้วยหรอ ทำให้ผมคิดว่าการแยกแอปมาโดยเฉพาะจะตอบโจทย์มากกว่า ตอนแรกที่ผมคิดไว้คือ ทำproject ใหม่แล้ว copy code มาซะเลย แต่ทว่ามันก็มี code ที่ต้องใช้ร่วมกันกับฟีเจอร์อื่นๆอันเดิมในแอปอยู่ ถ้าจะแยกมันก็จะมี code ที่ซ้ำกัน + ขี้เกียจมานั่งจัด นั่นก็ทำให้ผมคิดถึง Build variant เลยละ หรือสรุปสุดๆก็คือ อยากทำโปรเจคใหม่โดยใช้โค้ดบางส่วนจากโปรเจคเดิม โดยไม่ต้องสร้างโปรเจคใหม่

 

Build Valiants คืออะไร

มันคือการแยก packagename ออกมา หรือจะเรียกว่าแยกเป็น environment ใหม่ก็ได้ ทำให้สามารถปรับแต่งได้ ทั้ง Resource , Java code โดยใช้โปรเจคเดิม ส่วนใหญ่ที่เห้นใช้ก็เอาไว้แยก Production กับ demo หรือ แยกเป็น API ก็ได้

 

เริ่มใช้งาน

ก่อนอื่นก็ไปที่ build.gradle ของ Module ของเรา แล้วเพิ่ม Flavors ลงไป แบบนี้
ใน Android studio 3.0+ มันต้องใส่ flavor dimension ด้วย เป็นการจับกลุ่มกัน

android{
   ..
   ..
   flavorDimensions "mode"
   productFlavors {
        cryptostory {
            dimension "mode"
            applicationId "com.benzneststudios.cryptostory"
            proguardFile 'proguard-rules.pro'
        }
        bxstory {
            dimension "mode"
            applicationId "com.benzneststudios.bxstory"
            proguardFile 'proguard-rules.pro'
        }
    }
}

จากนั้นลอง sync gradle ดูครับ

 

หากในโปรเจคมี Firebase หรือที่เป็นไฟล์ google-servie.json อาจจะเจอ error ขึ้นแบบนี้

Error:Execution failed for task ':app:processBxstoryDebugGoogleServices'.
> No matching client found for package name

1

นั่นก็คือมันหาไฟล์ google-servie.json ที่มี package name ใหม่ไม่เจอ วิธีแก้คือให้ไปสร้าง Firebase project แล้วเอาไฟล์ google-service.json อันใหม่ มาใส่ในโฟลเดอร์ Build variant ใหม่ โดยสร้างโฟลเดอร์ใหม่ที่ชื่อเดียวกับ Flavor ที่เราตั้งไว้

2

 

จากนั้นลองกดที่แท็บ Build Variants จะมีเมนูให้เลือก
cryptostory คือ packagename เดิม อันใหม่ของผมคือ bxstory

3

 

ซึ่งพอ RUN แล้วจะได้แอปเดิมทุกประการเพิ่มขึ้นมาอีกตัว
ต้องเลือก Build Variant ให้ถูกอันด้วยนะ

4

 

Override ไฟล์ Resource

ต่อไปจะลองเปลี่ยนไอคอนกับชื่อแอปของ Build variant ตัวใหม่นะครับ
โดยก่อนอื่นก็เอาไอคอนไปใส่ใน res ของ build variant อันใหม่
แล้วก็ string resource ด้วย

5  6

โดยใน string.xml มีแค่ส่วนของชื่อแอป

<resources>
    <string name="app_name">Crypto BX</string>
</resources>

นั่นก็หมายความว่า icon , string มันจะ override ทับกับของ Main นั่นเอง

 

พอลอง RUN ดู จะพบว่าไอคอนกับชื่อแอปเปลี่ยนไปตามที่เราตั้งไว้แล้วละ

7

 

Build Variant กับ Fabric

ตอนแรกผมกังวลว่าพอใช้ Build variant พวก Fabric , Crashlytic มันจะมองว่าเป็นแอปเดิมหรือป่าว แต่ปรากฏว่ามันแยกให้ตาม packagename เลย ยอดเยี่ยมมากๆ

10

 

สรุป

ทำให้ตอนนี้ผมสามารถทำแอปใหม่ที่ใช้โค้ดเดิมแบบอยู่ในโปรเจคเดิมได้แล้ว ตอนนี้พอจะเข้าใจหลักการของมันแล้ว เป็นอะไรที่มีประโยชน์มากๆครับ

//อันนี้เขียนเป็นบันทึกไว้เฉยๆ เดี๋ยวมีอะไรมาเพิ่มเติมอีกที