Cara meneruskan parameter ke kode Java dalam konfigurasi run/debug dari Android Studio

Aplikasi Android saya melakukan beberapa permintaan http ke server saya. Namun terkadang saya men-debug kode api baru yang berjalan di mesin pengembangan saya. Saya ingin dapat meneruskan sesuatu (seperti variabel lingkungan) sehingga dalam kode saya, jika ada, saya dapat menggunakannya sebagai nama host untuk permintaan api dari emulator Android.

Jadi saya mencari cara untuk menyampaikan sesuatu seperti:

API_SERVER=http://10.0.2.2/myapp/

dan dalam kode saya, saya akan menggunakannya, misalnya:

final static String API_SERVER_REAL = "http://example.com/";
final String apiServerOverride = System.getenv("API_SERVER");
final String API_SERVER = (null != apiServerOverride && !apiServerOverride.isEmpty() ? apiServerOverride : API_SERVER_REAL);

person Gavriel    schedule 23.02.2014    source sumber
comment
Dan pertanyaannya adalah bagaimana cara mengatur konfigurasi run agar mudah dari Android Studio? Daripada variabel lingkungan, saya menyarankan parameter baris perintah.   -  person Scott Barta    schedule 23.02.2014
comment
Saya juga terbuka untuk itu. Bagaimana Anda meneruskan parameter baris perintah dari Android Studio ke aplikasi Android Anda, yang berjalan di emulator? Kelas mana yang mendapatkannya di aplikasi Android Anda? Saya ingin tahu apakah itu mungkin: stackoverflow.com/ pertanyaan/20197242/   -  person Gavriel    schedule 23.02.2014
comment
Oh, saya pikir Anda sedang berbicara tentang meneruskan informasi ke proses server. Tidak ada baris perintah untuk APK Android; Anda dapat menulis nilai ke Sqlite melalui perintah adb shell atau mungkin hanya menulis file ke sistem file lokal.   -  person Scott Barta    schedule 24.02.2014
comment
Kemungkinan duplikat dari Meneruskan parameter -P ke gradle dari Android studio   -  person Rostyslav Roshak    schedule 04.08.2017
comment
@RostyslavRoshak pertanyaan ini dari tahun 2014, yang lainnya dari tahun 2015, jadi bagaimana ini bisa menjadi duplikat dari yang lain? Juga pertanyaan lainnya adalah tentang bagaimana cara meneruskan sesuatu ke GRADLE, sedangkan pertanyaan ini adalah bagaimana cara meneruskan sesuatu ke kode JAVA dari APP   -  person Gavriel    schedule 06.08.2017


Jawaban (4)


Saya sarankan menggunakan productFlavors. Setiap ragam dapat berisi pengaturan khusus lingkungan. Saya hanya memiliki kelas bernama 'Lingkungan' yang berisi semua public static final Strings yang saya perlukan dan setiap ragam produk menyertakan versi berbeda dari kelas ini dengan nilai yang ditetapkan untuk lingkungan.

person Nebu    schedule 21.07.2014
comment
Dokumen yang Anda tautkan sebenarnya sudah kedaluwarsa dan tidak digunakan lagi sekarang. Dalam kasus penggunaan ini, konstruksi buildTypes lebih lebih tepat untuk digunakan daripada productFlavours. Perbedaannya dibahas di sini, dan dokumentasi terkini di di sini. - person ScottyC; 13.02.2018

Saya tahu thread ini sudah cukup lama, tapi menurut saya tidak ada jawaban yang diberikan benar-benar memecahkan masalah. Flavor tidak cocok untuk membuat parameter bangunan Anda dengan hal-hal seperti URL API, dan lebih buruk lagi untuk hal-hal seperti kunci API, dll.

Pertama, build.gradle yang mendefinisikan ragam adalah bagian dari sumber proyek, oleh karena itu tidak boleh berisi informasi tersebut agar dapat dimasukkan dengan aman ke dalam sistem kendali sumber.

Kedua, mungkin timbul kebutuhan untuk menguji ragam yang berbeda terhadap titik akhir/kunci API yang berbeda. Bagaimana jika Anda hanya ingin melakukan debug pada server http yang baru saja Anda buat untuk mengatasi bug? Apakah Anda akan menciptakan rasa untuk itu? Mungkin tidak... Perasa cocok untuk hal-hal seperti "rasa gratis" dan "rasa premium".

Masalah ini mudah diselesaikan dengan menggunakan flag gradle -P. Anda dapat mengakses properti gradle yang diteruskan dengan cara ini sebagai variabel reguler di dalam gradle.build Anda, dan Anda dapat memvariasikan perilakunya.

Jika Anda ingin memasukkan tanda ini lebih jauh ke dalam aplikasi Anda, Anda dapat menggunakan solusi Scott yang diposting di sini, dikombinasikan dengan tanda yang disediakan.

Perintah build mungkin akan terlihat seperti:

$ gradle build -Papiroot=http://www.example.com

Dan di build.gradle Anda, Anda akan mendefinisikan tugas writeValue seperti ini:

task writeValue(type:Exec) {
    commandLine '/usr/local/bin/adb', 'shell', "echo 'API_SERVER=${apiroot}' > /data/data/values.properties"
}

Sekadar informasi, flag -P dapat dikonfigurasi dengan mudah di Android Studio dengan menavigasi dari menu:

Jalankan -> Jalankan/Debug Konfigurasi -> Default -> Gradle -> Parameter Skrip

person Karol Majta    schedule 23.04.2015
comment
Saya suka pendekatan ini tetapi ada satu hal kecil yang hilang: bagaimana cara agar plugin Android Studio Gradle meneruskan variabel -P saat menyinkronkan proyek ke Android Studio? Tahukah Anda apakah ini mungkin? - person Julian Cerruti; 09.11.2015

Mungkin hal paling sederhana adalah menulis data yang ingin Anda sampaikan ke file di perangkat di /data/data; aplikasi Android Anda dapat membaca perangkat dengan mudah (mungkin menjadikannya file .properties dan menggunakan java.util.Properties untuk membacanya). Untuk menuliskannya, gunakan tugas seperti ini di file build.gradle Anda (dan gunakan jalur yang benar ke perintah adb untuk pengaturan Anda):

task writeValue(type:Exec) {
    commandLine '/usr/local/bin/adb', 'shell', 'echo \'API_SERVER=http://10.0.2.2/myapp/\' > /data/data/values.properties'
}

Ada dokumentasi tentang tugas-tugas Gradle exec di http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html

Anda dapat menjalankan tugas ini secara manual dari Android Studio dengan menggunakan tampilan tugas Gradle:

Tampilan layar tampilan tugas Gradle

person Scott Barta    schedule 24.02.2014
comment
Apakah tidak mungkin untuk mengaitkan tugas tersebut ke beberapa tugas sistem build Android default lainnya sehingga tugas tersebut dijalankan secara otomatis setelah Anda menekan tombol Jalankan? - person dirleyrls; 10.01.2015

Karena adanya bug di Android Studio, Anda tidak dapat meneruskan parameter vm atau skrip dari konfigurasi gradle. Masalahnya di sini.

Sebagai solusinya di envs Linux (mungkin juga Mac), Anda dapat membuat konfigurasi bash di mana Anda dapat menambahkan semua parameter yang diinginkan.

person user2468170    schedule 08.09.2015