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?
android
android-gradle-plugin
Vikram
sumber
sumber
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 iniandroid.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-proyekbuild.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
.sumber
build.gradle
fileproject
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);
sumber
Meskipun jawaban @ rciovati sudah pasti benar, ada juga cara alternatif untuk membaca nilai untuk
sdk.dir
danndk.dir
.Seperti yang ditunjukkan dalam entri blog ini oleh Gaku Ueda (Mendapatkan direktori ndk)
BasePlugin
kelas menawarkan metode untukgetNdkFolder()
dangetSdkFolder()
: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
kecom.android.library
jika Anda sedang membangun perpustakaanIni 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.
sumber
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
metodeTask
atau meletakkannya SETELAHandroid
deklarasi DSL dibuild.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).
sumber
Saya pikir itu cara yang lebih elegan.
println "${android.getSdkDirectory().getAbsolutePath()}"
ini bekerja pada android gradle 1.5.0.
sumber
Anda dapat mempertimbangkan kembali jika Anda ingin menyetel nilai secara manual
local.properties
seperti yang sudah digunakan oleh Android Studio (untuk proyek root), dantetapi lihat pengecualian khusus tentang cmake yang tercantum di komentar.
sumber
android.getSdkDirectory()
local.properties
juga sah. Lihat developer.android.com/studio/projects/… : Google menyarankan untuk menambahkancmake.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).