เราได้ตั้งไว้sdk.dir
และในndk.dir
local.properties
ฉันจะอ่านค่าที่กำหนดในsdk.dir
และndk.dir
ในbuild.gradle
ไฟล์ได้อย่างไร
เราได้ตั้งไว้sdk.dir
และในndk.dir
local.properties
ฉันจะอ่านค่าที่กำหนดในsdk.dir
และndk.dir
ในbuild.gradle
ไฟล์ได้อย่างไร
local.properties
เป็นเพราะใช้งานสำหรับการกำหนดค่าภายในเครื่องของ Android Studio และการมีไฟล์ชื่อเดียวกันอาจสร้างความสับสนเล็กน้อย ดูstackoverflow.com/a/49306091/1587329ด้านล่าง
android.getSdkDirectory()
ใช้งานได้ง่าย
คำตอบ:
คุณสามารถทำได้ด้วยวิธีนี้:
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
.
build.gradle
ไฟล์project
มีตัวแปรซึ่งอ้างถึงโปรเจ็กต์ปัจจุบัน หากคุณมีข้อผิดพลาดแปลก ๆ ให้ถามคำถามใหม่
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);
ถึงแม้ว่าคำตอบ @ rciovati เป็นที่ถูกต้องอย่างแน่นอนนอกจากนี้ยังมีทางเลือกในการอ่านค่าของและsdk.dir
ndk.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 นั้นยืดหยุ่นกว่าเนื่องจากสามารถอ่านค่าใด ๆ ในไฟล์คุณสมบัติได้
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
ตามดูได้ที่นี่: stackoverflow.com/questions/28615439/…
คำตอบที่โหลด 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 เวอร์ชันใหม่)
ฉันคิดว่ามันเป็นวิธีที่สง่างามกว่า
println "${android.getSdkDirectory().getAbsolutePath()}"
มันทำงานบน Android gradle 1.5.0
เทคนิคGradleต่อไปนี้จะแสดงวิธีการจัดเก็บคุณสมบัติในไฟล์ local.properties ของคุณเพื่อให้แอปของคุณอ้างอิงได้อย่างปลอดภัย
local.properties
ของคุณจากนั้นเพิ่มคุณสมบัติของคุณดังตัวอย่างต่อไปนี้:sdk.dir=MY_SDK_DIR
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", "")
getString(R.string.sdk_dir);