Build các phiên bản apk với tính năng khác nhau bằng flavors trong Android Studio
Bài đăng này đã không được cập nhật trong 3 năm
Xin chào các bạn!
Trong project tôi đang làm khách hàng có yêu cầu chia làm 3 phiên bản development, staging, production mỗi phiên bản lại có sự khác nhau về tính năng, các urls api ... Sẽ có người nghĩ ra cách là phát triển trên 3 branch khác nhau nhưng bất tiện là mỗi khi viết thêm source code bạn sẽ phải sang cả 3 branch để rebase nhánh chính.
Cách mà tôi làm đó là dùng productFlavors để chia ra các build variants khác nhau như sau:
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0.0"
}
productFlavors {
def URL_END_POINT = "URL_END_POINT"
def APP_LINKS_HOST_NAME = "hostName"
development {
applicationId "com.framgia.awesome.development"
versionNameSuffix '-DEV'
manifestPlaceholders = [(APP_LINKS_HOST_NAME): "dev.domain.com"]
buildConfigField "String", URL_END_POINT, "\"https://api.dev.domain.com\""
}
staging {
applicationId "com.framgia.awesome.staging"
versionNameSuffix '-STG'
manifestPlaceholders = [(APP_LINKS_HOST_NAME): "staging.domain.com"]
buildConfigField "String", URL_END_POINT, "\"https://api.staging.domain.com\""
}
production {
applicationId "com.framgia.awesome"
manifestPlaceholders = [(APP_LINKS_HOST_NAME): "domain.com"]
buildConfigField "String", URL_END_POINT, "\"https://api.domain.com\""
}
}
Application Id
Mỗi phiên bản build variant sẽ có app id khác nhau tương ứng
Manifest Place holders
Bạn cũng có thể đặt một hoặc nhiều biến manifest place holders ví dụ như app name, api key tương ứng mỗi phiên bản, lưu ý nếu có nhiều biến bạn cần đặt dạng map như ví dụ trên
API URLS
Tôi sử dụng buildConfigFields để cấu hình api urls như vậy tùy theo build variants chúng ta chọn lúc build mà app sẽ chạy trên url tương ứng. Khi sử dụng chỉ cần gọi BuildConfig.URL_END_POINT và không cần quan tâm đến build variant hiện tại là gì
Resources khác nhau
Ví dụ 3 phiên bản có 3 icon, app name khác nhau thì với flavors sẽ dễ dàng làm được điều đó như sau
Trong thư mục src
của dự án tạo các thư mục tương ứng có tên giống với các flavors, trong mỗi thư mục tạo thư mục con tên là res/drawable
và res/values
Với mỗi phiên bản flavor bạn chỉ cần đặt file icon vào thư mục drawable
(hoặc các thư mục mipmap-xhdpi ...) tương ứng.
Tạo file strings.xml trong thư mục res/values
và mỗi file string khai báo 1 app_name
tùy theo phiên bản.
Khi chọn variants để build gradle sẽ build ra apk với app icon, app name và các thông tin cấu hình bên trên tương ứng cho bạn.
Source code khác nhau
Ví dụ mình có 2 phiên bản ứng dụng, trả phí và miễn phí, phiên bản trả phí sẽ không có quảng cáo
Lúc này để sử dụng flavors làm được điều đó trước hết mình phải có 1 class AdsManager nhưng mỗi flavor sẽ được implement khác nhau, với bản trả phí AdsManager sẽ ẩn quảng cáo đi và không load quảng cáo về nữa và ngược lại với bản miễn phí.
Cách làm cũng tương tự như Resources
đó là trong thư mục src
tạo các thư mục tương ứng với flavors
Tại các thư mục tương ứng với flavor bạn tạo thư mục `java/package_name/AdsManager.java
Khi muốn chạy với phiên bản nào bạn chỉ cần vào Build Variants để chọn, gradle sẽ build ra bản tương ứng cho bạn
Trên đây là một số ứng dụng flavors của mình trong dự án, nhờ flavors mà việc chia phiên bản dễ dàng hơn rất nhiều. Xin cảm ơn.
All rights reserved