Mam ustawiony sdk.dir
i ndk.dir
w local.properties
.
Jak odczytać wartości zdefiniowane w pliku sdk.dir
i ndk.dir
w build.gradle
pliku?
android
android-gradle-plugin
Vikram
źródło
źródło
local.properties
jest używany dla własnej lokalnej konfiguracji Android Studio, a posiadanie innego pliku o tej samej nazwie może spowodować trochę zamieszania. Zobacz stackoverflow.com/a/49306091/1587329 poniżejandroid.getSdkDirectory()
po prostu działa.Odpowiedzi:
Możesz to zrobić w ten sposób:
Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def sdkDir = properties.getProperty('sdk.dir') def ndkDir = properties.getProperty('ndk.dir')
Użyj,
project.rootProject
jeśli czytasz plik właściwości w podprojekciebuild.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
W przypadku, gdy plik właściwości znajduje się w tym samym katalogu podprojektu, którego możesz użyć po prostu
project
.źródło
build.gradle
plikuproject
znajduje się zmienna, która odnosi się do bieżącego projektu. Jeśli masz dziwne błędy, zadaj nowe pytanie.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", "") }
aw kodzie otrzymujesz go jako inny ciąg z zasobów -
resources.getString(R.string.default_account_iccid);
źródło
Chociaż odpowiedź @ rciovati jest z pewnością poprawna, istnieje również alternatywny sposób odczytywania wartości
sdk.dir
indk.dir
.Jak wskazano w tym wpisie na blogu Gaku Ueda (Getting ndk directory),
BasePlugin
klasa oferuje metody dlagetNdkFolder()
igetSdkFolder()
:def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder() def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()
Uwaga: może być konieczna zmiana
com.android.application
na,com.android.library
jeśli tworzysz bibliotekęTo może być bardziej elegancki sposób odczytywania wartości folderów. Chociaż trzeba powiedzieć, że odpowiedź udzielona przez @rciovati jest bardziej elastyczna, ponieważ można było odczytać dowolną wartość w pliku właściwości.
źródło
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
jak widać tutaj: stackoverflow.com/questions/28615439/ ...Odpowiedź, która wczytuje ręcznie plik local.properties powyżej, oczywiście działa, a następna, która wymaga, abyś wiedział, która wtyczka została zastosowana, powinna również działać.
Te podejścia mogą być trochę lepsze dla niektórych, ponieważ są bardziej ogólne, ponieważ działają niezależnie od tego, czy używasz wtyczki Aplikacja, Test czy Biblioteka. Te fragmenty zapewniają również pełny programistyczny dostęp do całej konfiguracji wtyczki Androida (smaki produktu, wersja narzędzi do budowania i wiele więcej):
Jeśli potrzebujesz dostępu w pliku build.gradle, który używa wtyczki Android Gradle, po prostu uzyskaj bezpośredni dostęp do Android DSL, ponieważ jest teraz dostępny bezpośrednio:
project.android.sdkDirectory
Dłuższa forma (poniżej) jest przydatna, jeśli tworzysz niestandardowe klasy Gradle Tasks lub wtyczki lub po prostu chcesz zobaczyć, które właściwości są dostępne.
// 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}");
W momencie tego wpisu istnieje również przydatna
adbExe
właściwość, na którą zdecydowanie warto zwrócić uwagę.Ten kod musi zostać wykonany PO skonfigurowaniu wtyczki Android Gradle zgodnie z cyklem życia Gradle. Zwykle oznacza to, że umieszczasz go w
execute
metodzie aTask
lub umieszczasz POandroid
deklaracji DSL w pliku aplikacji / bibliotek systemu Androidbuild.gradle
).Te fragmenty zawierają również zastrzeżenie, że podczas uaktualniania wersji wtyczki Android Gradle właściwości te mogą ulec zmianie wraz z tworzeniem wtyczki, więc po prostu przetestuj podczas przechodzenia między wersjami wtyczki Gradle i Android Gradle, a także Android Studio (czasami nowa wersja Androida Studio wymaga nowej wersji wtyczki Android Gradle).
źródło
Myślę, że to bardziej elegancki sposób.
println "${android.getSdkDirectory().getAbsolutePath()}"
działa na Androidzie Gradle 1.5.0.
źródło
Możesz ponownie rozważyć, czy chcesz ręcznie ustawić wartości w,
local.properties
ponieważ jest już używane przez Android Studio (dla projektu głównego) iale zobacz szczególne wyjątki dotyczące cmake wymienione w komentarzach.
źródło
android.getSdkDirectory()
local.properties
jest również uzasadniona. Zobacz developer.android.com/studio/projects/… : Google zaleca dodanie wcmake.dir="path-to-cmake"
celu zastąpienia domyślnego sposobu wyszukiwania.If you set this property, Gradle no longer uses PATH to find CMake.
. Więc co o tym sądzisz? Czy polecasz go używać, czy po prostu wspominasz, że w niektórych przypadkach można go zmienić? To znaczy: to NIE POWINNO być tak, jak w RFC2119 : próbować to zrobić w ten sposób, chyba że istnieją dobre powody?cmake.dir
do local.properties , a nie jakiegoś zastrzeżenia lub efektu ubocznego zrobienia czegoś niebezpiecznego. To nie ja, to Google polecam go używać, gdy jest dobry powód (tj. Jeśli nie chcesz, aby Gradle używał PATH do znajdowania CMake).