Alat baris perintah Android sdkmanager selalu menunjukkan: Peringatan: Tidak dapat membuat pengaturan

64

Saya menggunakan alat baris perintah baru Android karena repositori sdk-tools lama Android tidak tersedia lagi. Jadi saya mengubah gitlab-ci saya untuk memuat commandlintools. Tetapi ketika saya mencoba menjalankannya saya mendapatkan kesalahan berikut:

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)

Saya sudah mencoba menjalankan perintah tersebut dengan tangan, tetapi saya mendapatkan kesalahan yang sama. Juga jika saya menjalankan sdkmanager --version, kesalahan yang sama terjadi. Gitlab-ci saya terlihat seperti:

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
kaulex
sumber

Jawaban:

80

Tampaknya ini adalah bug dengan cara sdkmanager menemukan folder instalasi SDK.

Work-around adalah mengatur bendera --sdk_root. Anda dapat memindahkan deklarasi ANDROID_HOME lebih tinggi, lalu menggunakannya dengan perintah berikutnya.

 - 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

Juga, pindah selimut perintah penerimaan lisensi ke perintah pertama untuk membersihkan echo ybagian - bagian.

Anehnya jika Anda menjalankannya sdkmanager --sdk_root=${ANDROID_HOME} "tools"akan meningkatkan alat dari 3.6.0 ke 26.1.1 dan sdkmanager tidak lagi memiliki masalah ini. Pembaruan ini membutuhkan waktu dan bandwidth dan tidak benar-benar diperlukan untuk menyelesaikannya.

penelepon9
sumber
1
berfungsi dengan baik, sekarang saya mendapatkan kesalahan dengan ./gradlew assembleDebug, tetapi tampaknya ini tidak ada hubungannya dengan sdkmanager lagi. Terima kasih!
kaulex
1
Bisakah Anda memberi saya contoh bagaimana saya bisa membersihkan gema saya? Saya tidak mengerti.
kaulex
1
Saya telah memperbarui cuplikan dalam respons asli saya untuk menjelaskan penghapusan echo yperintah.
caller9
1
Terima kasih! Banyak membantu!
kaulex
2
jalur ekspor dan kemudian sdkmanager --sdk_root=${ANDROID_HOME} "tools"bit melakukannya untuk saya - terima kasih!
gattsbr
23

Bagi mereka yang kesulitan menginstal Alat Baris Perintah Android untuk Appium di Windows 10 / x64 lakukan saja hal berikut:

  1. Unduh alat baris perintah terbaru dari android yaitu commandlinetools-win-6200805_latest.zip
  2. Buka zip file yang diunduh
  3. Buat direktori untuk menyimpan alat commandline di suatu tempat di disk Anda, dengan jalur berikut termasuk: android / cmdline-tools / latest Pada dasarnya ketika Anda unzip alat baris Cmd ini, cukup ganti nama direktori alat ke yang terbaru dan pastikan Anda meletakkan folder terbaru ini di android / cmdline direktori -tools suatu tempat di disk Anda
  4. Buat variabel lingkungan ANDROID_HOME untuk direktori yang menyimpan lokasi direktori alat cmdline seperti: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Buat entri baru dalam variabel lingkungan Path sebagai % ANDROID_HOME% \ bin
Artur
sumber
2
Dari mana datangnya "android / cmdline-tools / latest" ini? Kode sumber ? beberapa dokumen di suatu tempat?
Tristan
1
Alasannya dijelaskan dalam topik ini: stackoverflow.com/questions/60460429/…
ArturS
Dalam topik yang Anda referensikan, jawabannya mengatakan "ekspor ANDROID_HOME =" / Pengguna / darish / pengembangan / sdk / android "" no "latest", no "cmdline-tools"
Tristan
1
@Tristan cmdline-toolsadalah suatu keharusan, namun latesttidak wajib. Dan jalur (atau nama) cmdline-toolsberasal dari Android SDK itu sendiri. Anda dapat menjalankan perintah ini sdkmanager --sdk_root=${ANDROID_HOME} --list, di mana hasilnya termasuk "cmdline-tools; 1.0 | 1.0 | Android SDK Command-line Tools"
Jing Li
Saya tidak tahu logika apa di balik ini. Tapi berhasil :-)
Soorya
19

Mengunduh cmdline-tools baru dari situs web Pengembang Android membutuhkan struktur direktori berikut untuk dihormati.

ImperadorSid
sumber
2
Mengapa itu diperlukan? dari mana ini berasal? Kode sumber ? doc?
Tristan
1
Saya mengatur CI saya untuk menggunakan struktur ini dan sementara itu memungkinkan saya untuk menjalankan sdkmanager, ketika proyek saya dibangun dengan gradle, ia tidak tahu cara menemukan platform dan lisensi dengan benar dan semuanya gagal.
Matt Wolfe
19

Alih-alih menyampaikan argumen --sdk_rootuntuk setiap eksekusi perintah tunggal, mari selami alasan sebenarnya.

Mulai dari Android SDK Command-line Tools 1.0.0 (6200805) , berbeda dengan Android SDK 26.1.1 (4333796) , toolshierarki direktori telah diubah. Sebelumnya ditempatkan tepat di dalam ANDROID_HOME, sekarang masih dinamai tools(satu-satunya hal yang akan Anda dapatkan setelah membongkar file zip commandlinetools yang diunduh ), tetapi berbeda, Anda harus meletakkannya di dalam direktori yang disebut cmdline-toolspada Anda sendiri. Nama ini cmdline-toolsberasal dari nama paketnya, di mana Anda bisa mendapatkan dari daftar perintah paket sdkmanager --list, yang hasilnya termasukcmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools .

Membungkus toolsdirektori di dalam cmdline-toolsdirektori akan membuatnya berfungsi, dan membantu Anda menyingkirkan yang menjengkelkan--sdk_root argumen yang . Tetapi bagaimana dengan bagian lainnya?

Nah, itu yang harus Anda ubah. Izinkan saya menjelaskan lebih lanjut.

  • Raja - sdkmanagertinggal di dalam cmdline-tools/tools/bin, Anda sebaiknya mengatur PATHvariabel lingkungan
  • cmdline-toolsseharusnya tidak ditetapkan sebagai ANDROID_HOME. Karena nanti, ketika memperbarui Android SDK, atau menginstal lebih banyak paket, paket lain akan ditempatkan di bawah ANDROID_HOME, tetapi tidak di bawah cmdline-tools.
  • Final, lengkap ANDROID_HOMEstruktur direktori akan terlihat seperti di bawah ini, terdiri dari beberapa sub-direktori: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Anda dapat dengan mudah menunjukkan hal itu build-toolsdan cmdline-toolssaudara, semua duduk di dalam orangtua ANDROID_HOME.

Biarkan saya rekap dengan cara sederhana:

  • Tetapkan pilihan Anda ANDROID_HOME(seperti sebelumnya)
  • Unduh dan buka paket file zip commandlinetools ke direktori bernama cmdline-tools, yang ada di dalamnyaANDROID_HOME
  • Tambahkan $ANDROID_HOME/cmdline-tools/tools/binvariabel direktori ke lingkungan PATH, sehingga sistem tahu ke mana harus mencarisdkmanager
Jing Li
sumber
Ini jawaban yang benar. Tidak seperti jawaban lain, ini menyimpan direktori "tools", yang sebenarnya ada di file zip.
SystemParadox
Terima kasih banyak, Anda telah menjawab pertanyaan saya :)
R-obert
jawaban bagus yang "sebenarnya" memecahkan masalah!
mohamnag
5

Mendapat masalah yang sama, datang ke sini oleh Google. Menurut Arsip AndroidStudio , hari ini adalah rilis 4.1. Saya kira itu bukan kebetulan.

Ini panduan sama sekali tidak berhubungan memiliki hardlink untuk versi lama dari SDK-alat untuk linux . Anda dapat mengubah url ke windows atau mac untuk OS lain. Saya akan menggunakannya sebagai perbaikan terbaru untuk saat ini.

(yang seharusnya menjadi komentar bukan solusi)

jnnks
sumber
Tautan tidak berfungsi, saya sudah mencoba menggunakan versi lama, tetapi saya menggunakan fitur baru di basis kode saya sehingga saya tidak bisa menggunakan yang lama lagi. Jadi solusi ini tidak berhasil untuk saya.
kaulex
5

Sdkmanager mencoba untuk mencari jalan android-sdk yang berbasis di mana ia dibongkar, tanpa menggunakan variabel lingkungan, seperti ANDROID_SDK_ROOT. Tapi itu menjadi lebih buruk, karena memiliki folder induk kode keras bernama cmdline-tools dan jika Anda unzip commandlinetools di dalam folder dengan nama lain, itu tidak berfungsi, memaksa kita untuk menggunakan parameter sdk_root untuk memberi makan variabel dalam dengan benar.

Jadi, dengan itu dalam pikiran kita dapat menggunakan pendekatan berikut untuk menyelesaikan ini.

Saya akan berasumsi bahwa kita menggunakan OS Ubuntu, jadi jika tidak, Anda harus menyesuaikan beberapa instruksi itu.

  1. Instal Android-SDK.

    sudo apt install android-sdk

    Setelah instalasi, Anda akan memiliki folder bernama android-sdk di / usr / lib

  2. Buat folder bernama cdmline-tools di dalam folder android-SDK

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Unduh zip alat baris perintah Android dari sini ( https://developer.android.com/studio?hl=id-419#downloads )
  4. Buka paket file yang baru saja Anda unduh di dalam / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Buka dir home dan edit profil Anda

    nano .profile
  6. Buat variabel ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Letakkan folder sdkmanager di jalur Anda

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Simpan dan keluar
  9. Muat ulang profil Anda

    . ~/.profile
  10. Lari

    sdkmanager --version

Anda akan melihat versi yang dicetak di terminal Anda.

awquadros
sumber
1
itu bekerja seperti pesona! terima kasih lagi untuk solusi lengkap ini
Vivian
4

Saya menemukan solusi untuk menggunakan alat baris perintah terbaru mengikuti langkah-langkah berikut:

1 - Mengekstraksi alat Command-line ke dalam folder dengan struktur ini: misalnya: $HOME/Development/android/cmdline-tools/latest (folder ini harus mengandung lib , bin , notice.txt dan source.properties )

2 - Menentukan ANDROID_HOME sebagai variabel lingkungan:

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

3 - Memuatnya di PATH :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Kaio Cesar Koerich
sumber
Informasi kontradiktif: "terbaru (folder ini harus mengandung lib, bin, ...)", ANDROID_HOME = "... / latest" PATH = "... $ ANDROID_HOME / tools / lib
Tristan
lib ada di alat atau di ANDROID_HOME?
Tristan
Ini harus menjadi jawaban yang diterima
Shivam Jha
cmdline-toolsadalah suatu keharusan, namun latesttidak diperlukan.
Jing Li
3

Saya ingin berbagi pengalaman.

Pada awalnya saya mencoba menjelaskan mengapa struktur direktori harus terlihat seperti yang ditunjukkan dalam jawaban ini - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan meminta penjelasan beberapa kali jadi harap saya akan mengklarifikasi situasi dengan percobaan berikutnya:

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.

Seseorang mungkin mengalami masalah lain - Terjebak pada ".android / repositori.cfg tidak dapat dimuat."

Masalah & fakta lain:

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

Untuk meringkas resep berikut untuk pengembangan dengan Qt dapat dibuat:

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
gshep
sumber
0

Halaman ini dari dokumentasi Unity 2018 juga memiliki penjelasan yang baik untuk menyelesaikan masalah ini, termasuk poin-poin seperti:

  1. Menginstal Android SDK tanpa Android Studio.
  2. Solusi untuk "Peringatan: Tidak dapat membuat pengaturan" dan "java.lang.IllegalArgumentException"
  3. Caranya untuk Android Studio versi 3.6 atau lebih baru.
  4. Peringatan tentang Java 9 atau lebih baru, JDK harus versi 8.

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

Andrei Hryshanovich
sumber
0

Ini terjadi pada saya ketika mengunduh alat baris perintah mandiri (commandlinetools-mac-6200805_latest ) pada Mac baru.

Berdasarkan semua jawaban di sini, saya bisa membuatnya bekerja seperti ini

# 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

Dokumen untuk --sdk_rootopsi mengatakan "Gunakan root SDK yang ditentukan dan bukan SDK yang berisi alat ini ". Ini membuat saya berpikir bahwa, meskipun dikirimkan secara mandiri, alat ini berharap menjadi bagian dari bundel tempat SDK diinstal juga.

mokagio
sumber
0

Persyaratan pertama untuk menginstal SDK (Metode apa saja) adalah menginstal Java & mengatur jalur JAVA_HOME .

Kemudian, alat baris perintah SDK memerlukan jalur instalasi yang tanpanya NullPointerException melempar.
Untuk mengatasinya, cukup lewati jalur di mana Anda ingin menginstal SDK dengan argumen "--sdk_root"
Eg. sdkmanager.bat "platform-tools" "platform; android-" --sdk_root =

Ecos
sumber