Build.gradle'da local.properties dosyasında tanımlanan özellikleri nasıl okuyabilirim?


92

Ben belirledik sdk.dirve ndk.diriçinde local.properties.

Nasıl tanımlanan değerler okuyorsun sdk.dirve ndk.dirde build.gradledosyaya?


15
asıl soru şudur: bu neden android gradle eklentisinde yerleşik değil?!?!?!?!
Armand

@Armand: Belki de local.propertiesAndroid Studio'nun kendi yerel yapılandırması için kullanıldığından ve aynı isimde başka bir dosyaya sahip olmak biraz kafa karışıklığı yaratabilir. Aşağıdaki stackoverflow.com/a/49306091/1587329 sayfasına bakın
serv-inc

1
@Armand, bunun 5 yıl önce inşa edilmemiş olması üzücü, ancak daha sonra bu eklendi: android.getSdkDirectory()sadece çalışıyor.
Alex Cohn

Yanıtlar:


141

Bunu şu şekilde yapabilirsiniz:

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir')
def ndkDir = properties.getProperty('ndk.dir')

project.rootProjectBir alt projede özellikler dosyasını okuyorsanız kullanın 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

Özellikler dosyasının aynı alt proje dizininde olması durumunda, sadece project.


3
"Project.rootProject" nedir?
AlexBalo

1
Kısa bir açıklama eklendi
rciovati

Proje ile ne demek istiyorsun? Fikrim bana bir hata veriyor. Proje yolunu nasıl alırım.
AlexBalo

Bir build.gradledosyanın içinde projectmevcut projeye atıfta bulunan bir değişken vardır. Garip hatalarınız varsa yeni bir soru sorun.
rciovati

Kodunuzu app / src / main / java / my_package_name / Utils.java'daki bir yardımcı program sınıfına kopyalarsam çözülemez. Bir Utility sınıfından local.properties dosyasını nasıl okuyabilirim?
AlexBalo

26

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", "")
}

ve kodda bunu Resources'dan başka bir dize olarak alırsınız -

resources.getString(R.string.default_account_iccid);

2
Bu doğru cevap. Nasıl seçilmez? Seçilen cevap bir çözüm bile sağlamıyor mu?
Joshua Pinter

10

@ Rciovati cevabı kesinlikle doğru olmasına rağmen, aynı zamanda değerlerini okuma alternatif bir yolu yoktur sdk.dirve ndk.dir.

İşaret edildiği gibi Gaku Ueda tarafından bu blog girişi (ndk dizini alma) BasePluginiçin sınıf teklifler yöntemleri getNdkFolder()ve getSdkFolder():

def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()

Not: değiştirmeniz gerekebilir com.android.applicationiçin com.android.librarybir kütüphane inşa ediyoruz eğer

Bu, klasör değerlerini okumanın belki daha zarif bir yoludur. Her ne kadar @rciovati tarafından sağlanan cevabın daha esnek olduğu söylenmelidir, çünkü özellikler dosyasındaki herhangi bir değer okunabilir.


1
Gradle 1.1.0 için plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()burada görülebileceği gibi kullanmanız gerekir: stackoverflow.com/questions/28615439/…
Stephan

1
"Deneysel" eklentiye geçişle tekrar
Alex Cohn

8

Yukarıdaki local.properties dosyasını manuel olarak yükleyen cevap açıkça işe yarıyor ve hangi eklentinin uygulandığını bilmenizi gerektiren bir sonraki cevap da çalışmalıdır.

Bu yaklaşımlar bazıları için biraz daha iyi olabilir çünkü daha genel olduklarından Uygulama, Test veya Kütüphane eklentisini kullanıyor olmanıza bakılmaksızın çalışırlar. Bu parçacıklar ayrıca tüm Android eklenti yapılandırmasına (Ürün Tatları, Derleme Araçları sürümü ve çok daha fazlası) tam programatik erişim sağlar:

Android Gradle Eklentisini kullanan bir build.gradle dosyasına erişmeniz gerekiyorsa, artık doğrudan kullanılabildiği için doğrudan Android DSL'e erişin:

project.android.sdkDirectory

Özel Gradle Tasks sınıfları veya Eklentiler oluşturuyorsanız veya yalnızca hangi özelliklerin mevcut olduğunu görmek istiyorsanız, bunun daha uzun formu (aşağıda) kullanışlıdır.

// 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}");

Bu gönderi adbExesırasında, kesinlikle dikkat çekmeye değer kullanışlı bir özellik de var.

Bu kod, Android Gradle Eklentisi Gradle yaşam döngüsüne göre yapılandırıldıktan SONRA yürütülmelidir. Tipik olarak bu, onu DSL bildiriminden SONRA bir Android uygulaması / kitaplıkları dosyasında executebir yöntemine koyduğunuz Taskveya yerleştirdiğiniz anlamına gelir .androidbuild.gradle

Bu parçacıklar ayrıca, Android Gradle Eklentisi sürümlerini yükselttiğinizde, bu özelliklerin eklenti geliştirildikçe değişebileceği konusunda uyarıda bulunur; bu nedenle, Gradle ve Android Gradle eklentisinin sürümleri ile Android Studio (bazen yeni bir Android sürümü Studio, Android Gradle Eklentisinin yeni bir sürümünü gerektirir).


3

Bence daha zarif bir yol.

println "${android.getSdkDirectory().getAbsolutePath()}"

android gradle 1.5.0 üzerinde çalışır.


0

Mülk ekleme

Aşağıdaki Gradle tekniği, uygulamanız tarafından güvenli bir şekilde başvurulabilmesi için bir mülkün local.properties dosyanızda nasıl saklanacağını gösterir.

  1. local.propertiessizin de proje düzeyinde dizine ve sonra aşağıdaki örnekte olduğu gibi mülkünüzü ekleyin:
sdk.dir=MY_SDK_DIR
  1. Uygulama düzeyindeki build.gradledosyanızda, bu kodu defaultConfigöğesine ekleyin . Bu, Android Studio'nun derleme zamanında dosyadan sdk.dirözelliği okumasına local.propertiesve ardından derleme değişkenini res/gradleResVlues.xml.
Properties properties = new Properties()
if (rootProject.file("local.properties").exists()) {
    properties.load(rootProject.file("local.properties").newDataInputStream())
}

resValue "string", "sdk_dir", properties.getProperty("sdk.dir", "")
  1. Dosyaları kaydedin ve projenizi Gradle ile senkronize edin.
  2. Aşağıdaki kodu kullanarak dizenizi yeniden sürün
getString(R.string.sdk_dir);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.