Công cụ dòng lệnh Android sdkmanager luôn hiển thị: Cảnh báo: Không thể tạo cài đặt


64

Tôi sử dụng các công cụ dòng lệnh mới của Android vì kho lưu trữ công cụ sdk cũ của Android không còn khả dụng nữa. Vì vậy, tôi đã thay đổi gitlab-ci của mình để tải các lệnh lệnh. Nhưng khi tôi cố chạy nó, tôi gặp lỗi sau:

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)

Tôi đã thử thực hiện các lệnh đó bằng tay, nhưng tôi cũng gặp lỗi tương tự. Ngoài ra nếu tôi chạy sdkmanager --version, lỗi tương tự xảy ra. Gitlab-ci của tôi trông giống như:

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

Câu trả lời:


80

Đây có vẻ là một lỗi với cách sdkmanager định vị thư mục cài đặt SDK.

Một cách giải quyết là đặt cờ --sdk_root. Bạn có thể di chuyển khai báo ANDROID_HOME cao hơn, sau đó sử dụng nó với các lệnh tiếp theo.

 - 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

Ngoài ra, chuyển lệnh chấp nhận giấy phép chăn sang lệnh đầu tiên để dọn dẹp các echo ybộ phận.

Thật kỳ lạ nếu bạn chạy sdkmanager --sdk_root=${ANDROID_HOME} "tools"nó sẽ nâng cấp các công cụ từ 3.6.0 lên 26.1.1 và sdkmanager không còn gặp vấn đề này nữa. Bản cập nhật này mất thời gian và băng thông và không thực sự cần thiết với công việc.


1
đã hoạt động tốt, bây giờ tôi gặp lỗi với ./gradlew assemblybleDebug, nhưng có vẻ như điều này không liên quan gì đến sdkmanager nữa. Cảm ơn bạn!
kaulex

1
Bạn có thể vui lòng cho tôi một ví dụ về cách tôi có thể làm sạch tiếng vang của mình không? Tôi không hiểu
kaulex

1
Tôi đã cập nhật đoạn mã trong phản hồi ban đầu của mình để làm rõ việc xóa các echo ylệnh.
gọi9

1
Cảm ơn bạn! Giúp đỡ rất nhiều!
kaulex

2
dòng xuất khẩu và sau đó sdkmanager --sdk_root=${ANDROID_HOME} "tools"bit đã làm điều đó cho tôi - cảm ơn!
gattsbr

23

Đối với những người đấu tranh với việc cài đặt Công cụ dòng lệnh Android cho Appium trên Windows 10 / x64, chỉ cần làm như sau:

  1. Tải xuống các công cụ dòng lệnh mới nhất từ ​​android tức là Commandlinetools-win-6200805_latest.zip
  2. Giải nén tệp đã tải xuống
  3. Tạo thư mục để lưu trữ các công cụ dòng lệnh ở đâu đó trên đĩa của bạn, với đường dẫn sau bao gồm: android / cmdline-tools / mới nhất Về cơ bản khi bạn giải nén công cụ dòng Cmd này, chỉ cần đổi tên thư mục công cụ thành mới nhất và đảm bảo Bạn đặt thư mục mới nhất này vào android / cmdline thư mục -tools ở đâu đó trên đĩa của bạn
  4. Tạo biến môi trường ANDROID_HOME cho thư mục lưu trữ vị trí thư mục công cụ cmdline như: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ mới nhất
  5. Tạo mục nhập mới trong biến môi trường Đường dẫn dưới dạng % ANDROID_HOME% \ bin

2
Sự cần thiết của "android / cmdline-tools / mới nhất" này đến từ đâu? mã nguồn ? một số tài liệu ở đâu đó?
Tristan

1
Lý do được mô tả trong chủ đề này: stackoverflow.com/questions/60460429/ từ
ArturS

Trong chủ đề bạn đang tham khảo, câu trả lời có nội dung "export ANDROID_HOME =" / Users / darish / Development / sdk / android "" no "mới nhất", không "cmdline-tools"
Tristan

1
@Tristan cmdline-toolslà phải có, tuy nhiên latestkhông bắt buộc. Và đường dẫn (hoặc tên) cmdline-toolsđến từ chính SDK Android. Bạn có thể chạy lệnh này sdkmanager --sdk_root=${ANDROID_HOME} --list, trong đó kết quả bao gồm "cmdline-tools; 1.0 | 1.0 | Công cụ dòng lệnh SDK của Android"
Jing Li

Tôi không biết logic nào đằng sau điều này. Nhưng nó hoạt động :-)
Soorya

19

Tải xuống các công cụ cmdline mới từ trang web của Nhà phát triển Android yêu cầu cấu trúc thư mục sau phải được tôn trọng.


2
Tại sao nó được yêu cầu? Trường hợp nào này đến từ đâu ? mã nguồn ? tài liệu?
Tristan

1
Tôi thiết lập CI của mình để sử dụng cấu trúc này và trong khi nó cho phép tôi chạy sdkmanager, khi dự án của tôi được xây dựng với lớp, nó không biết cách xác định đúng nền tảng và giấy phép và mọi thứ đều thất bại.
Matt Wolfe

18

Thay vì chuyển đối số --sdk_rootcho mỗi lần thực thi lệnh đơn lẻ, hãy đi sâu vào nguyên nhân thực sự.

Bắt đầu từ Android SDK Công cụ dòng lệnh 1.0.0 (6200805) , trái ngược với Android SDK 26.1.1 (4333796) , toolshệ thống phân cấp thư mục đã được thay đổi. Trước đây nó được đặt ngay bên trong ANDROID_HOME, bây giờ nó vẫn được đặt tên là tools(thứ duy nhất bạn sẽ nhận được sau khi giải nén tệp zip Commandlinetools đã tải xuống ), nhưng khác, bạn phải đặt nó trong một thư mục được gọi là cmdline-toolscủa riêng bạn. Tên cmdline-toolsnày xuất phát từ tên gói của nó, nơi bạn có thể nhận được từ lệnh gói liệt kê sdkmanager --list, có đầu ra bao gồm cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

Gói toolsthư mục bên trong cmdline-toolsthư mục sẽ làm cho nó hoạt động, và giúp bạn thoát khỏi các --sdk_rootđối số gây phiền nhiễu . Nhưng những gì về các bộ phận khác?

Vâng, đó là tất cả những gì bạn phải thay đổi. Hãy để tôi giải thích thêm.

  • Nhà vua - sdkmanagersống bên trong cmdline-tools/tools/bin, bạn tốt hơn nên đặt trong PATHbiến môi trường
  • cmdline-toolskhông nên được đặt là ANDROID_HOME. Bởi vì sau này, khi cập nhật SDK Android hoặc cài đặt thêm các gói, các gói khác sẽ được đặt bên dưới ANDROID_HOME, nhưng không được đặt dưới cmdline-tools.
  • Trận chung kết, hoàn chỉnh ANDROID_HOMEcấu trúc thư mục sẽ giống như dưới đây, bao gồm khá một vài thư mục con: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Bạn có thể dễ dàng chỉ ra rằng build-toolscmdline-toolslà anh em ruột, tất cả đều ngồi bên trong cha mẹ ANDROID_HOME.

Hãy để tôi tóm tắt lại một cách đơn giản:

  • Đặt ưu tiên của bạn ANDROID_HOME(giống như trước đây)
  • Tải xuống và giải nén tệp zip Commandlinetools vào một thư mục có tên cmdline-tools, bên trongANDROID_HOME
  • Nối thư mục $ANDROID_HOME/cmdline-tools/tools/binvào biến môi trường PATH, để hệ thống biết nơi tìmsdkmanager

Đây là câu trả lời chính xác. Không giống như các câu trả lời khác, phần này giữ thư mục "công cụ", đây thực sự là những gì có trong tệp zip.
SystemParadox

Cảm ơn bạn rất nhiều, bạn đã trả lời câu hỏi của tôi :)
R-obert

câu trả lời tuyệt vời mà "thực sự" giải quyết vấn đề!
mohamnag

5

Có cùng một vấn đề, đến đây bởi Google. Theo Lưu trữ AndroidStudio , hôm nay là phiên bản 4.1. Tôi cho rằng đó không phải là sự trùng hợp.

Đây hướng dẫn hoàn toàn không liên quan có hardlink cho một phiên bản cũ của sdk-công cụ cho Linux . Bạn có thể thay đổi url thành windows hoặc mac cho các HĐH khác. Bây giờ tôi sẽ sử dụng nó như một hotfix.

(đó được cho là một nhận xét không phải là một giải pháp)


Liên kết không hoạt động, tôi đã thử sử dụng phiên bản cũ, nhưng tôi sử dụng các tính năng mới trong cơ sở mã của mình để tôi không thể sử dụng phiên bản cũ nữa. Vì vậy, giải pháp này không làm việc cho tôi.
kaulex

5

Sdkmanager cố gắng tìm ra đường dẫn android-sdk dựa vào nơi nó được giải nén, không sử dụng các biến môi trường, như ANDROID_SDK_ROOT. Nhưng điều đó trở nên tồi tệ hơn, bởi vì nó có một thư mục gốc được mã hóa cứng có tên là cmdline-tools và nếu bạn giải nén các dòng lệnh trong một thư mục có tên khác, nó không hoạt động, buộc chúng ta phải sử dụng tham số sdk_root để cung cấp biến bên trong một cách chính xác.

Vì vậy, với ý nghĩ đó, chúng ta có thể sử dụng phương pháp sau đây để giải quyết vấn đề này.

Tôi sẽ cho rằng chúng tôi đang sử dụng Ubuntu OS, vì vậy nếu bạn không, bạn nên điều chỉnh một số hướng dẫn đó.

  1. Cài đặt Android-SDK.

    sudo apt install android-sdk

    Sau khi cài đặt, bạn sẽ có một thư mục có tên android-sdk trong / usr / lib

  2. Tạo một thư mục có tên là cdmline-tools bên trong thư mục android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Tải xuống zip công cụ dòng lệnh Android từ đây ( https://developer.android.com/studio?hl=vi-419#doads )
  4. Giải nén tệp bạn vừa tải xuống bên trong / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Chuyển đến thư mục nhà của bạn và chỉnh sửa .profile của bạn

    nano .profile
  6. Tạo biến ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Đặt thư mục sdkmanager trong đường dẫn của bạn

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Lưu và thoát
  9. Tải lại hồ sơ của bạn

    . ~/.profile
  10. Chạy

    sdkmanager --version

Bạn sẽ thấy phiên bản được in trong thiết bị đầu cuối của bạn.


1
Nó làm việc như một say mê! cảm ơn một lần nữa cho giải pháp hoàn chỉnh này
Vivian

4

Tôi tìm thấy giải pháp để sử dụng các công cụ dòng lệnh mới nhất theo các bước sau:

1 - Trích xuất các công cụ dòng lệnh vào một thư mục với cấu trúc này: ví dụ: $HOME/Development/android/cmdline-tools/latest (thư mục này phải chứa lib , bin , notice.txtsource.properties )

2 - Xác định ANDROID_HOME làm biến môi trường:

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

3 - Đang tải nó trên PATH :

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

Thông tin mâu thuẫn: "mới nhất (thư mục này phải chứa lib, bin, ...)", ANDROID_HOME = "... / mới nhất" PATH = "... $ ANDROID_HOME / tools / lib
Tristan

lib có trong công cụ hay trong ANDROID_HOME?
Tristan

Đây phải là câu trả lời được chấp nhận
Shivam Jha

cmdline-toolslà phải có, tuy nhiên latestkhông bắt buộc.
Jing Li

3

Tôi muốn chia sẻ kinh nghiệm của tôi.

Đầu tiên tôi cố gắng giải thích tại sao cấu trúc thư mục phải nhìn theo cách hiển thị trong câu trả lời này - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan đã yêu cầu giải thích nhiều lần vì vậy hy vọng tôi sẽ làm rõ tình trạng bão hòa với thử nghiệm tiếp theo:

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.

Người ta có thể gặp phải một vấn đề khác - Bị kẹt ở ".android / repositories.cfg không thể tải được."

Các vấn đề & sự kiện khác:

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

Để tổng hợp các công thức sau đây để phát triển với Qt có thể được soạn thảo:

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

Trang này từ tài liệu của Unity 2018 cũng có một lời giải thích tốt về việc giải quyết vấn đề này, bao gồm các điểm như:

  1. Cài đặt SDK Android mà không cần Android Studio.
  2. Giải pháp thay thế cho Cảnh báo trên mạng: Không thể tạo cài đặt Cảnh báo và java java.lang.IllegalArgumentException
  3. Thủ thuật cho Android Studio phiên bản 3.6 trở lên.
  4. Cảnh báo về Java 9 trở lên, JDK phải là phiên bản 8.

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


0

Điều này xảy ra với tôi khi tải xuống các công cụ dòng lệnh độc lập ( commandlinetools-mac-6200805_latest) trên máy Mac mới.

Dựa trên tất cả các câu trả lời ở đây, tôi đã có thể làm cho nó hoạt động như thế này

# 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

Các tài liệu cho --sdk_roottùy chọn cho biết "Sử dụng gốc SDK được chỉ định thay vì SDK chứa công cụ này ". Điều này khiến tôi nghĩ rằng, mặc dù được vận chuyển độc lập, công cụ này dự kiến ​​sẽ là một phần của gói nơi SDK được cài đặt tốt.


0

Yêu cầu đầu tiên của việc cài đặt SDK (Bất kỳ phương thức nào) là cài đặt Java và thiết lập đường dẫn JAVA_HOME .

Sau đó, các công cụ dòng lệnh SDK cần đường dẫn cài đặt mà không cần ném NullPulumException.
Để khắc phục điều này, chỉ cần vượt qua đường dẫn mà bạn muốn cài đặt SDK với đối số "--sdk_root"
Eg. sdkmanager.bat "nền tảng công cụ" "nền tảng; android-" --sdk_root =

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.