使Android sdkmanager与Java 11一起运行

时间:2018-10-31 04:40:07

标签: android java-11

在使用Java 11运行Android sdkmanager时遇到问题(不是Studio,只有SDK工具)。我不想安装JDK 8或类似的东西。是否可以使用JDK 11针对Android sdkmanager修复此问题?

我经历过this answer,但它不提供针对Java 11的命令行修复。还有其他解决方法吗?

9 个答案:

答案 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的库依赖项的完整列表应为:

  • jaxb-api
  • jaxb核心
  • jaxb-impl
  • jaxb-jxc
  • jaxb-xjc
  • 激活
  • istack-commons-runtime

在此之后,您应该能够运行sdkmanager,但是会出现非法反射访问的警告。您可以毫无问题地忽略它。如果您对此感兴趣,请快速搜索。您会在Stack Overflow上找到许多与此警告有关的问题。