Variabel Lingkungan: Apa Itu, Penggunaan dan Konfigurasi dalam Proyek Mobile

Penulis: IT Sectr Diterbitkan: 2026-05-31 Waktu membaca: 8 mnt

Variabel lingkungan adalah nilai dinamis yang diteruskan ke aplikasi saat startup untuk mengonfigurasi perilaku tanpa mengubah kode. Mereka memungkinkan pemisahan konfigurasi pengembangan, pengujian, dan produksi. Menurut Twelve-Factor App, 2025, konfigurasi harus disimpan dalam variabel lingkungan, bukan dalam kode. Variabel lingkungan memastikan pengelolaan kunci API, URL backend, dan flag fungsionalitas yang aman.

Poin Utama

  • Variabel lingkungan memisahkan konfigurasi aplikasi dari kode sumber untuk lingkungan runtime yang berbeda
  • File .env menyimpan variabel dalam format KEY=VALUE dan dikeluarkan dari repositori melalui .gitignore
  • iOS menggunakan xcconfig dan Build Settings untuk meneruskan variabel pada tahap kompilasi
  • Android menggunakan BuildConfig dan gradle.properties untuk menghasilkan bidang konfigurasi
  • Keamanan: kunci dan token harus dimuat melalui CI/CD, tidak disimpan dalam kode atau repositori

Apa itu variabel lingkungan

Variabel lingkungan adalah pasangan kunci-nilai, yang dapat diakses oleh proses aplikasi melalui API sistem operasi. Mereka diteruskan ke proses saat pembuatannya dan hanya ada selama proses tersebut berjalan. Tidak seperti parameter konfigurasi yang tertanam dalam kode sumber, variabel lingkungan tidak memerlukan kompilasi ulang untuk mengubah nilai. Ini adalah prinsip fundamental Twelve-Factor App yang memastikan pemisahan yang jelas antara kode dan konfigurasi.

Dalam pengembangan mobile, variabel lingkungan memecahkan masalah konfigurasi yang berbeda untuk berbagai lingkungan: pengembang menggunakan server lokal, penguji menggunakan staging, pengguna menggunakan produksi. Alih-alih menyimpan tiga URL backend dalam kode dengan operator kondisional if-else, pengembang meneruskan satu URL melalui variabel lingkungan pada tahap build. Ini menyederhanakan kode dan menghilangkan risiko penggunaan server produksi secara tidak sengaja di lingkungan pengujian.

Keuntungan utama adalah keamanan: data sensitif tidak masuk ke repositori kode. Kunci API, rahasia Firebase, token akses backend, dan sertifikat dimuat melalui CI/CD langsung ke lingkungan build. Jika penyerang mendapatkan akses ke repositori kode, dia tidak akan menemukan rahasia di sana, karena rahasia tersebut disimpan di penyimpanan terlindungi sistem CI dan hanya diteruskan pada tahap build file biner.

Mengapa variabel lingkungan diperlukan dalam pengembangan mobile

Proyek mobile memiliki setidaknya tiga lingkungan: development, staging, dan produksi. Setiap lingkungan membutuhkan konfigurasi sendiri: URL server, nama paket, skema penandatanganan, dan sertifikat notifikasi push. Tanpa variabel lingkungan, pengembang harus mengubah konfigurasi secara manual sebelum setiap build, yang menyebabkan kesalahan: kunci produksi yang terlupakan dalam build pengujian dapat menyebabkan pengiriman notifikasi ke pengguna nyata atau konsumsi API berbayar.

Pemisahan lingkungan

Variabel lingkungan memungkinkan pergantian backend tanpa mengubah kode: cukup mengganti nilai dalam variabel API_BASE_URL. Flag fungsionalitas (feature flags) dikelola melalui variabel seperti FEATURE_CHAT_ENABLED=true, yang memungkinkan mengaktifkan fitur baru di staging tanpa memengaruhi produksi. Untuk setiap lingkungan, file .env sendiri dibuat yang dimuat pada tahap build.

dart
class AppConfig {
  static final String apiBaseUrl =
    const String.fromEnvironment('API_BASE_URL',
      defaultValue: 'http://localhost:8080');
}

Keamanan kunci

Kunci yang dikodekan secara keras adalah kerentanan umum pada aplikasi mobile. Penyerang mendekompilasi APK atau IPA menggunakan alat seperti jadx atau Hopper dan mengekstrak rahasia dari file biner. Bahkan obfuskasi pun tidak melindungi literal string — mereka mudah ditemukan dalam kode setelah dekompilasi. Variabel lingkungan memecahkan masalah ini dengan meneruskan kunci pada tahap build melalui CI/CD, di mana kunci tersebut ditutupi dalam log.

kotlin
object Config {
    val apiKey: String =
        System.getenv("API_KEY") ?: throw
            IllegalStateException("API_KEY not set")
}

Integrasi CI/CD

Variabel lingkungan terintegrasi dengan pipeline build: GitHub Actions, GitLab CI, Bitrise, dan CircleCI mendukung variabel rahasia yang tidak ditampilkan dalam log. Pada tahap build, CI menyisipkan nilai yang sesuai tergantung pada cabang atau tag: untuk cabang develop digunakan staging, untuk tag v* digunakan produksi. Ini mengotomatiskan proses dan menghilangkan faktor manusia, memastikan setiap build menerima set konfigurasi yang benar.

File .env dan pustaka manajemen

File .env adalah cara standar untuk menyimpan variabel lingkungan dalam format KEY=VALUE. File ini tidak disertakan dalam repositori, sebaliknya .env.example dengan template semua variabel dan nilai kosong ditambahkan ke repositori. Setiap pengembang membuat file .env sendiri dengan pengaturan lokal, tanpa memengaruhi konfigurasi anggota tim lainnya. Untuk lingkungan yang berbeda, file terpisah digunakan: .env.dev, .env.stage, .env.prod.

bash
# .env.example — template untuk pengembang
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=

Untuk proyek mobile, ada pustaka khusus untuk bekerja dengan file .env:

  • flutter_dotenv (Flutter) — memuat variabel dari .env saat runtime melalui dotenv.load()
  • BuildConfig (Android) — menghasilkan bidang bertipe dari nilai build.gradle
  • xcconfig (iOS) — menghubungkan file konfigurasi ke skema build Xcode yang berbeda
  • react-native-config (React Native) — manajemen variabel melalui file .env

Pengaturan cabang di CI/CD memungkinkan penyisipan file .env yang berbeda: .env.dev untuk server pengujian, .env.stage untuk pra-rilis, dan .env.prod untuk publikasi di toko aplikasi. File dengan rahasia dimuat dari penyimpanan aman (Vault, AWS Secrets Manager) dan tidak disimpan di repositori. Ini memastikan bahwa bahkan jika sistem kontrol versi dikompromikan, rahasia tetap terlindungi.

Variabel lingkungan dalam proyek iOS

EkOS iOS menggunakan file xcconfig untuk mengelola variabel di tingkat build. Mereka terhubung ke skema Xcode dan memungkinkan penimpaan nilai untuk konfigurasi Debug dan Release. File xcconfig mendukung pewarisan: file dasar dengan pengaturan umum dan file khusus untuk setiap lingkungan dapat dibuat.

Konfigurasi file xcconfig

File xcconfig menyimpan variabel dalam format KEY = VALUE dan terhubung ke skema build di Xcode melalui pengaturan Configuration. Variabel dari xcconfig dapat diakses di Info.plist melalui sintaks $(VARIABLE_NAME), yang memungkinkan penggunaan pengidentifikasi bundel dan nama aplikasi yang berbeda untuk skema yang berbeda. Untuk identifikasi lingkungan yang cepat, sufiks Dev atau Staging ditambahkan ke nama aplikasi.

bash
# Config/Dev.xcconfig — konfigurasi pengembangan
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev

Kode Swift untuk membaca variabel

Untuk akses runtime ke variabel di iOS, file Configuration.swift digunakan, yang membaca nilai dari Info.plist melalui Bundle.main.object(forInfoDictionaryKey:). Pendekatan ini memastikan bahwa variabel ditentukan pada tahap build dan tersedia untuk aplikasi segera setelah startup. Nilai dibaca sekali saat inisialisasi modul dan di-cache untuk akses cepat selama siklus hidup aplikasi.

swift
enum AppEnvironment {
    static var apiBaseURL: URL {
        guard let urlString = Bundle.main
            .object(forInfoDictionaryKey: "API_BASE_URL"),
              let url = URL(string: urlString as! String)
        else { fatalError("API_BASE_URL is not configured") }
        return url
    }

    static var isChatEnabled: Bool {
        Bundle.main.object(
            forInfoDictionaryKey: "FEATURE_CHAT_ENABLED"
        ) as? Bool ?? false
    }
}

Variabel lingkungan dalam proyek Android

Android mendukung variabel lingkungan melalui BuildConfig — kelas yang dihasilkan secara otomatis yang bidangnya ditentukan dalam file build.gradle modul. BuildConfig dibuat pada tahap kompilasi untuk setiap flavor dan tipe build secara terpisah. Ini memungkinkan nilai yang berbeda untuk debug dan release tanpa menggunakan operator kondisional dalam kode, yang meningkatkan kinerja dan keamanan.

Konfigurasi bidang BuildConfig

Bidang BuildConfig diatur melalui buildConfigField di defaultConfig atau di buildTypes tertentu. Untuk setiap lingkungan, buildType atau productFlavor terpisah dibuat. Ini memastikan isolasi konfigurasi yang ketat: debug menggunakan server lokal, release menggunakan produksi. Bidang BuildConfig diketik secara statis, yang menghilangkan kesalahan saat merujuknya dalam kode.

groovy
// build.gradle (Module: app)
android {
    defaultConfig {
        buildConfigField "String", "API_BASE_URL",
            "\"http://localhost:8080\""
    }
    buildTypes {
        debug {
            buildConfigField "String", "API_BASE_URL",
                "\"http://dev.api.itsectr.com\""
        }
        release {
            buildConfigField "String", "API_BASE_URL",
                "\"https://api.itsectr.com\""
        }
    }
}

gradle.properties untuk nilai bersama

File gradle.properties di root proyek menyimpan variabel global Gradle. Mereka dapat diakses di semua modul melalui sintaks $variableName dan digunakan untuk menentukan versi dependensi, flag build, dan kunci API. Tidak seperti BuildConfig, gradle.properties hanya berfungsi pada tahap konfigurasi Gradle, bukan pada runtime aplikasi. Oleh karena itu, kata sandi dan kunci API yang ditentukan dalam gradle.properties tidak terlihat dalam kode yang didekompilasi, karena hanya digunakan untuk menghasilkan BuildConfig pada tahap kompilasi.

groovy
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...

Untuk transmisi rahasia yang aman dalam proyek Android, disarankan menggunakan local.properties (dikecualikan dari VCS) atau memuat nilai dari variabel CI/CD ke build.gradle melalui System.getenv(). Ini memastikan bahwa kunci tidak masuk ke repositori. Saat mempublikasikan di Google Play Console, pastikan semua kunci debug telah diganti dengan versi produksi melalui buildTypes atau productFlavors yang berbeda dengan nilai BuildConfig yang sesuai.

Pertanyaan yang Sering Diajukan

Bisakah variabel lingkungan digunakan di Flutter?

Ya, Flutter mendukung variabel lingkungan melalui paket flutter_dotenv untuk akses runtime atau melalui saluran native untuk variabel platform. Di Dart, konstruktor String.fromEnvironment juga tersedia untuk meneruskan nilai pada tahap kompilasi melalui --dart-define, yang merupakan metode yang lebih disukai untuk proyek Flutter.

Apa perbedaan antara BuildConfig dan gradle.properties?

BuildConfig adalah kelas Java dengan bidang bertipe, yang dihasilkan pada tahap kompilasi untuk setiap buildType dan flavor. gradle.properties adalah file teks dengan pasangan kunci-nilai, yang dapat diakses oleh semua modul Gradle pada tahap konfigurasi build. BuildConfig bekerja di runtime aplikasi, gradle.properties — hanya di skrip Gradle.

Bagaimana mencegah kebocoran file .env ke repositori?

Tambahkan .env ke file .gitignore repositori Anda. Commit hanya .env.example dengan nilai kosong dan deskripsi setiap variabel ke repositori. Untuk CI/CD, gunakan rahasia terenkripsi di pengaturan GitHub Actions, GitLab CI, atau Bitrise, yang ditutupi dalam log dan tidak dapat dibaca setelah build selesai.

Bagaimana cara meneruskan variabel lingkungan melalui CI/CD?

Sebagian besar sistem CI mendukung variabel lingkungan rahasia. Di GitHub Actions ini adalah Secrets, di GitLab CI — CI/CD Variables, di Bitrise — Secrets. Pada tahap build, mereka diteruskan ke skrip build melalui process.env atau System.getenv(). Variabel rahasia tidak ditampilkan dalam log build dan tidak tersedia di fork repositori.

Apa itu feature flags melalui variabel lingkungan?

Feature flags adalah variabel boolean yang mengontrol pengaktifan atau penonaktifan fungsionalitas tanpa kompilasi ulang kode. Contoh: FEATURE_NEW_PAYMENT=true mengaktifkan sistem pembayaran baru di staging untuk pengujian. Di produksi, flag yang sama diatur ke false hingga penerapan backend sepenuhnya. Ini memungkinkan penerapan perubahan yang aman secara bertahap dan memutar kembali jika terjadi masalah.

Ringkasan

  • Variabel lingkungan memisahkan konfigurasi dari kode sumber untuk lingkungan pengembangan yang berbeda
  • File .env dengan template .env.example adalah standar manajemen variabel dalam tim dengan pemisahan lingkungan
  • iOS xcconfig menghubungkan file konfigurasi ke skema Xcode dengan dukungan pewarisan dan integrasi Info.plist
  • Android BuildConfig menghasilkan bidang bertipe dari build.gradle untuk setiap buildType secara terpisah
  • Rahasia CI/CD meneruskan data sensitif pada tahap build tanpa menyimpannya di repositori
  • Feature flags melalui variabel memungkinkan pengaktifan fungsionalitas di lingkungan tertentu tanpa kompilasi ulang
  • Keamanan: kunci dienkripsi di CI dan tidak masuk ke file biner aplikasi yang dapat didekompilasi

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga