Saya telah mengatur sdk.dir
dan ndk.dir
masuk local.properties
.
Bagaimana cara membaca nilai yang ditentukan di dalam sdk.dir
dan ndk.dir
di dalam build.gradle
file?
Saya telah mengatur sdk.dir
dan ndk.dir
masuk local.properties
.
Bagaimana cara membaca nilai yang ditentukan di dalam sdk.dir
dan ndk.dir
di dalam build.gradle
file?
local.properties
sedang digunakan untuk konfigurasi lokal Android Studio sendiri, dan memiliki file lain dengan nama yang sama dapat menimbulkan sedikit kebingungan. Lihat stackoverflow.com/a/49306091/1587329 di bawah ini
android.getSdkDirectory()
hanya berfungsi.
Jawaban:
Anda dapat melakukannya dengan cara ini:
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir')
def ndkDir = properties.getProperty('ndk.dir')
Gunakan project.rootProject
jika Anda membaca file properti dalam sub-proyek build.gradle
:
.
├── app
│ ├── build.gradle <-- You are reading the local.properties in this gradle build file
│ └── src
├── build.gradle
├── gradle
├── gradlew
├── gradlew.bat
├── settings.gradle
└── local.properties
Jika file properti berada dalam direktori sub-proyek yang sama, Anda hanya dapat menggunakan project
.
build.gradle
file project
adalah variabile yang mengacu pada proyek saat ini. Jika Anda memiliki kesalahan aneh, ajukan pertanyaan baru.
local.properties
default.account.iccid=123
build.gradle -
def Properties properties = new Properties()
properties.load(project.rootProject.file("local.properties").newDataInputStream())
defaultConfig {
resValue "string", "default_account_iccid", properties.getProperty("default.account.iccid", "")
}
dan dalam kode Anda mendapatkannya sebagai string lain dari Resources -
resources.getString(R.string.default_account_iccid);
Meskipun jawaban @ rciovati sudah pasti benar, ada juga cara alternatif untuk membaca nilai untuk sdk.dir
dan ndk.dir
.
Seperti yang ditunjukkan dalam entri blog ini oleh Gaku Ueda (Mendapatkan direktori ndk) BasePlugin
kelas menawarkan metode untuk getNdkFolder()
dan getSdkFolder()
:
def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()
Catatan: Anda mungkin harus mengubah com.android.application
ke com.android.library
jika Anda sedang membangun perpustakaan
Ini mungkin cara yang lebih elegan untuk membaca nilai folder. Meskipun harus dikatakan bahwa jawaban yang diberikan oleh @rciovati lebih fleksibel, karena seseorang dapat membaca nilai apa pun di file properti.
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
seperti yang dapat dilihat di sini: stackoverflow.com/questions/28615439/…
Jawaban yang memuat properti local.properties secara manual di atas jelas berfungsi, dan jawaban berikutnya yang mengharuskan Anda mengetahui plugin mana yang diterapkan harus berfungsi juga.
Pendekatan ini mungkin sedikit lebih baik untuk beberapa orang karena lebih umum karena berfungsi terlepas dari apakah Anda menggunakan plugin Application, Test, atau Library. Cuplikan ini juga memberi Anda akses terprogram penuh ke semua konfigurasi plugin Android (Ragam Produk, versi Build Tools, dan banyak lagi):
Jika Anda memerlukan akses dalam file build.gradle yang menggunakan Android Gradle Plugin, cukup akses Android DSL secara langsung karena sekarang tersedia secara langsung:
project.android.sdkDirectory
Bentuk yang lebih panjang (di bawah) berguna jika Anda membuat kelas atau Plugin Gradle Tasks kustom atau hanya ingin melihat properti mana yang tersedia.
// def is preferred to prevent having to add a build dependency.
def androidPluginExtension = project.getExtensions().getByName("android");
// List available properties.
androidPluginExtension.properties.each { Object key, Object value ->
logger.info("Extension prop: ${key} ${value}")
}
String sdkDir = androidPluginExtension.getProperties().get("sdkDirectory");
System.out.println("Using sdk dir: ${sdkDir}");
Pada saat posting ini ada juga adbExe
properti praktis yang pasti perlu diperhatikan.
Kode ini harus dijalankan SETELAH Android Gradle Plugin dikonfigurasi per siklus hidup Gradle. Biasanya ini berarti Anda memasukkannya ke dalam execute
metode Task
atau meletakkannya SETELAH android
deklarasi DSL di build.gradle
file aplikasi / perpustakaan Android ).
Cuplikan ini juga disertai peringatan bahwa saat Anda mengupgrade versi Android Gradle Plugin, properti ini dapat berubah saat plugin dikembangkan, jadi cukup uji saat berpindah antara versi Gradle dan plugin Android Gradle serta Android Studio (terkadang versi baru Android Studio membutuhkan versi baru Android Gradle Plugin).
Saya pikir itu cara yang lebih elegan.
println "${android.getSdkDirectory().getAbsolutePath()}"
ini bekerja pada android gradle 1.5.0.
Saya telah mengatur
sdk.dir
danndk.dir
masuklocal.properties
.
Anda dapat mempertimbangkan kembali jika Anda ingin menyetel nilai secara manual local.properties
seperti yang sudah digunakan oleh Android Studio (untuk proyek root), dan
Anda tidak boleh memodifikasi file ini secara manual atau memeriksanya ke dalam sistem kontrol versi Anda.
tetapi lihat pengecualian khusus tentang cmake yang tercantum di komentar.
android.getSdkDirectory()
local.properties
juga sah. Lihat developer.android.com/studio/projects/… : Google menyarankan untuk menambahkan cmake.dir="path-to-cmake"
guna menimpa perilaku pencarian default.
If you set this property, Gradle no longer uses PATH to find CMake.
. Jadi apa pendapat Anda tentang itu? Apakah Anda merekomendasikan untuk menggunakannya, atau apakah Anda hanya menyebutkan bahwa itu dapat diubah dalam beberapa kasus? Yaitu: ini HARUS TIDAK seperti di RFC2119 : coba lakukan seperti itu kecuali ada alasan bagus?
cmake.dir
untuk local.properties , tidak beberapa peringatan atau efek samping dari melakukan sesuatu yang berbahaya. Bukan saya, melainkan Google yang merekomendasikan untuk menggunakannya, jika ada alasan bagus (misalnya, jika Anda tidak ingin Gradle menggunakan PATH untuk menemukan CMake).