বিল্ড.gradle এ লোকাল.প্রপ্রেটিসে সংজ্ঞায়িত বৈশিষ্ট্যগুলি কীভাবে পড়ব


92

আমি সেট sdk.dirএবং ndk.dirভিতরে আছে local.properties

আমি মান সংজ্ঞায়িত কি পড়েছ sdk.dirএবং ndk.dirমধ্যে build.gradleফাইল?


15
আসল প্রশ্নটি হ'ল: কেন এটি অ্যান্ড্রয়েড গ্রেডেল প্লাগইনটিতে অন্তর্নির্মিত নয়?!?!!!!!
আরমান্ড

@ আরমান্ড: সম্ভবত কারণ local.propertiesঅ্যান্ড্রয়েড স্টুডিওর নিজস্ব স্থানীয় কনফিগারেশনের জন্য ব্যবহৃত হয়েছে এবং একই নামের অন্য একটি ফাইল থাকায় কিছুটা বিভ্রান্তি তৈরি হতে পারে। দেখুন stackoverflow.com/a/49306091/1587329 নিচে
serv-Inc

4
@ আরমান্ড এটি একটি করুণ বিষয় যে এটি 5 বছর আগে নির্মিত হয়নি, তবে পরে এটি যুক্ত করা হয়েছিল: android.getSdkDirectory()কেবল কাজ করে।
অ্যালেক্স কোহান

উত্তর:


141

আপনি এইভাবে এটি করতে পারেন:

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


4
এটি "প্রজেক্ট.রোটপ্রজেক্ট" কী?
অ্যালেক্সবালো

4
একটি সংক্ষিপ্ত বিবরণ যোগ করা হয়েছে
rciovati

আপনি প্রকল্পের অর্থ কি? আমার আদর্শ আমাকে একটি ত্রুটি দিচ্ছে। আমি কীভাবে প্রকল্পের পথ পাব।
অ্যালেক্সবালো

একটি build.gradleফাইলের অভ্যন্তরে একটি projectভেরিয়েবাইল থাকে যা বর্তমান প্রকল্পকে বোঝায়। আপনার যদি অদ্ভুত ত্রুটি থাকে তবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন।
rciovati

আমি যদি আপনার কোডটি অ্যাপ্লিকেশন / এসআরসি / প্রধান / জাভা / আমার_প্যাকেজ_নাম / ইউটিলেস.জেভাতে কোনও ইউটিলিটি শ্রেণীর ভিতরে অনুলিপি করি তবে এটি সমাধান করা যাবে না cannot আমি কীভাবে কোনও ইউটিলিটি ক্লাসের লোকাল.প্রপার্টি পড়তে পারি?
অ্যালেক্সাবালো

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);

4
এটা সঠিক উত্তর. এটি কীভাবে নির্বাচিত হয় না? নির্বাচিত উত্তর এমনকি একটি সমাধান প্রদান করে না ??
জোশুয়া পিন্টার

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 দ্বারা প্রদত্ত উত্তরটি আরও নমনীয়, কারণ সম্পত্তি বৈশিষ্ট্যের ফাইলটিতে যে কোনও মান পড়তে পারে।


4
গ্রেডল ১.১.০ এর জন্য আপনি plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()এখানে ব্যবহার করতে পারেন হিসাবে ব্যবহার করতে হবে: স্ট্যাকওভারফ্লো
স্টিফান

4
আবার "পরীক্ষামূলক" প্লাগইনে স্থানান্তরিত হয়ে ভাঙ্গা :(
অ্যালেক্স কোহন

8

উপরে স্থানীয়ভাবে. লোকে লোড হওয়া উত্তরটি স্পষ্টতই কাজ করে এবং পরবর্তী প্লাগইনটি প্রয়োগ করা হয়েছে তা আপনার জানতে হবে এবং সেই সাথে কাজ করা উচিত।

এই পদ্ধতির কারও কারও পক্ষে আরও সাধারণ হতে পারে যেহেতু এগুলি আরও জেনেরিক কারণ তারা অ্যাপ্লিকেশন, পরীক্ষা বা লাইব্রেরি প্লাগইন ব্যবহার করছেন কিনা তা বিবেচনা না করে তারা কাজ করে। এই স্নিপেটগুলি আপনাকে সমস্ত অ্যান্ড্রয়েড প্লাগইন কনফিগারেশনের (পণ্য স্বাদ, বিল্ড সরঞ্জাম সংস্করণ এবং আরও অনেক কিছু) সম্পূর্ণ প্রোগ্রামেটিক অ্যাক্সেস দেয়:

অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন ব্যবহার করা এমন বিল্ড.gradle ফাইলটিতে আপনার যদি অ্যাক্সেসের প্রয়োজন হয় তবে অ্যান্ড্রয়েড ডিএসএল এখন সরাসরি উপলব্ধ হিসাবে এটি সরাসরি অ্যাক্সেস করুন:

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বা androidডিএসএল ঘোষণার পরে একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন / লাইব্রেরিতে রাখুনbuild.gradle ফাইলে রাখুন)।

এই স্নিপেটগুলি এই সতর্কতার সাথে আসে যে আপনি অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণগুলি আপগ্রেড করার সাথে সাথে এই বৈশিষ্ট্যগুলি পরিবর্তন হতে পারে যেহেতু গ্র্যাডল এবং অ্যান্ড্রয়েড গ্রেডল প্লাগইনের পাশাপাশি অ্যান্ড্রয়েড স্টুডিওর সংস্করণ এবং অ্যান্ড্রয়েড স্টুডিও (কখনও কখনও অ্যান্ড্রয়েডের একটি নতুন সংস্করণ) এর মধ্যে চলে যাওয়ার সময় এই বৈশিষ্ট্যগুলি পরিবর্তিত হতে পারে স্টুডিওতে অ্যান্ড্রয়েড গ্রেডল প্লাগইন এর একটি নতুন সংস্করণ প্রয়োজন)।


3

আমি মনে করি এটি আরও মার্জিত উপায়।

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

এটি অ্যান্ড্রয়েড গ্রেড 1.5.5.0 এ কাজ করে।


0

সম্পত্তি যুক্ত করা হচ্ছে

নিম্নলিখিত গ্র্যাডল কৌশলটি আপনাকে দেখায় যে কীভাবে আপনার স্থানীয়.properties ফাইলে একটি সম্পত্তি সংরক্ষণ করা যায় যাতে এটি আপনার অ্যাপ্লিকেশন দ্বারা সুরক্ষিতভাবে উল্লেখ করা যায়।

  1. local.propertiesআপনার প্রকল্প স্তরের ডিরেক্টরিটি খুলুন এবং তারপরে নীচের উদাহরণের মতো আপনার সম্পত্তি যুক্ত করুন:
sdk.dir=MY_SDK_DIR
  1. আপনার অ্যাপ-স্তরের build.gradleফাইলে, defaultConfigউপাদানটিতে এই কোডটি যুক্ত করুন । এটি অ্যান্ড্রয়েড স্টুডিওর বিল্ড সময় ফাইলটি sdk.dirথেকে সম্পত্তিটি পড়তে দেয় local.propertiesএবং তারপরে আপনার মধ্যে বিল্ড ভেরিয়েবল ইনজেক্ট করতে দেয় 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. ফাইলগুলি সংরক্ষণ করুন এবং আপনার প্রকল্প গ্রেডলের সাথে সিঙ্ক করুন।
  2. নিম্নলিখিত কোড ব্যবহার করে আপনার স্ট্রিং পুনরুদ্ধার করুন
getString(R.string.sdk_dir);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.