Quản lý cấu hình trong phát triển di động: nó là gì, các tùy chọn và cách thiết lập

Tác giả: IT Sectr Đã đăng: 2026-05-30 Thời gian đọc: 8 phút

Quản lý cấu hình là một trong những khía cạnh bị đánh giá thấp nhất trong phát triển di động. Theo CloudBees (2025), 47% sự cố trong production liên quan đến cấu hình build không chính xác. Thiết lập đúng Build Variant, Scheme và tệp .env là chìa khóa cho CI/CD ổn định và bản phát hành có thể dự đoán trước.

Những điểm chính

  • Quản lý cấu hình trong ứng dụng di động dựa trên Build Variant (Android), Scheme (iOS) và .env (đa nền tảng) — 47% sự cố production liên quan đến cài đặt không chính xác.
  • iOS sử dụng Scheme + .xcconfig. Scheme quản lý việc xây dựng, kiểm thử và lưu trữ. .xcconfig chuyển cài đặt build vào tệp.
  • Công cụ đa nền tảng — pubspec.yaml (Flutter), Podfile (CocoaPods), .env (biến môi trường) — tập trung hóa cấu hình.
  • Biên dịch có điều kiện — bao gồm/loại trừ mã ở giai đoạn biên dịch. #if DEBUG, BuildConfig.DEBUG — để gỡ lỗi mà không thay đổi hành vi bản phát hành.
  • Khóa API và bí mật không thể lưu trữ trong mã. Sử dụng .env, Build Config hoặc máy chủ proxy. Việc dịch ngược .apk/.ipa rất dễ dàng.

Quản lý cấu hình trong Android: Build Variant và build.gradle

Build Variant — sự kết hợp giữa Build Type (debug/release/staging) và Product Flavor (free/paid, demo/full). Gradle tự động tạo variant cho mỗi tổ hợp: freeDebug, freeRelease, paidDebug, paidRelease. Mỗi variant có thể có mã, tài nguyên và phụ thuộc riêng — đây là nền tảng của quản lý cấu hình trong ứng dụng di động trên Android.

Build Variant vs Product Flavor

Build Type — cài đặt build: có bật gỡ lỗi không, ký, tối ưu hóa ProGuard. debug mặc định chứa debuggable=true, release — minifyEnabled=true.

Product Flavor — biến thể ứng dụng: miễn phí (free), trả phí (paid), demo. Các flavor có thể có applicationId, tài nguyên, phụ thuộc SDK khác nhau.

groovy
// build.gradle — cấu hình flavor sản phẩm Android
android {
    productFlavors {
        free {
            applicationId "com.example.app.free"
            versionName "1.0-free"
        }
        paid {
            applicationId "com.example.app.paid"
            versionName "1.0-paid"
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }
}

Ví dụ tạo hai flavor: free và paid. Một applicationId riêng được đặt cho free — điều này cho phép cài đặt cả hai ứng dụng trên một thiết bị. BuildConfig được tạo cho mỗi variant: BuildConfig.FLAVOR = "free", BuildConfig.BUILD_TYPE = "debug". Sử dụng BuildConfig trong mã cho logic có điều kiện.

settings.gradle và Gradle KTS

settings.gradle — tệp Gradle gốc mô tả các mô-đun của dự án.

Gradle KTS — một giải pháp thay thế cho Groovy sử dụng Kotlin DSL. KTS cung cấp tính năng tự động hoàn thành trong Android Studio và kiểm tra kiểu. Được khuyến nghị cho các dự án mới.

Quản lý cấu hình trong iOS: Scheme và .xcconfig

Quản lý cấu hình trong iOS dựa trên Scheme — cấu hình Xcode xác định cái gì và làm thế nào để xây dựng: Build Configuration (Debug/Release), kiểm thử, phân tích, lưu trữ. Scheme có thể được nhân bản cho các môi trường khác nhau (Development, Staging, Production). Scheme được lưu trữ trong tệp .xcscheme trong thư mục xcshareddata.

Tệp .xcconfig

.xcconfig — tệp cấu hình Xcode lưu trữ cài đặt build dưới dạng văn bản. Để quản lý cấu hình ứng dụng di động, iOS sử dụng .xcconfig: kiểm soát phiên bản trong Git, tái sử dụng giữa các dự án, ít cài đặt thủ công hơn. Trong .xcconfig, SWIFT_ACTIVE_COMPILATION_CONDITIONS, PRODUCT_BUNDLE_IDENTIFIER, CODE_SIGN_IDENTITY được thiết lập.

Info.plist — tệp siêu dữ liệu của ứng dụng. Nó lưu trữ phiên bản, định danh, quyền. Info.plist có thể khác nhau cho mỗi Scheme — thông qua Info.plist File trong Build Settings.

AndroidManifest.xml — tương đương trên Android: lưu trữ quyền, thành phần, siêu dữ liệu.

Scheme vs Build Configuration

Scheme — kịch bản build (làm gì). Build Configuration — tập hợp cài đặt (làm như thế nào). Một Scheme sử dụng một Build Configuration (Debug hoặc Release). Cho CI/CD: cấu hình hành động Archive thành Release và hành động Test thành Debug trong cùng một Scheme.

Quản lý cấu hình trong Flutter và React Native: pubspec.yaml, Podfile, .env

pubspec.yaml — tệp cấu hình dự án Flutter. Chứa các phụ thuộc, phiên bản, tài nguyên. Hỗ trợ biến môi trường thông qua --dart-define.

Podfile — trình quản lý phụ thuộc CocoaPods cho iOS. Xác định phiên bản thư viện và nền tảng.

.env — tệp với các biến môi trường cho tất cả nền tảng. Flutter và React Native sử dụng cách tiếp cận khác nhau cho quản lý cấu hình: dart-define trong Flutter, react-native-config trong React Native. Quản lý cấu hình trong các dự án đa nền tảng liên quan đến các công cụ khác nhau tùy theo stack.

.env và Biến môi trường

.env — tệp văn bản với các cặp khóa=giá trị. Không commit vào Git (thêm vào .gitignore). Cho Flutter — flutter_dotenv, cho iOS — Config.xcconfig với #include, cho Android — BuildConfig. Biến env: API_URL, SENTRY_DSN, APP_SECRET. Trong quản lý cấu hình phát triển di động, .env là tiêu chuẩn thực tế để lưu trữ bí mật bên ngoài kho lưu trữ.

Podfile và pubspec.yaml

Podfile mô tả phụ thuộc CocoaPods và nền tảng (platform :ios, '15.0'). pubspec.yaml cho Flutter — dependencies và dev_dependencies. Cả hai đều hỗ trợ phụ thuộc có điều kiện: pod 'Analytics', :configs => ['Release'] hoặc flutter pub add --flavor free. Tại IT Sectr, chúng tôi sử dụng .env + BuildConfig cho bí mật và Podfile cho phụ thuộc gốc trong các dự án di động.

Tham số Android iOS Flutter
Đơn vị cấu hìnhBuild VariantSchemeFlavor (--flavor)
Tệp buildbuild.gradle.xcconfigpubspec.yaml
Mã có điều kiệnBuildConfigActive Compilation Conditionsdart-define
Bí mậtBuildConfig/NDK.xcconfig.env/dart-define
Trình quản lý phụ thuộcGradle (Maven)SPM/CocoaPodspub (dart)

Bảng cho thấy sự khác biệt chính trong quản lý cấu hình giữa các nền tảng di động. Android cung cấp sự linh hoạt hơn thông qua Build Variant. iOS đơn giản hơn nhưng kém linh hoạt hơn. Flutter tập trung cấu hình trong dart-define, nhưng các phụ thuộc gốc vẫn yêu cầu cấu hình Podfile/build.gradle.

Biên dịch có điều kiện trong quản lý cấu hình

Biên dịch có điều kiện — bao gồm hoặc loại trừ mã ở giai đoạn biên dịch tùy theo cờ. Đây là một phần của quản lý cấu hình: nó cho phép nhúng các công cụ gỡ lỗi (ghi log, thanh tra) trong bản build debug và loại bỏ chúng khỏi bản phát hành. Việc triển khai khác nhau giữa các nền tảng.

Biên dịch có điều kiện trong Swift

#if DEBUG — chỉ thị tiền xử lý Swift. Mã bên trong khối chỉ được biên dịch trong cấu hình Debug. Các cờ khác: #if !RELEASE, #if targetEnvironment(simulator). Active Compilation Conditions trong Build Settings — thêm cờ tùy chỉnh qua -D FLAG_NAME. Quản lý cấu hình build thông qua điều kiện biên dịch là thực tiễn tiêu chuẩn trong iOS.

Biên dịch có điều kiện trong Kotlin

BuildConfig.DEBUG — trường boolean, true trong bản build debug. BuildConfig được Gradle tự động tạo ra. Đối với cờ tùy chỉnh, sử dụng buildConfigField trong build.gradle: buildConfigField "boolean", "REPORT_CRASHES", "true". Trong mã: if (BuildConfig.REPORT_CRASHES) { ... }.

Biên dịch có điều kiện trong Flutter

dart-define — cờ biên dịch Flutter: flutter run --dart-define=ENV=staging. Trong mã: const env = String.fromEnvironment('ENV', defaultValue: 'production'). Để xây dựng ứng dụng di động có điều kiện, sử dụng plugin build_runner với tạo mã.

Câu hỏi thường gặp

Build Variant khác Product Flavor trong Android như thế nào?

Build Variant = Build Type (debug/release) + Product Flavor. Flavor là biến thể ứng dụng (trả phí/miễn phí, máy khách/máy chủ), Build Type là cài đặt build (gỡ lỗi/tối ưu hóa). Sự kết hợp flavour + type tạo thành variant: ví dụ, paidDebug.

.xcconfig là gì và tại sao cần nó trong iOS?

.xcconfig là tệp cấu hình Xcode lưu trữ cài đặt build dưới dạng văn bản. Nó cho phép di chuyển cài đặt từ dự án Xcode sang các tệp thân thiện với Git, đơn giản hóa CI/CD và làm việc nhóm trong các dự án di động.

Làm thế nào để lưu trữ khóa API an toàn trong ứng dụng di động?

Khóa API không thể lưu trữ trong mã — bất kỳ .apk hoặc .ipa nào cũng có thể bị dịch ngược. Sử dụng tệp .env, proxy backend hoặc che giấu qua Build Config. IT Sectr khuyến nghị lưu trữ bí mật trên máy chủ và cấp chúng cho máy khách sau khi xác thực.

Biên dịch có điều kiện là gì và khi nào sử dụng nó?

Biên dịch có điều kiện là bao gồm/loại trừ mã ở giai đoạn biên dịch tùy theo cờ. Trong Swift — #if DEBUG, trong Kotlin — BuildConfig.DEBUG. Được sử dụng để bật ghi log trong debug và tắt trong bản phát hành. Đây là yếu tố chính của quản lý cấu hình trong phát triển di động.

Có cần Podfile trong dự án không dùng CocoaPods không?

Podfile chỉ được sử dụng khi làm việc với CocoaPods. Không cần thiết cho SPM hoặc Carthage. Đừng để Podfile trong dự án nếu bạn đã từ bỏ CocoaPods — điều này gây nhầm lẫn cho nhóm và hệ thống CI/CD.

Tổng kết

  • Quản lý cấu hình trong ứng dụng di động là nền tảng của CI/CD ổn định. Android sử dụng Build Variant, iOS sử dụng Scheme, Flutter sử dụng dart-define.
  • Android: Build Variant = Build Type × Product Flavor. BuildConfig được tạo cho mỗi variant.
  • iOS: Scheme + .xcconfig quản lý cấu hình. Info.plist — siêu dữ liệu ứng dụng.
  • Flutter: dart-define cho biến build. pubspec.yaml cho phụ thuộc.
  • Biên dịch có điều kiện (#if DEBUG, BuildConfig.DEBUG) — một phần của quản lý cấu hình, cách tiêu chuẩn để loại bỏ mã gỡ lỗi trong bản phát hành.
  • .env — lưu trữ an toàn bí mật bên ngoài kho lưu trữ. Không commit .env vào Git.
  • Quản lý cấu hình trong các dự án di động cần được chú ý từ commit đầu tiên — thiết lập build đúng đắn tiết kiệm hàng giờ gỡ lỗi cho mỗi bản phát hành.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án