เครื่องมือบรรทัดคำสั่งของ Android sdkmanager จะแสดงเสมอ: คำเตือน: ไม่สามารถสร้างการตั้งค่า


64

ฉันใช้เครื่องมือบรรทัดคำสั่งใหม่ของ android เพราะที่เก็บ sdk-tools เก่าของ android ไม่สามารถใช้งานได้อีกต่อไป ดังนั้นฉันเปลี่ยน gitlab-ci ของฉันเพื่อโหลด commandlintools แต่เมื่อฉันพยายามเรียกใช้ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

สำหรับผู้ที่มีปัญหาในการติดตั้ง Android Command Line Tools สำหรับ Appium บน Windows 10 / x64 ให้ทำดังนี้:

  1. ดาวน์โหลดเครื่องมือบรรทัดคำสั่งล่าสุดจาก android เช่น commandlinetools-win-6200805_latest.zip
  2. แตกไฟล์ที่ดาวน์โหลดมา
  3. สร้างไดเรกทอรีสำหรับการจัดเก็บเครื่องมือ commandline ที่ไหนสักแห่งบนฮาร์ดดิสก์ของคุณมีเส้นทางต่อไปนี้รวม: Android / cmdline เครื่องมือ / ล่าสุดโดยทั่วไปเมื่อคุณเปิดเครื่องรูดนี้ Cmd เครื่องมือบรรทัดเพียงแค่เปลี่ยนชื่อเครื่องมือไดเรกทอรีไปล่าสุดและให้แน่ใจว่าคุณใส่นี้ล่าสุด โฟลเดอร์ในAndroid / cmdline เครื่องมือไดเรกทอรีบางแห่งในดิสก์ของคุณ
  4. สร้างตัวแปรสภาพแวดล้อมANDROID_HOMEสำหรับไดเร็กทอรีที่เก็บตำแหน่งไดเร็กทอรีเครื่องมือ cmdline เช่น: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. สร้างรายการใหม่ในตัวแปรสภาพแวดล้อมของเส้นทางเป็น% ANDROID_HOME% \ bin

2
ความต้องการของ "android / cmdline-tools / latest" นี้มาจากไหน? รหัสแหล่งที่มา ? มีหมอบ้างไหม
อุโมงค์

1
เหตุผลอธิบายไว้ในหัวข้อนี้: stackoverflow.com/questions/60460429/…
ArturS

ในหัวข้อที่คุณอ้างอิงคำตอบว่า "export ANDROID_HOME =" / ผู้ใช้ / darish / development / sdk / android "" ไม่ "ล่าสุด" ไม่มี "cmdline-tools"
Tristan

1
@Tristan cmdline-toolsเป็นสิ่งที่ต้องมี แต่latestก็ไม่จำเป็น และเส้นทาง (หรือชื่อ) ของcmdline-toolsมาจาก Android SDK เอง คุณสามารถเรียกใช้คำสั่งนี้sdkmanager --sdk_root=${ANDROID_HOME} --listโดยที่ผลลัพธ์มี "cmdline-tools; 1.0 | 1.0 | เครื่องมือบรรทัดคำสั่งของ Android SDK"
Jing Li

ฉันไม่รู้ว่าตรรกะอะไรที่อยู่เบื้องหลังสิ่งนี้ แต่มันใช้งานได้ :-)
Soorya

19

การดาวน์โหลดเครื่องมือ cmdline ใหม่จากเว็บไซต์นักพัฒนาซอฟต์แวร์ Android นั้นจำเป็นต้องมีการเคารพโครงสร้างไดเรกทอรีต่อไปนี้


2
ทำไมถึงต้องใช้? สิ่งนี้มาจากไหน รหัสแหล่งที่มา ? หมอ?
อุโมงค์

1
ฉันตั้งค่า CI ของฉันเพื่อใช้โครงสร้างนี้และในขณะที่มันอนุญาตให้ฉันเรียกใช้ sdkmanager เมื่อโครงการของฉันถูกสร้างขึ้นด้วย gradle ฉันไม่รู้วิธีการค้นหาแพลตฟอร์มและใบอนุญาตอย่างถูกต้องและทุกอย่างล้มเหลว
Matt Wolfe

17

แทนที่จะส่งผ่านอาร์กิวเมนต์--sdk_rootสำหรับการประมวลผลคำสั่งแต่ละครั้งลองดำดิ่งลงไปในสาเหตุที่แท้จริง

เริ่มต้นจากเครื่องมือ Android SDK บรรทัดคำสั่ง 1.0.0 (6,200,805)ในทางตรงกันข้ามกับAndroid SDK 26.1.1 (4,333,796)ที่toolsไดเรกทอรีลำดับชั้นได้รับการเปลี่ยนแปลง ก่อนหน้านี้มันถูกวางไว้ข้างในANDROID_HOMEตอนนี้มันยังตั้งชื่อเป็นtools(สิ่งเดียวที่คุณจะได้รับหลังจากคลายไฟล์ zip commandlinetools ที่ดาวน์โหลดมา) แต่แตกต่างกันคุณจะต้องวางมันไว้ในสารบบ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-toolsANDROID_HOMEไม่ควรที่จะตั้งเป็น เพราะต่อมาเมื่อการอัปเดต Android SDK หรือการติดตั้งแพคเกจเพิ่มเติมแพคเกจอื่น ๆ จะถูกวางไว้ใต้แต่ไม่อยู่ภายใต้ANDROID_HOMEcmdline-tools
  • สุดท้ายสมบูรณ์ANDROID_HOMEโครงสร้างไดเรกทอรีควรมีลักษณะดังต่อไปนี้ประกอบด้วยค่อนข้างน้อยไดเรกทอรีย่อย: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, ,platforms system-imagesคุณสามารถชี้ให้เห็นว่าbuild-toolsและมีพี่น้องทั้งหมดนั่งอยู่ภายในแม่cmdline-toolsANDROID_HOME

ให้ฉันสรุปในวิธีที่ง่าย:

  • ตั้งค่าที่คุณต้องการANDROID_HOME(เหมือนเมื่อก่อน)
  • ดาวน์โหลดและคลายไฟล์ zip commandlinetoolsลงในสารบบที่เรียกว่าcmdline-toolsซึ่งอยู่ภายในANDROID_HOME
  • ผนวกไดเรกทอรี$ANDROID_HOME/cmdline-tools/tools/binเข้ากับตัวแปรสภาพแวดล้อมPATHเพื่อให้ระบบทราบตำแหน่งที่จะค้นหาsdkmanager

นี่คือคำตอบที่ถูกต้อง ซึ่งแตกต่างจากคำตอบอื่น ๆ นี้เก็บไดเรกทอรี "เครื่องมือ" ซึ่งเป็นสิ่งที่อยู่ในไฟล์ zip
SystemParadox

ขอบคุณมากคุณตอบคำถามของฉันแล้ว:)
R-obert

5

มีปัญหาเดียวกันมาที่นี่โดย Google อ้างอิงจากAndroidStudio Archiveวันนี้มีการเปิดตัว 4.1 ฉันคิดว่ามันไม่ใช่เรื่องบังเอิญ

นี้คู่มือเกี่ยวข้องอย่างสมบูรณ์มี Hardlink สำหรับรุ่นเก่าที่SDK เครื่องมือสำหรับลินุกซ์ คุณสามารถเปลี่ยน URL เป็น windows หรือ mac สำหรับระบบปฏิบัติการอื่น ๆ ฉันจะใช้สิ่งนี้เป็นโปรแกรมแก้ไขด่วนในตอนนี้

(นั่นควรจะเป็นความคิดเห็นไม่ใช่ทางออก)


ลิงก์ไม่ทำงานฉันได้ลองใช้เวอร์ชันเก่าแล้ว แต่ฉันใช้คุณสมบัติใหม่ในฐานรหัสของฉันดังนั้นฉันจึงไม่สามารถใช้ตัวเก่าได้อีกต่อไป ดังนั้นวิธีนี้ไม่ได้ผลสำหรับฉัน
kaulex

5

sdkmanager พยายามที่จะหาเส้นทาง android-sdk ตามที่มันแตกโดยไม่ต้องใช้ตัวแปรสภาพแวดล้อมเช่น ANDROID_SDK_ROOT แต่มันแย่กว่าเดิมเพราะมันมีโฟลเดอร์แม่ที่เข้ารหัสยากชื่อว่า cmdline-tools และถ้าคุณทำการคลายซิป commandlinetools ภายในโฟลเดอร์ที่มีชื่ออื่นมันไม่ทำงานบังคับให้เราใช้พารามิเตอร์ sdk_root เพื่อป้อนตัวแปรภายในให้ถูกต้อง

ดังนั้นในใจเราสามารถใช้วิธีการต่อไปนี้เพื่อแก้ปัญหานี้

ฉันจะสมมติว่าเราใช้ Ubuntu OS ดังนั้นหากคุณไม่ได้คุณควรปรับคำแนะนำบางอย่าง

  1. ติดตั้ง Android-SDK

    sudo apt install android-sdk

    หลังจากการติดตั้งคุณจะมีโฟลเดอร์ชื่อ android-sdk ใน / usr / lib

  2. สร้างโฟลเดอร์ที่ชื่อว่า cdmline-tools ภายในโฟลเดอร์ android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. ดาวน์โหลดเครื่องมือบรรทัดคำสั่ง Android zip จากที่นี่ ( https://developer.android.com/studio?hl=th-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. ไปที่บ้านคุณ dir และแก้ไข. 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
มันใช้งานได้เหมือนมีเสน่ห์! ขอบคุณอีกครั้งสำหรับวิธีแก้ปัญหาที่สมบูรณ์นี้
วิเวียน

4

ฉันพบวิธีแก้ปัญหาเพื่อใช้เครื่องมือบรรทัดคำสั่งล่าสุดทำตามขั้นตอนเหล่านี้:

1 - การแยกเครื่องมือบรรทัดคำสั่งลงในโฟลเดอร์ที่มีโครงสร้างนี้เช่น: $HOME/Development/android/cmdline-tools/latest (โฟลเดอร์นี้ต้องมีlib , bin , notice.txtและsource.properties )

2 - กำหนดANDROID_HOMEเป็นตัวแปรสภาพแวดล้อม:

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

3 - กำลังโหลดบนเส้นทาง :

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

ข้อมูลที่ขัดแย้ง: "ล่าสุด (โฟลเดอร์นี้ต้องมี lib, bin, ... )", ANDROID_HOME = "... / ล่าสุด" PATH = "... $ ANDROID_HOME / tools / lib
Tristan

lib อยู่ในเครื่องมือหรือใน ANDROID_HOME
อุโมงค์

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Shivam Jha

cmdline-toolsคือต้องมี แต่latestไม่จำเป็น
จิงลี่

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 SDK โดยไม่มี Android Studio
  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 พร้อมอาร์กิวเมนต์ "--sdk_root"
เช่น sdkmanager.bat "แพลตฟอร์มเครื่องมือ" "แพลตฟอร์ม; android-" --sdk_root =

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.