ฉันจะอ่านคุณสมบัติที่กำหนดใน local.properties ใน build.gradle ได้อย่างไร


92

เราได้ตั้งไว้sdk.dirและในndk.dirlocal.properties

ฉันจะอ่านค่าที่กำหนดในsdk.dirและndk.dirในbuild.gradleไฟล์ได้อย่างไร


15
คำถามที่แท้จริงคือทำไมสิ่งนี้ถึงไม่สร้างขึ้นในปลั๊กอิน Android gradle?!?!?!?!
Armand

@Armand: อาจlocal.propertiesเป็นเพราะใช้งานสำหรับการกำหนดค่าภายในเครื่องของ Android Studio และการมีไฟล์ชื่อเดียวกันอาจสร้างความสับสนเล็กน้อย ดูstackoverflow.com/a/49306091/1587329ด้านล่าง
serv-inc

1
@Armand น่าเสียดายที่สิ่งนี้ไม่ได้สร้างขึ้นเมื่อ 5 ปีที่แล้ว แต่ต่อมามีการเพิ่มสิ่งนี้: android.getSdkDirectory()ใช้งานได้ง่าย
Alex Cohn

คำตอบ:


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.


3
"project.rootProject" คืออะไร?
AlexBalo

1
เพิ่มคำอธิบายสั้น ๆ
rciovati

คุณหมายถึงอะไรกับโครงการ? ความคิดของฉันทำให้ฉันมีข้อผิดพลาด ฉันจะรับเส้นทางโครงการได้อย่างไร
AlexBalo

ภายในbuild.gradleไฟล์projectมีตัวแปรซึ่งอ้างถึงโปรเจ็กต์ปัจจุบัน หากคุณมีข้อผิดพลาดแปลก ๆ ให้ถามคำถามใหม่
rciovati

หากฉันคัดลอกโค้ดของคุณภายในคลาสยูทิลิตี้ใน app / src / main / java / my_package_name / Utils.java จะไม่สามารถแก้ไขได้ ฉันจะอ่าน local.properties จากคลาส Utility ได้อย่างไร
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", "")
}

และในโค้ดคุณจะได้รับมันเป็นสตริงอื่นจากทรัพยากร -

resources.getString(R.string.default_account_iccid);

2
นี่คือคำตอบที่ถูกต้อง ยังไงก็ไม่เลือก คำตอบที่เลือกไม่ได้ให้คำตอบ ??
Joshua Pinter

10

ถึงแม้ว่าคำตอบ @ rciovati เป็นที่ถูกต้องอย่างแน่นอนนอกจากนี้ยังมีทางเลือกในการอ่านค่าของและsdk.dirndk.dir

ตามที่ระบุไว้ในรายการบล็อกนี้โดย Gaku Ueda (การรับไดเร็กทอรี ndk) 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
สำหรับ Gradle 1.1.0 คุณต้องใช้plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()ตามดูได้ที่นี่: stackoverflow.com/questions/28615439/…
Stephan

1
พังอีกครั้งด้วยการเปลี่ยนไปใช้ปลั๊กอิน "ทดลอง" :(
Alex Cohn

8

คำตอบที่โหลด local.properties ด้วยตนเองข้างต้นใช้งานได้อย่างชัดเจนและคำตอบถัดไปที่ต้องการให้คุณทราบว่าควรใช้ปลั๊กอินใดบ้าง

วิธีการเหล่านี้อาจดีกว่าสำหรับบางคนเนื่องจากเป็นวิธีทั่วไปมากกว่าเนื่องจากใช้งานได้ไม่ว่าคุณจะใช้ปลั๊กอินแอปพลิเคชันการทดสอบหรือไลบรารี ตัวอย่างเหล่านี้ยังช่วยให้คุณสามารถเข้าถึงการกำหนดค่าปลั๊กอิน Android ทั้งหมดแบบเป็นโปรแกรมได้ (Product Flavors เวอร์ชัน Build Tools และอื่น ๆ อีกมากมาย):

หากคุณต้องการเข้าถึงไฟล์ build.gradle ที่ใช้ Android Gradle Plugin เพียงแค่เข้าถึง Android DSL โดยตรงเนื่องจากตอนนี้มีให้ใช้งานโดยตรง:

project.android.sdkDirectory

รูปแบบที่ยาวกว่านี้ (ด้านล่าง) มีประโยชน์หากคุณกำลังสร้างคลาสหรือปลั๊กอิน Gradle Tasks แบบกำหนดเองหรือเพียงแค่ต้องการดูว่ามีคุณสมบัติใดบ้าง

// 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ทรัพย์สินที่มีประโยชน์ซึ่งควรค่าแก่การสังเกตอย่างแน่นอน

โค้ดนี้ต้องดำเนินการหลังจากที่ Android Gradle Plugin กำหนดค่าตาม Gradle livecycle โดยทั่วไปหมายความว่าคุณใส่ไว้ในexecuteวิธีการTaskหรือวางไว้หลังการandroidประกาศ DSL ในbuild.gradleไฟล์ของแอป Android / ไลบรารี)

ตัวอย่างเหล่านี้ยังมาพร้อมกับข้อแม้ว่าเมื่อคุณอัปเกรดเวอร์ชัน Android Gradle Plugin คุณสมบัติเหล่านี้สามารถเปลี่ยนแปลงได้เนื่องจากปลั๊กอินได้รับการพัฒนาดังนั้นเพียงทดสอบเมื่อย้ายไปมาระหว่างเวอร์ชันของปลั๊กอิน Gradle และ Android Gradle รวมถึง Android Studio (บางครั้งอาจเป็น Android เวอร์ชันใหม่ Studio ต้องใช้ Android Gradle Plugin เวอร์ชันใหม่)



0

การเพิ่มคุณสมบัติ

เทคนิคGradleต่อไปนี้จะแสดงวิธีการจัดเก็บคุณสมบัติในไฟล์ local.properties ของคุณเพื่อให้แอปของคุณอ้างอิงได้อย่างปลอดภัย

  1. เปิดไดเร็กทอรีระดับโปรเจ็กต์local.propertiesของคุณจากนั้นเพิ่มคุณสมบัติของคุณดังตัวอย่างต่อไปนี้:
sdk.dir=MY_SDK_DIR
  1. ในbuild.gradleไฟล์ระดับแอปของคุณให้เพิ่มรหัสนี้ในdefaultConfigองค์ประกอบ สิ่งนี้ช่วยให้ Android Studio อ่าน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. บันทึกไฟล์และซิงค์โครงการของคุณด้วย Gradle
  2. ดึงสตริงของคุณโดยใช้รหัสต่อไปนี้
getString(R.string.sdk_dir);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.