Android 명령 줄 도구 sdkmanager는 항상 다음을 표시합니다. 경고 : 설정을 만들 수 없습니다


64

android의 오래된 sdk-tools 저장소를 더 이상 사용할 수 없으므로 android의 새로운 명령 줄 도구를 사용합니다. 그래서 commandlintools를로드하도록 gitlab-ci를 변경했습니다. 그러나 실행하려고하면 다음 오류가 발생합니다.

Warning: Could not create settings
java.lang.IllegalArgumentException
    at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.<init>(SdkManagerCliSettings.java:428)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.createSettings(SdkManagerCliSettings.java:152)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.createSettings(SdkManagerCliSettings.java:134)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:57)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)

나는 이미 그 명령을 직접 실행하려고 시도했지만 같은 오류가 발생합니다. 또한 내가 실행 sdkmanager --version하면 동일한 오류가 발생합니다. 내 gitlab-ci는 다음과 같습니다.

image: openjdk:9-jdk

variables:
  ANDROID_COMPILE_SDK: "29"
  ANDROID_BUILD_TOOLS: "29.0.3"
  ANDROID_SDK_TOOLS:   "6200805"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
  - unzip -d android-sdk-linux android-sdk.zip
  - echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
  #- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
  - echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
  - export ANDROID_HOME=$PWD/android-sdk-linux
  - export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
  - chmod +x ./gradlew
  # temporarily disable checking for EPIPE error and use yes to accept all licenses
  - set +o pipefail
  - yes | android-sdk-linux/tools/bin/sdkmanager --licenses
  - set -o pipefail

stages:
  - build
  - test

lintDebug:
  stage: build
  script:
    - ./gradlew -Pci --console=plain :app:lintDebug -PbuildDir=lint

assembleDebug:
  stage: build
  script:
    - ./gradlew assembleDebug
  artifacts:
    paths:
    - app/build/outputs/

debugTests:
  stage: test
  script:
    - ./gradlew -Pci --console=plain :app:testDebug

답변:


80

sdkmanager가 SDK 설치 폴더를 찾는 방식에 버그가있는 것 같습니다.

해결 방법은 플래그를 설정하는 것입니다 --sdk_root. ANDROID_HOME 선언을 더 높이 이동 한 후 후속 명령과 함께 사용할 수 있습니다.

 - export ANDROID_HOME=$PWD/android-sdk-linux
 - yes | android-sdk-linux/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} --licenses
 - android-sdk-linux/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools" "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null

또한 블랭킷 라이센스 승인 명령을 첫 번째 명령으로 이동하여 echo y부품 을 정리합니다 .

이상하게도 실행 sdkmanager --sdk_root=${ANDROID_HOME} "tools"하면 도구를 3.6.0에서 26.1.1로 업그레이드하고 sdkmanager에 더 이상이 문제가 없습니다. 이 업데이트에는 시간과 대역폭이 필요하므로 해결 방법에 꼭 필요한 것은 아닙니다.


1
잘 작동했지만 이제 ./gradlew assembleDebug에 오류가 발생하지만 더 이상 sdkmanager와 관련이없는 것 같습니다. 감사합니다!
kaulex

1
에코를 어떻게 정리할 수 있는지 예를 들어 주시겠습니까? 나는 그것을 얻지 못한다.
kaulex

1
echo y명령을 제거하기 위해 원래 응답에서 스 니펫을 업데이트했습니다 .
caller9

1
감사합니다! 많은 도움이됩니다!
kaulex

2
수출 라인과 sdkmanager --sdk_root=${ANDROID_HOME} "tools"비트가 나를 위해 해냈습니다-감사합니다!
gattsbr

23

Windows 10 / x64에 Appium 용 Android 명령 줄 도구를 설치하는 데 어려움을 겪는 사람들을 위해 다음과 같이하십시오.

  1. Android에서 최신 명령 줄 도구를 다운로드하십시오 (예 : commandlinetools-win-6200805_latest.zip).
  2. 다운로드 한 파일의 압축을 풉니 다
  3. 다음 경로를 포함하여 디스크 어딘가에 명령 줄 도구를 저장할 디렉토리를 만듭니다. android / cmdline-tools / latest 기본적으로이 Cmd 줄 도구의 압축을 풀 때 도구 디렉토리의 이름 을 최신으로 바꾸고 최신 폴더를 android / cmdline 에 넣었는지 확인하십시오. 디스크의 어딘가에 -tools 디렉토리
  4. C : \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest 와 같이 cmdline 도구 디렉토리 위치를 저장하는 디렉토리에 대해 ANDROID_HOME 환경 변수를 작성하십시오 .
  5. % ANDROID_HOME % \ bin 과 같이 경로 환경 변수에 새 항목을 작성하십시오.

2
이 "android / cmdline-tools / latest"의 필요성은 어디에서 발생합니까? 소스 코드 ? 어딘가에 의사?
트리스탄

1
이유는이 주제에 설명되어 있습니다. stackoverflow.com/questions/60460429/…
ArturS

참조하는 주제에서 답은 "export ANDROID_HOME ="/ Users / darish / development / sdk / android "", "최신", "cmdline-tools"없음
Tristan

1
@Tristan cmdline-toolslatest필수 이지만 필수는 아닙니다. 그리고 경로 또는 이름 cmdline-tools은 Android SDK 자체에서 비롯됩니다. sdkmanager --sdk_root=${ANDROID_HOME} --list"cmdline-tools; 1.0 | 1.0 | Android SDK 명령 줄 도구"
Jing Li

나는 이것 뒤에 어떤 논리가 있는지 모른다. 그러나 그것은 작동합니다 :-)
Soorya

19

Android 개발자 웹 사이트에서 새 cmdline-tools를 다운로드하려면 다음 디렉토리 구조를 준수해야합니다.


2
왜 필요한가요? 어디에서 왔습니까? 소스 코드 ? 문서 ?
트리스탄

1
나는이 구조를 사용하도록 CI를 설정했으며 sdkmanager를 실행할 수는 있지만 프로젝트가 gradle로 빌드되면 플랫폼과 라이센스를 올바르게 찾는 방법을 모르고 모든 것이 실패합니다.
매트 울프

17

--sdk_root각 단일 명령 실행에 대한 인수 를 전달하는 대신 실제 원인에 대해 자세히 알아 보겠습니다.

에서 시작 안드로이드 SDK 명령 줄 도구 1.0.0 (6200805) 과 달리, 안드로이드 SDK 26.1.1 (4,333,796)tools디렉토리 계층 구조가 변경되었습니다. 이전에는 바로 안에 배치 ANDROID_HOME되었지만 이제는 여전히 tools(다운로드 된 commandlinetools zip 파일의 압축을 푼 후 얻을 수있는 유일한 이름)으로 이름이 지정되어 있지만 다르게는 cmdline-tools자신 의 디렉토리에 배치해야 합니다. 이름 cmdline-tools은 패키지 이름에서 나옵니다. 여기서 sdkmanager --list출력을 포함하는 패키지 출력 명령에서 얻을 수 있습니다.cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools .

tools디렉토리 안에 cmdline-tools디렉토리를 넣으면 작동하게되고 성가신 것을 제거하는 데 도움이됩니다.--sdk_root 논쟁을 됩니다. 그러나 다른 부분은 어떻습니까?

글쎄, 그게 당신이 바꾸어야 할 전부입니다. 더 설명하겠습니다.

  • 왕- sdkmanager안에 살고 cmdline-tools/tools/bin, 당신은 PATH환경 변수에 더 잘 설정됩니다.
  • cmdline-tools로 설정해서는 안됩니다 ANDROID_HOME. 나중에 Android SDK를 업데이트하거나 더 많은 패키지를 설치할 때 다른 패키지는 아래 ANDROID_HOME에 배치 되지만 아래 에는 배치 되지 않기 때문 cmdline-tools입니다.
  • 마지막으로, 전체 ANDROID_HOME디렉토리 구조는 꽤 많은 하위 디렉토리 구성, 다음과 같이한다 : build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. 당신은 쉽게 지적 할 수 build-toolscmdline-tools형제 자매, 부모 내부의 모든 앉아 있습니다 ANDROID_HOME.

간단한 방법으로 살펴 보겠습니다.

  • 원하는대로 설정하십시오 ANDROID_HOME(이전과 동일)
  • 다운로드 및 압축 해제 commandlinetools이 라는 디렉토리에 zip 파일을 cmdline-tools내부입니다,ANDROID_HOME
  • 시스템이 찾을 위치를 알 수 있도록 디렉토리 $ANDROID_HOME/cmdline-tools/tools/bin를 환경 변수에 추가하십시오.PATHsdkmanager

이것이 정답입니다. 다른 답변과 달리 "tools"디렉토리는 실제로 zip 파일에 있습니다.
SystemParadox

정말 감사합니다, 당신은 내 질문에 대답했습니다 :)
R-obert

5

같은 문제가있어서 Google이 여기에 왔습니다. AndroidStudio Archive 에 따르면 오늘은 4.1 릴리스였습니다. 우연의 일치가 아니라고 생각합니다.

완전히 관련없는 안내서 에는 sdk-tools for linux 의 이전 버전에 대한 하드 링크가 있습니다. 다른 OS의 경우 URL을 Windows 또는 Mac으로 변경할 수 있습니다. 지금은 핫픽스로 사용하겠습니다.

(이것은 해결책이 아닌 의견이어야합니다)


링크가 작동하지 않고 이미 이전 버전을 사용해 보았지만 코드 기반에서 새로운 기능을 사용하므로 더 이상 이전 버전을 사용할 수 없습니다. 따라서이 솔루션은 저에게 효과적이지 않습니다.
kaulex

5

sdkmanager는 ANDROID_SDK_ROOT와 같은 환경 변수를 사용하지 않고 압축이 풀린 위치를 기반으로 android-sdk 경로를 파악하려고 시도합니다. 그러나 cmdline-tools라는 하드 코딩 된 상위 폴더가 있고 다른 이름으로 폴더 내부에서 commandlinetools의 압축을 풀면 작동하지 않아 sdk_root 매개 변수를 사용하여 내부 변수를 올바르게 공급해야합니다.

이를 염두에두고 다음 방법을 사용하여이 문제를 해결할 수 있습니다.

우리는 Ubuntu OS를 사용한다고 가정하므로 그렇지 않은 경우 해당 지침 중 일부를 수정해야합니다.

  1. Android-SDK를 설치하십시오.

    sudo apt install android-sdk

    설치 후 / usr / lib에 android-sdk라는 폴더가 생깁니다.

  2. android-sdk 폴더 안에 cdmline-tools라는 폴더를 만듭니다

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. 여기에서 Android 명령 행 도구 zip을 다운로드하십시오 ( https://developer.android.com/studio?hl=ko-419#downloads )
  4. / usr / lib / android-sdk / cmdline-tools에 방금 다운로드 한 파일의 압축을 풉니 다

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. 홈 디렉토리로 이동하여 .profile을 편집하십시오.

    nano .profile
  6. ANDROID_SDK_ROOT 변수 생성

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. sdkmanager 폴더를 경로에 넣으십시오.

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. 저장하고 종료
  9. 프로필 새로 고침

    . ~/.profile
  10. 운영

    sdkmanager --version

터미널에 버전이 인쇄되어 있어야합니다.


1
그것은 매력처럼 작동했습니다! 이 완벽한 솔루션에 다시 한번 감사드립니다
Vivian

4

다음 단계에 따라 최신 명령 줄 도구를 사용하는 솔루션을 찾았습니다.

1-명령 행 도구를 다음 구조의 폴더로 추출 : 예 : $HOME/Development/android/cmdline-tools/latest (이 폴더에는 lib , bin , notice.txtsource.properties가 있어야합니다 )

2- ANDROID_HOME 을 환경 변수로 정의 :

ANDROID_HOME="$HOME/Development/android/cmdline-tools/latest"

3- PATH에 로드 :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"

모순 된 정보 : "최신 (이 폴더에는 lib, bin, ...이 포함되어야합니다."), ANDROID_HOME = "... / latest"PATH = "... $ ANDROID_HOME / tools / lib
Tristan

lib가 도구 또는 ANDROID_HOME에 있습니까?
트리스탄

이것은 정답 일 것입니다
Shivam Jha

cmdline-toolslatest필수 아이템이지만 필수는 아닙니다.
Jing Li

3

내 경험을 공유하고 싶습니다.

처음에는 왜 디렉토리 구조 가이 답변에 표시된 방식 ( https://stackoverflow.com/a/60460681/1758733) 을 보여야하는지 설명하려고합니다 . https://stackoverflow.com/users/668455/tristan 은 여러 번 설명을 요청했기 때문에 다음 실험에서 상황을 명확히하기를 바랍니다.

1. unpack cmdline-tools to any path, for example c:\Android\tools;
2. create a folder for SDK, let it be c:\Android\SDK;
3. install cmdline-tools (yes, we install cmdline-tools again =)):
    c:\Android\tools\bin\sdkmanager --sdk_root=c:\Android\SDK "cmdline-tools;latest"
4. at this moment we can examine c:\Android\SDK and locate
    the path c:\Android\SDK\cmdline-tools\latest. If we compare
    this folder with the previous version c:\Android\tools we find out
    that they are identical. The new installed c:\Android\SDK\cmdline-tools\latest\sdkmanager works
    without --sdk_root argument so we could initially unpack cmdline-tools
    to cmdline-tools\latest.

다른 문제가 발생할 수 있습니다. ".android / repositories.cfg를 (를)로드 할 수 없습니다."

다른 문제 및 사실 :

1. QtCreator works with another sdkmanager that placed in SDK_ROOT/tools/bin
2. SDK_ROOT/tools/bin/sdkmanager works only with JDK 8
3. Java uses its own storage for certificates and it's not convinient usually.
    Thus one may want to use Windows certificate store. Unfortunately Grandle has the
    issue - https://stackoverflow.com/a/59056537 - so use the following:
    set JAVA_OPTS=-Djavax.net.ssl.trustStoreType=Windows-ROOT -Djavax.net.ssl.trustStore=NUL

Qt 개발을 위해 다음과 같은 레시피를 요약하면 다음과 같습니다.

1. download commandlinetools-win-6200805_latest.zip
2. extract cmdline-tools so there will be hierarchy
    SDKROOT
        - cmdline-tools
            - latest
                - bin
                    - sdkmanager.bat
                    - ...
                - lib
                - ...
3. install JDK 8. set JAVA_HOME=c:\path\to\java so that %JAVA_HOME%/bin/java.exe exists.
4. set JAVA_OPTS=-Djavax.net.ssl.trustStoreType=Windows-ROOT -Djavax.net.ssl.trustStore=NUL
5. NDK may be downloaded manually or installed with sdkmanager
6. install required components:
    SDKROOT\cmdline-tools\latest\bin\sdkmanager "tools" "build-tools;BUILD_TOOLS_VERSION" "platform-tools" "platforms;ANDROID_VERSION"
7. run qtcreator from console so JAVA_OPTS is taken into account (or set it globaly for windows user or even station)
8. tools -> options -> devices set paths to JDK 8, SDKROOT and NDK

0

Unity 2018 문서 의이 페이지에는 다음과 같은 사항을 포함 하여이 문제를 해결하는 좋은 설명이 있습니다.

  1. Android Studio없이 Android SDK 설치
  2. "경고 : 설정을 작성할 수 없음"및 "java.lang.IllegalArgumentException"에 대한 임시 해결책
  3. Android Studio 버전 3.6 이상의 트릭입니다.
  4. Java 9 이상에 대한 경고, JDK는 버전 8이어야합니다.

https://docs.unity3d.com/2018.4/Documentation/Manual/android-sdksetup.html


0

독립형 명령 줄 도구를 다운로드 할 때이 문제가 발생했습니다 (commandlinetools-mac-6200805_latest새 Mac )를 .

여기에있는 모든 대답을 바탕으로 이처럼 작동하게 만들 수있었습니다.

# Define ANDROID_HOME, if not defined already
export ANDROID_HOME="~/Library/Android/sdk"

# Create the folder if missing
mkdir -p $ANDROID_HOME

# Let the tool know that it should use that SDK location. 
sdkmanager --list --sdk_root=$ANDROID_HOME

--sdk_root옵션에 대한 문서는 " 이 도구를 포함하는 SDK 대신 지정된 SDK 루트 사용하십시오"라고 말합니다 . 이를 통해 독립형으로 제공되었지만 툴이 SDK가 설치된 번들의 일부가 될 것으로 예상했습니다.


0

SDK (모든 방법) 설치의 첫 번째 요구 사항은 Java 를 설치하고 JAVA_HOME 경로를 설정하는 것 입니다.

그런 다음 SDK 명령 줄 도구에는 NullPointerException이 발생하지 않는 설치 경로가 필요합니다.
이를 극복하려면 인수 "--sdk_root"와 함께 SDK를 설치하려는 경로를 전달하십시오
. 예 : sdkmanager.bat "플랫폼 도구" "플랫폼; android-"--sdk_root =

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.