Tôi đã thiết lập sdk.dir
và ndk.dir
trong local.properties
.
Làm cách nào để đọc các giá trị được xác định trong sdk.dir
và ndk.dir
trong build.gradle
tệp?
Tôi đã thiết lập sdk.dir
và ndk.dir
trong local.properties
.
Làm cách nào để đọc các giá trị được xác định trong sdk.dir
và ndk.dir
trong build.gradle
tệp?
local.properties
nó đang được sử dụng cho cấu hình cục bộ của Android Studio và việc có một tệp khác cùng tên có thể tạo ra một chút nhầm lẫn. Xem stackoverflow.com/a/49306091/1587329 bên dưới
android.getSdkDirectory()
đơn giản là hoạt động.
Câu trả lời:
Bạn có thể làm điều đó theo cách này:
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir')
def ndkDir = properties.getProperty('ndk.dir')
Sử dụng project.rootProject
nếu bạn đang đọc tệp thuộc tính trong một dự án con 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
Trong trường hợp tệp thuộc tính nằm trong cùng một thư mục dự án con, bạn chỉ có thể sử dụng project
.
build.gradle
tệp project
là một biến thể đề cập đến dự án hiện tại. Nếu bạn có lỗi lạ, hãy hỏi một câu hỏi mới.
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", "")
}
và trong mã, bạn lấy nó dưới dạng chuỗi khác từ Tài nguyên -
resources.getString(R.string.default_account_iccid);
Mặc dù câu trả lời của @ rciovati chắc chắn là đúng, nhưng cũng có một cách khác để đọc các giá trị cho sdk.dir
vàndk.dir
.
Như đã chỉ ra trong mục blog này của Gaku Ueda (Thư mục lấy ndk), BasePlugin
lớp này cung cấp các phương thức cho getNdkFolder()
và getSdkFolder()
:
def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()
Lưu ý: Bạn có thể phải thay đổi com.android.application
thànhcom.android.library
nếu bạn đang xây dựng một thư viện
Đây có thể là một cách tốt hơn để đọc các giá trị thư mục. Mặc dù phải nói rằng câu trả lời do @rciovati cung cấp linh hoạt hơn, vì người ta có thể đọc bất kỳ giá trị nào trong tệp thuộc tính.
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
như có thể thấy ở đây: stackoverflow.com/questions/28615439/…
Câu trả lời tải local.properties theo cách thủ công ở trên rõ ràng là hoạt động và câu trả lời tiếp theo yêu cầu bạn biết plugin nào được áp dụng cũng sẽ hoạt động.
Những cách tiếp cận này có thể tốt hơn một chút đối với một số người vì chúng chung chung hơn vì chúng hoạt động bất kể bạn đang sử dụng plugin Ứng dụng, Thử nghiệm hay Thư viện. Các đoạn mã này cũng cung cấp cho bạn quyền truy cập có lập trình đầy đủ vào tất cả cấu hình plugin Android (Hương vị sản phẩm, phiên bản Công cụ xây dựng, v.v.):
Nếu bạn cần quyền truy cập vào tệp build.gradle đang sử dụng Plugin Android Gradle, chỉ cần truy cập trực tiếp vào Android DSL vì nó hiện có sẵn trực tiếp:
project.android.sdkDirectory
Dạng dài hơn (bên dưới) của điều này rất hữu ích nếu bạn đang tạo các lớp hoặc Plugin Gradle Tasks tùy chỉnh hoặc chỉ đơn giản là muốn xem các thuộc tính nào có sẵn.
// 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}");
Tại thời điểm đăng bài này cũng có một adbExe
tài sản mà chắc chắn đáng chú ý.
Mã này phải thực thi SAU KHI Trình cắm Android Gradle được định cấu hình theo vòng quay Gradle. Thông thường, điều này có nghĩa là bạn đặt nó vàoexecute
phương thức a Task
hoặc đặt nó SAU KHI android
khai báo DSL trong build.gradle
tệp ứng dụng / thư viện Android ).
Các đoạn mã này cũng đi kèm với cảnh báo rằng khi bạn nâng cấp phiên bản Plugin Android Gradle, các thuộc tính này có thể thay đổi khi plugin được phát triển, vì vậy bạn chỉ cần kiểm tra khi di chuyển giữa các phiên bản của plugin Gradle và Android Gradle cũng như Android Studio (đôi khi là phiên bản mới của Android Studio yêu cầu phiên bản mới của Trình cắm Android Gradle).
Tôi nghĩ đó là cách thanh lịch hơn.
println "${android.getSdkDirectory().getAbsolutePath()}"
nó hoạt động trên android gradle 1.5.0.
Tôi đã thiết lập
sdk.dir
vàndk.dir
tronglocal.properties
.
Bạn có thể xem xét lại nếu bạn muốn giá trị bằng tay bộ trong local.properties
khi đó đã được sử dụng bởi Android Studio (đối với dự án root), và
bạn không nên sửa đổi tệp này theo cách thủ công hoặc kiểm tra nó trong hệ thống kiểm soát phiên bản của bạn.
nhưng hãy xem miễn trừ cụ thể về cmake được liệt kê trong các nhận xét.
android.getSdkDirectory()
local.properties
cũng là hợp pháp. Xem developer.android.com/studio/projects/… : Google khuyên bạn nên thêm cmake.dir="path-to-cmake"
để ghi đè hành vi tra cứu mặc định.
If you set this property, Gradle no longer uses PATH to find CMake.
. Vì vậy, những gì bạn đảm nhận nó? Bạn có khuyên bạn nên sử dụng nó không hay bạn chỉ đề cập rằng nó có thể được thay đổi trong một số trường hợp? Đó là: điều này KHÔNG NÊN giống như trong RFC2119 : cố gắng làm theo cách đó trừ khi có lý do chính đáng?
cmake.dir
để thêm vào local.properties chứ không phải là một số cảnh báo hoặc tác dụng phụ của việc làm điều gì đó nguy hiểm. Không phải tôi, mà là Google khuyên bạn nên sử dụng nó, khi có lý do chính đáng (tức là nếu bạn không muốn Gradle sử dụng PATH để tìm CMake).