在使用Java 11运行Android sdkmanager
时遇到问题(不是Studio,只有SDK工具)。我不想安装JDK 8或类似的东西。是否可以使用JDK 11针对Android sdkmanager
修复此问题?
我经历过this answer,但它不提供针对Java 11的命令行修复。还有其他解决方法吗?
答案 0 :(得分:8)
已弃用的 SDK 工具 软件包随附的 sdkmanager
不支持 JDK 8,并且自 2017 年 9 月起不再接收更新。更多信息 here 和 {{ 3}}。
新的命令行工具包中包含的 sdkmanager
支持 JDK 11,可以从 Android Studio 下载页面下载,仅限命令行工具< /strong> here。无需下载任何其他文件或使用 sdkmanager
脚本进行破解,但是您需要更新 PATH 设置,例如在 Linux 上:$ANDROID_HOME/cmdline-tools/latest/bin
而不是 $ANDROID_HOME/tools/bin
虽然已弃用,但默认情况下,旧的 Tools 包仍与 Android Studio 4.1.1 一起安装。这 section 解释了原因。
答案 1 :(得分:4)
这是Emilio的答案的自动化版本(谢谢!):
cd Android/tools
mkdir jaxb_lib
wget https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar -O jaxb_lib/activation.jar
wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.3/jaxb-impl-2.3.3.jar -O jaxb_lib/jaxb-impl.jar
wget https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.11/istack-commons-runtime-3.0.11.jar -O jaxb_lib/istack-commons-runtime.jar
wget https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-xjc/2.3.3/jaxb-xjc-2.3.3.jar -O jaxb_lib/jaxb-xjc.jar
wget https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar -O jaxb_lib/jaxb-core.jar
wget https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-jxc/2.3.3/jaxb-jxc-2.3.3.jar -O jaxb_lib/jaxb-jxc.jar
wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar -O jaxb_lib/jaxb-api.jar
# Append jaxb_lib to the CLASSPATH in sdkmanager and avdmanager
sed -ie 's%^CLASSPATH=.*%\0:$APP_HOME/jaxb_lib/*%' bin/sdkmanager bin/avdmanager
jar目录也不属于bin
,因此这些说明将其放置在更高一级。
答案 2 :(得分:2)
如果有人正在寻找Java 11上的Linux修复程序,那么我会根据Wang的答案来构建它
T(n) = 2^2 T(n-2)
= 2^3 T(n-3)
= 2^4 T(n-4)
= ...
= O(2^n)
下载完成后(确保所有文件都已下载确定),您必须编辑sdkmanager和avdmanager脚本。向下滚动到CLASSPATH变量,然后添加我们刚刚下载的新jar,如下所示:
cd Android/tools/bin
mkdir jaxb_lib
wget http://central.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar -O jaxb_lib/activation.jar
wget http://central.maven.org/maven2/javax/xml/jaxb-impl/2.1/jaxb-impl-2.1.jar -O jaxb_lib/jaxb-impl.jar
wget http://central.maven.org/maven2/org/glassfish/jaxb/jaxb-xjc/2.3.2/jaxb-xjc-2.3.2.jar -O jaxb_lib/jaxb-xjc.jar
wget http://central.maven.org/maven2/org/glassfish/jaxb/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar -O jaxb_lib/jaxb-core.jar
wget http://central.maven.org/maven2/org/glassfish/jaxb/jaxb-jxc/2.3.2/jaxb-jxc-2.3.2.jar -O jaxb_lib/jaxb-jxc.jar
wget http://central.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar -O jaxb_lib/jaxb-api.jar
答案 3 :(得分:1)
下载jxab和jaf,并将它们全部放入类路径中。
例如
sdkmanager.bat
...
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-api.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-core.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-impl.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-jxc.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-xjc.jar
set CLASSPATH=%CLASSPATH%;mylib\jaf-1.1.1\activation.jar
@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%
...
答案 4 :(得分:1)
根据先前的答案存在一个问题,您最好使用较新的void executeCode(){
char* MEMORY_BUFFER = (char*)VirtualAlloc(NULL, sizeof(someCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(MEMORY_BUFFER, someCode, sizeof(someCode));
(*(void(*)())MEMORY_BUFFER)();
}
罐子,例如jaxb-impl
,以避免反射警告。
https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.1/jaxb-impl-2.3.1.jar
此外,如果我们将所有jar文件放入2.3.1
,然后将${APP_HOME}/lib
附加到${APP_HOME}/lib/*
,则Java会提取所有jar文件。
答案 5 :(得分:1)
如果您使用的是 Apple Silicon 或未安装 wget:
cd Android/sdk/tools # or Android/tools
mkdir jaxb_lib
curl https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar -o jaxb_lib/activation.jar
curl https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.3/jaxb-impl-2.3.3.jar -o jaxb_lib/jaxb-impl.jar
curl https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.11/istack-commons-runtime-3.0.11.jar -o jaxb_lib/istack-commons-runtime.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-xjc/2.3.3/jaxb-xjc-2.3.3.jar -o jaxb_lib/jaxb-xjc.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar -o jaxb_lib/jaxb-core.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-jxc/2.3.3/jaxb-jxc-2.3.3.jar -o jaxb_lib/jaxb-jxc.jar
curl https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar -o jaxb_lib/jaxb-api.jar
# Add To CLASSPATH
sed -ie 's%^CLASSPATH=.*%\0:$APP_HOME/jaxb_lib/*%' bin/sdkmanager bin/avdmanager
# Add this manually on newline after CLASSPATH
CLASSPATH=$APP_HOME/jaxb_lib/activation.jar:$APP_HOME/jaxb_lib/jaxb-impl.jar:$APP_HOME/jaxb_lib/jaxb-xjc.jar:$APP_HOME/jaxb_lib/jaxb-core.jar:$APP_HOME/jaxb_lib/jaxb-jxc.jar:$APP_HOME/jaxb_lib/jaxb-api.jar:$APP_HOME/jaxb_lib/istack-commons-runtime.jar:$CLASSPATH
答案 6 :(得分:1)
对于那些在 Travis CI 中看到这个问题的人: 我在尝试接受针对 Android 30 的构建工具 30.0.2 的许可协议时看到此错误,Java 11 用于 travis CI 构建。 应用这个答案 (https://stackoverflow.com/a/65782803/6500352) 我最终得到了这个工作 yml
os: linux
language: android
jdk: openjdk11
android:
components:
- tools
- platform-tools
- tools
- extra-android-m2repository
env:
global:
- TARGET_VERSION=30
- ANDROID_BUILD_TOOLS_VERSION=30.0.2
- ANDROID_HOME=~/android-sdk
before_install:
- touch $HOME/.android/repositories.cfg
- wget "https://dl.google.com/android/repository/commandlinetools-linux-7302050_latest.zip" -O commandlinetools.zip
- unzip commandlinetools.zip -d $ANDROID_HOME/
- yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager "platforms;android-${TARGET_VERSION}" --sdk_root=$ANDROID_HOME
- yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" --sdk_root=$ANDROID_HOME
before_script:
- chmod +x gradlew
script:
- ./gradlew your_command_here
答案 7 :(得分:0)
线程“ main”中的异常java.lang.NoClassDefFoundError:javax / xml / bind / annotation / XmlSchema 在com.android.repository.api.SchemaModule $ SchemaModuleVersion。(SchemaModule.java:156) 在com.android.repository.api.SchemaModule。(SchemaModule.java:75) 在com.android.sdklib.repository.AndroidSdkHandler处。(AndroidSdkHandler.java:81) 在com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73) 在com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48) 引起原因:java.lang.ClassNotFoundException:javax.xml.bind.annotation.XmlSchema 在java.base / jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) 在java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass(ClassLoaders.java:178) 在java.base / java.lang.ClassLoader.loadClass(ClassLoader.java:521) ...还有5个
使用Java 12,这些是我绕过此警告的步骤。感谢王谦。
导航至android sdk的安装路径,如下所示。
%LOCALAPPDATA%\Android\Sdk\tools\bin
使用文本编辑器(例如记事本)编辑 sdkmanager.bat 。
在大约70行找到以下行。
@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%
在这些行上方,粘贴以下代码。
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-api.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-core.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-impl.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-jxc.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-xjc.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\activation.jar
在android sdk安装的tools文件夹中创建一个名为mylib的新文件夹。
%LOCALAPPDATA%\Android\Sdk\tools\mylib
下载以下6个jar文件的最新版本,并将它们放在mylib文件夹中。
删除文件名中的版本控制,以匹配sdkmanager.bat文件中设置的文件名。现在,您应该拥有以下文件。
%LOCALAPPDATA%\Android\Sdk\tools\mylib\activation.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-api.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-core.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-impl.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-jxc.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-xjc.jar
全部准备好!现在运行sdkmanager --update命令
%LOCALAPPDATA%\Android\sdk\tools\bin\sdkmanager --update
答案 8 :(得分:0)
尝试Wang Qian's answer之后,我得到了Exception in thread "main" java.lang.NoSuchFieldError: REFLECTION
。这可能是因为jaxb-impl和jaxb-core的版本不匹配。确保下载两个库的相同版本,例如2.3.0.1
。
在那之后,我得到了另一个例外:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/istack/FinalArrayList
。我发现这是因为我们缺少另一个库:istack-commons-runtime。下载它并将其放入类路径中。
因此,需要专门添加到classpath的库依赖项的完整列表应为:
在此之后,您应该能够运行sdkmanager
,但是会出现非法反射访问的警告。您可以毫无问题地忽略它。如果您对此感兴趣,请快速搜索。您会在Stack Overflow上找到许多与此警告有关的问题。