मैं build.gradle में local.properties में परिभाषित गुण कैसे पढ़ता हूं


88

मैंने सेट sdk.dirऔर ndk.dirइन किया है local.properties

मैं मूल्यों में परिभाषित कैसे पढ़ सकता sdk.dirहै और ndk.dirमें build.gradleफ़ाइल?


15
असली सवाल यह है: यह एंड्रॉइड ग्रेडल प्लगइन में क्यों नहीं बनाया गया है?!?!?!?!?
आर्मंड

@Armand: शायद क्योंकि local.propertiesएंड्रॉइड स्टूडियो के अपने स्थानीय कॉन्फ़िगरेशन के लिए उपयोग किया जाता है, और उसी नाम की एक और फ़ाइल होने से थोड़ा भ्रम पैदा हो सकता है। नीचे देखें stackoverflow.com/a/49306091/1587329
serv-inc

1
@ अरमान यह अफ़सोस की बात है कि यह 5 साल पहले नहीं बनाया गया था, लेकिन बाद में इसे जोड़ा गया: android.getSdkDirectory()बस काम करता है।
एलेक्स कोहेन

जवाबों:


137

आप इस तरह से कर सकते हैं:

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.rootProjectयदि आप किसी उप-प्रोजेक्ट में गुण फ़ाइल पढ़ रहे हैं, तो इसका उपयोग करें 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

यदि गुण फ़ाइल उसी उप-प्रोजेक्ट निर्देशिका में है तो आप इसका उपयोग कर सकते हैं project


3
यह "project.rootProject" क्या है?
एलेक्सबेलो जूल 28'14

1
एक संक्षिप्त विवरण जोड़ा गया
rciovati

प्रोजेक्ट से आपका क्या मतलब है? मेरी विचारधारा मुझे एक त्रुटि दे रही है। मुझे प्रोजेक्ट पाथ कैसे मिलेगा
एलेक्सबेलो

एक build.gradleफ़ाइल के अंदर एक projectपरिवर्तनशील है जो वर्तमान परियोजना को संदर्भित करता है। यदि आपके पास अजीब त्रुटियां हैं, तो एक नया प्रश्न पूछें।
रोकोवती

अगर मैं आपके कोड को ऐप / src / main / java / my_package_name / Utils.java में एक उपयोगिता वर्ग के अंदर कॉपी करता हूं तो इसे हल नहीं किया जा सकता है। मैं एक उपयोगिता वर्ग से local.properties कैसे पढ़ सकता हूं?
एलेक्सबेलो

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

और कोड में आप इसे संसाधनों से अन्य स्ट्रिंग के रूप में प्राप्त करते हैं -

resources.getString(R.string.default_account_iccid);

2
यह सही जवाब है। इसे कैसे नहीं चुना जाता है? चुना जवाब भी एक समाधान प्रदान नहीं करता है ??
यहोशू पिंटर

10

हालाँकि @ rciovati का उत्तर निश्चित रूप से सही है, लेकिन इसके लिए मूल्यों को पढ़ने का एक वैकल्पिक तरीका भी है sdk.dirऔर ndk.dir

बकौल गेडु उएदा (एनडीके निर्देशिका प्राप्त करना) द्वारा इस ब्लॉग प्रविष्टि में बताया गया है कि BasePluginकक्षा के लिए तरीके getNdkFolder()और getSdkFolder():

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

ध्यान दें: आप को बदलने के लिए हो सकता है com.android.applicationके लिए com.android.libraryआप एक पुस्तकालय का निर्माण कर रहे है, तो

यह शायद फ़ोल्डर मूल्यों को पढ़ने का एक और अधिक सुरुचिपूर्ण तरीका है। हालांकि यह कहना होगा कि @rciovati द्वारा प्रदान किया गया उत्तर अधिक लचीला है, क्योंकि कोई भी गुण फ़ाइल में कोई भी मूल्य पढ़ सकता है।


1
ग्रैडल 1.1.0 के लिए आप उपयोग करने के लिए नी के plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()रूप में यहाँ देखा जा सकता है: stackoverflow.com/questions/28615439/…
Stephan

1
"प्रायोगिक" प्लगइन की शिफ्ट के साथ फिर से टूट गया :(
एलेक्स कोहेन

8

उत्तर जो स्थानीय रूप से लोड करता है। स्पष्ट रूप से ऊपर से मैन्युअल रूप से काम करता है, और अगले एक को आपको यह जानना होगा कि कौन सा प्लगइन लागू किया गया था, साथ ही साथ काम करना चाहिए।

ये दृष्टिकोण कुछ के लिए थोड़े बेहतर हो सकते हैं क्योंकि वे अधिक सामान्य हैं क्योंकि वे इस बात पर ध्यान दिए बिना काम करते हैं कि आप अनुप्रयोग, परीक्षण या लाइब्रेरी प्लगइन का उपयोग कर रहे हैं या नहीं। ये स्निपेट्स आपको सभी एंड्रॉइड प्लगइन कॉन्फिगर (प्रोडक्ट फ्लेवर, बिल्ड टूल्स वर्जन और अन्य सभी) के लिए पूर्ण प्रोग्रामेटिक एक्सेस प्रदान करते हैं:

यदि आपको एक बिल्ड.ग्रेड फ़ाइल में पहुंच की आवश्यकता है जो एंड्रॉइड ग्रैडल प्लगिन का उपयोग कर रहा है तो बस एंड्रॉइड डीएसएल को सीधे एक्सेस करें क्योंकि यह अब उपलब्ध है:

project.android.sdkDirectory

यदि आप कस्टम ग्रैडल टास्क क्लासेस या प्लगइन्स बना रहे हैं या केवल यह देखना चाहते हैं कि कौन से गुण उपलब्ध हैं, तो इसका लंबा रूप (नीचे) आसान है।

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

इस पोस्टिंग के समय एक उपयोगी adbExeसंपत्ति भी है जो निश्चित रूप से ध्यान देने योग्य है।

इस कोड को एएफट्यूट को अंजाम देना है। एंड्रॉइड ग्रैगल प्लगिन को ग्रैडल जीवन चक्र के अनुसार कॉन्फ़िगर किया गया है। आमतौर पर इसका मतलब है कि आप इसे एंड्रॉइड ऐप / लाइब्रेरीज़ की फ़ाइल में डीएसएल घोषणा के बाद इसे executeएक Taskजगह पर रख सकते हैं ।androidbuild.gradle

ये स्निपेट्स कैविएट के साथ भी आते हैं, जैसा कि आप एंड्रॉइड ग्रैगल प्लगिन संस्करणों को अपग्रेड करते हैं, इन गुणों को बदल सकते हैं क्योंकि प्लगइन विकसित किया गया है, इसलिए ग्रेड और एंड्रॉइड ग्रैगल प्लगइन के संस्करणों के साथ-साथ एंड्रॉइड स्टूडियो (कभी-कभी एंड्रॉइड का एक नया संस्करण) के बीच चलते समय परीक्षण करें स्टूडियो को एंड्रॉइड ग्रैडल प्लगिन के एक नए संस्करण की आवश्यकता है)।


3

मुझे लगता है कि यह अधिक सुंदर तरीका है।

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

यह एंड्रॉइड 1.5.0 पर काम करता है।


1

मैंने सेट sdk.dirऔर ndk.dirइन किया है local.properties

यदि आप में मैन्युअल रूप से सेट मूल्यों के लिए चाहते हैं तो आप पर पुनर्विचार हो सकता है local.propertiesके रूप में है कि (रूट परियोजना के लिए) एंड्रॉयड स्टूडियो द्वारा पहले से उपयोग में है, और

आपको इस फ़ाइल को मैन्युअल रूप से संशोधित नहीं करना चाहिए या इसे अपने संस्करण नियंत्रण प्रणाली में नहीं देखना चाहिए

लेकिन टिप्पणियों में सूचीबद्ध cmake के बारे में विशिष्ट छूट देखें।


इसके विपरीत: फ़ाइल को एंड्रॉइड स्टूडियो द्वारा बनाए रखा जाता है, और कभी-कभी इसकी सामग्री को पढ़ना अच्छा होता है। सौभाग्य से, यह अब समर्थित है:android.getSdkDirectory()
एलेक्स कोहेन

@AlexCohn: यकीन है, पढ़ना अच्छा लगता है। जवाब सिर्फ मूल्यों को मैन्युअल रूप से सेट करने से संबंधित है। उम्मीद है कि अब साफ हो जाए।
सर्व-इन

मैनुअल हेरफेर local.propertiesवैध है, भी। डेवलपर देखें .android.com / studio/ projects/… : Google cmake.dir="path-to-cmake"डिफ़ॉल्ट लुकअप व्यवहार को ओवरराइड करने के लिए जोड़ने की अनुशंसा करता है।
एलेक्स कोहेन

@AlexCohn: एक विकल्प के रूप में। कैवियट के साथ If you set this property, Gradle no longer uses PATH to find CMake.। तो इस पर आपकी क्या राय है? क्या आप इसका उपयोग करने की सलाह देते हैं, या क्या आप इसका उल्लेख करते हैं कि इसे कुछ मामलों में बदला जा सकता है? अर्थात्: यह SHOULD RFC2119 में नहीं है : इसे तब तक करने का प्रयास करें जब तक कि अच्छे कारण न हों?
सर्व-इन्

1
मैं इस वाक्यांश की अलग तरह से व्याख्या करता हूं। " ग्रेडेल अब सीएमके को खोजने के लिए पैथ का उपयोग नहीं करता है" स्थानीय.प्रक्रियाओं को जोड़ने cmake.dirका प्रलेखित उद्देश्य है है। कुछ खतरनाक करने के लिए कुछ चेतावनी या साइड-इफ़ेक्ट नहीं। यह मैं नहीं हूं, यह Google है जो इसका उपयोग करने की सलाह देता है, जब एक अच्छा कारण होता है (यानी, यदि आप चाहते हैं कि सीडेक खोजने के लिए पाथ का उपयोग न करें)।
एलेक्स कोहेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.