Flutter Doctor无法识别我的ANDROID_SDK环境变量

时间:2020-10-25 12:17:27

标签: android flutter ubuntu dart android-sdk-tools

我从ubuntu的存储库中安装了android-sdk,但它不包含sdkmanager可执行文件,并且当前版本不足以与flutter兼容,因此我从包含它的snapd中安装了包装器。根据{{​​3}},我必须更改我的ANDROID_SDK_ROOT环境。变量,使其可以使用它。我还读到我需要将ANDROID_HOME设置到目录(我认为它已被弃用,但以防万一),所以我将其放在我的.profile中:

export ANDROID_SDK_ROOT=/snap/androidsdk/current/
export ANDROID_HOME=/snap/androidsdk/current/

然后我运行source .profile并重新启动了机器,但是颤抖的医生不断给我这个错误:

[!] Android toolchain - develop for Android devices (Android SDK version 27.0.1)
    ✗ Flutter requires Android SDK 29 and the Android BuildTools 28.0.3
      To update the Android SDK visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions.

我知道它使用了错误的路径,因为当我运行flutter doctor --android-licenses时会收到此错误:

Android sdkmanager tool not found (/usr/lib/android-sdk/tools/bin/sdkmanager).

这指向我使用apt安装的SDK的路径。我已经尝试过flutter config --android-sdk $PATH_TO_SDK,但仍然没有任何改变。是否有包含sdk管理器的ppa,这样我就不必尝试配置flutter以使用捕捉的androidsdk,还是我缺少/做错了什么?

操作系统:Ubuntu 20.04

androidsdk(snapd)版本:30(我不希望使用此版本)

android-sdk(apt)版本:25.0.0(也低于flutter的要求)

1 个答案:

答案 0 :(得分:0)

最适合我的解决方案是:

  1. 使用 function print(button) { lastChild = lastIndex(expression); //This makes the default change only if length is 1 if((expression[lastChild] === def || expression[lastChild] === def) && this.obj.innerHTML != oper.a && this.obj.innerHTML != oper.s && this.obj.innerHTML != oper.m && this.obj.innerHTML != oper.d && this.obj.id != 'decimal') { //Doesnt accept 0 at first number if(this.obj.innerHTML == def) { return; } expression[lastChild] = this.obj.innerHTML; history.innerHTML = this.obj.innerHTML; } //This makes the operator so that to avoid spamming operators else if((expression[lastChild] === oper.a || expression[lastChild] === oper.s || expression[lastChild] === oper.m || expression[lastChild] === oper.d) && button === 'oper') { expression[lastChild] = this.obj.innerHTML; history.innerHTML = expression.join(''); } //Default else{ //replaces the previous expression to 'Ans' if(isAns) { expression = []; expression.push('Ans'); history.innerHTML = 'Ans'; isAns = false; } if(button === 'num') { //handles error if(expression[lastChild] === undefined || expression[lastChild] === null || expression[lastChild] === 'Ans') { return; } let even_odd = expression.length % 2; let value = 0; //even means to add value if(even_odd === 1) { expression[lastChild] += this.obj.innerHTML; value = parseFloat(expression[lastChild].split(',').join('')); value = value.formattedNumber(); expression[lastChild] = value; history.innerHTML = expression.join(''); } //odd means to append another value on array else if(even_odd === 0) { expression.push(this.obj.innerHTML); history.innerHTML += this.obj.innerHTML; } }else if(button === 'oper') { if(expression[lastChild] === oper.a || expression[lastChild] === oper.s || expression[lastChild] === oper.m || expression[lastChild] === oper.d){ expression[lastchild] = this.obj.innerHTML; history.innerHTML = this.obj.innerHTML; }else{ expression.push(this.obj.innerHTML); history.innerHTML += this.obj.innerHTML; } } } } //more codes.... 安装android-studio,

  2. 在我的主目录中创建一个snap install android-studio --classic文件夹,然后使用android studio将所有需要的组件安装到该文件夹​​中,然后卸载android-studio。

  3. 运行Android,这会将flutter配置为使用主目录中新安装的Android-sdk。

这样做的好处是我能够安装仿真器和sdk,而无需进行任何配置。缺点是我不确定更新过程如何进行,我宁愿使用软件包管理器,但这是我发现的最简单的方法。