使用docker制作Android镜像(实操可用)

一、安装包准备

1、准备jdk

下载地址:Java Downloads | Oracle

注意版本!!!!!! 参考下面的 对照表,不然后面构建镜像报错,就是版本不对。

我就是因为下载的jdk17,下载的安卓demo项目只需要jdk8就行,打包apk一直失败,整神了0.0

2、准备安装的工具包

ttps://developer.android.google.cn/studio/ 这里下载安卓工具,后面的版本参考

下载地址的生成规则:https://dl.google.com/android/repository/文件名

文件名就是:commandlinetools-mac-11479570_latest.zip(根据自己的环境选择对应的

我是采用的在dockerfile直接下载的方式

cmdline-tools 版本    最低 JDK    Mac    Linux    Windows
13.0(latest)    17    commandlinetools-mac-11479570_latest.zip    commandlinetools-linux-11479570_latest.zip    commandlinetools-win-11479570_latest.zip
12.0    17    commandlinetools-mac-11076708_latest.zip    commandlinetools-linux-11076708_latest.zip    commandlinetools-win-11076708_latest.zip
11.0    17    commandlinetools-mac-10406996_latest.zip    commandlinetools-linux-10406996_latest.zip    commandlinetools-win-10406996_latest.zip
10.0    11    commandlinetools-mac-9862592_latest.zip    commandlinetools-linux-9862592_latest.zip    commandlinetools-win-9862592_latest.zip
9.0    11    commandlinetools-mac-9477386_latest.zip    commandlinetools-linux-9477386_latest.zip    commandlinetools-win-9477386_latest.zip
8.0    8    commandlinetools-mac-9123335_latest.zip    commandlinetools-linux-9123335_latest.zip    commandlinetools-win-9123335_latest.zip

二、制作镜像

1、下载jdk版本的压缩包,传到Linux上面,编写dockerfile

1)使用curl拉取远程的安卓包

FROM ***********/base/ubuntu-base:python3.10#RUN pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
#RUN pip config set global.trusted-host mirrors.cloud.tencent.comWORKDIR /home/workADD ./*.py /home/work
# 拷贝JDK安装包到容器中
# 安装jdk
ADD jdk-17_linux-x64_bin.tar.gz /usr/app/java
RUN mkdir -p /usr/app/java#设置JAVA_HOME的环境变量
ENV JAVA_HOME=/usr/app/java/jdk-17.0.10
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#容器启动时需要执行的命令
CMD java -versionRUN mkdir -p /usr/local/androidSdk# 设置变量
ENV ANDROID_HOME="/usr/local/androidSdk" \SDK_TOOL_URL="https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip"RUN echo  "Y" |  apt install unzip
RUN apt update
RUN echo  "Y" |  apt install curl# 创建android sdk目录,并下载 sdkmanager
RUN  cd $ANDROID_HOME \&& curl -o sdk.zip $SDK_TOOL_URL \&& unzip sdk.zip \&& rm sdk.zip# 解压完之后在cmdline-tools路径下创建latest文件夹
RUN mkdir -p ${ANDROID_HOME}/sdk/cmdline-tools/latest RUN cp -r ${ANDROID_HOME}/cmdline-tools/* ${ANDROID_HOME}/sdk/cmdline-tools/latest# 安装android sdk其他package, 输入y是因为此处会有一个licence,需要用户同意后才会安装
RUN echo "Y" | ${ANDROID_HOME}/sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-28" "build-tools;28.0.3"# 设置环境变量: 把 android sdk 路径加入到 PATH 中
ENV PATH ${ANDROID_HOME}/sdk/cmdline-tools:${ANDROID_HOME}/sdk/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${PATH}RUN apt update
RUN pip install oss2RUN apt clean

2)上传安卓的工具包,解压使用,使用shell脚本

# 使用官方的Ubuntu镜像作为基础镜像
FROM ubuntu:latest
WORKDIR /home/work# 拷贝JDK安装包到容器中
# 安装jdk
ADD jdk-17_linux-x64_bin.tar.gz /usr/app/java
RUN mkdir -p /usr/app/java#设置JAVA_HOME的环境变量
ENV JAVA_HOME=/usr/app/java/jdk-17.0.10
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATHRUN apt update
RUN echo  "Y" |  apt install unzip# 设置变量 /opt/app/android-sdk/sdk/cmdline-tools
ENV ANDROID_DIR=/opt/app/android-sdk
RUN mkdir -p $ANDROID_DIR
# 创建android sdk目录,并下载 sdkmanager
COPY commandlinetools-linux-11076708_latest.zip $ANDROID_DIR
RUN cd $ANDROID_DIR && unzip commandlinetools-linux-11076708_latest.zip -d $ANDROID_DIR# 解压完之后在cmdline-tools路径下创建latest文件夹
RUN mkdir -p $ANDROID_DIR/sdk/cmdline-tools/latest
#/opt/app/android-sdk/sdk/cmdline-tools
RUN cp -r $ANDROID_DIR/cmdline-tools/*  $ANDROID_DIR/sdk/cmdline-tools/latest
RUN rm -rf $ANDROID_DIR/cmdline-tools# 设置环境变量: 把 android sdk 路径加入到 PATH 中
ENV ANDROID_HOME=$ANDROID_DIR/sdk/cmdline-tools/latest
ENV PATH=$ANDROID_HOME/bin:$PATH
ENV PATH ${ANDROID_DIR}/sdk/cmdline-tools:${ANDROID_HOME}/platform-tools:${PATH}# 安装android sdk其他package, 输入y是因为此处会有一个licence,需要用户同意后才会安装
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-28"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-27"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;28.0.3"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;27.0.3"#RUN "y" | $ANDROID_HOME/bin/sdkmanager "platforms;android-28"
#RUN "y" | $ANDROID_HOME/bin/sdkmanager "platforms;android-27"
#RUN "y" | $ANDROID_HOME/bin/sdkmanager "build-tools;28.0.3"
#RUN "y" | $ANDROID_HOME/bin/sdkmanager "build-tools;27.0.3"#复制脚本到容器内部
COPY script.sh $ANDROID_HOME/script.sh
#赋予脚本执行权限
RUN chmod +x $ANDROID_HOME/script.sh
# 执行shell脚本
RUN $ANDROID_HOME/script.sh

3、不使用脚本

# 使用官方的Ubuntu镜像作为基础镜像
FROM ubuntu:latest
WORKDIR /home/work# 拷贝JDK安装包到容器中
# 安装jdk
ADD jdk-17_linux-x64_bin.tar.gz /usr/app/java
RUN mkdir -p /usr/app/java#设置JAVA_HOME的环境变量
ENV JAVA_HOME=/usr/app/java/jdk-17.0.10
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATHRUN apt update
RUN echo  "Y" |  apt install unzip# 将当前项目  Android Project 复制到容器----------------------------------------
COPY android_hello_world-master.zip /home/work
RUN cd /home/work && unzip android_hello_world-master.zip -d /home/work
#-----------------------------上面的Android roject是用来验证容器镜像的,可以忽略# 设置变量 /opt/app/android-sdk/sdk/cmdline-tools
ENV ANDROID_DIR=/opt/app/android-sdk
RUN mkdir -p $ANDROID_DIR
# 创建android sdk目录,并下载 sdkmanager
COPY commandlinetools-linux-11076708_latest.zip $ANDROID_DIR
RUN cd $ANDROID_DIR && unzip commandlinetools-linux-11076708_latest.zip -d $ANDROID_DIR# 解压完之后在cmdline-tools路径下创建latest文件夹
RUN mkdir -p $ANDROID_DIR/sdk/cmdline-tools/latest
#/opt/app/android-sdk/sdk/cmdline-tools
RUN cp -r $ANDROID_DIR/cmdline-tools/*  $ANDROID_DIR/sdk/cmdline-tools/latest
RUN rm -rf $ANDROID_DIR/cmdline-tools# 设置环境变量: 把 android sdk 路径加入到 PATH 中
ENV ANDROID_HOME=$ANDROID_DIR/sdk/cmdline-tools/latest
ENV PATH=$ANDROID_HOME/bin:$PATH
ENV PATH ${ANDROID_DIR}/sdk/cmdline-tools:${ANDROID_HOME}/platform-tools:${PATH}# 安装android sdk其他package, 输入y是因为此处会有一个licence,需要用户同意后才会安装
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-28"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-27"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;28.0.3"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;27.0.3"RUN echo 'y' |  /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager 'platforms;android-28'
RUN echo 'y' | /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager 'platforms;android-27'
RUN echo 'y' | /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager 'build-tools;28.0.3'
RUN echo 'y' |  /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager 'build-tools;27.0.3'# 上面两种方式都未安装成功,采用下面脚本的方式成功了#复制脚本到容器内部
#COPY script.sh $ANDROID_HOME/script.sh
#赋予脚本执行权限
#RUN chmod +x $ANDROID_HOME/script.sh
# 执行shell脚本
#RUN $ANDROID_HOME/script.sh

  注意这里的基础镜像你们根据你们的实际 情况修改,改成Ubuntu的镜像即可。

2、构建镜像

docker build -t  /jenkins/android-package:0.0.1 .

3、push镜像

 docker push /jenkins/android-package:0.0.1

三、遇到的问题

1、jdk和Android的版本问题,参考上面的即可

2、 Either specify it explicitly with --sdk_root= or move this package into its expected location: <sdk>/cmdline-tools/latest/

解决方案:修改路径,将文件放到latest的文件夹下,具体操作如图。

3、安装好镜像未报错,进去容器验证发现未安装成功。

ls -al /opt/app/android-sdk/sdk/platforms

ls -al  /opt/app/android-sdk/sdk/build-tools

解决方案:创建sh脚本,放入镜像中,然后执行即可。

链接: https://pan.baidu.com/s/10rm4eYBWsLt7_iFBrnHhlw 提取码: a19z

再次build:docker build -t android-package:v1.0 .    

进入容器查看,文件已拉取下来。



4、验证打包apk时,jdk找不到

四、使用镜像打包安卓项目apk

1、进入容器,然后创建local.properties文件并指定android sdk路径

进入EmptyProject文件夹,输入如下命令

touch local.properties

echo "sdk.dir=/opt/app/android-sdk/sdk" > local.properties

./gradlew assembleRelease

最后下载很慢gradle:

仓库服务

改这个地方,速度起飞!

又报错了,看提示是安装的tools少了,修改dockerfile文件

# 使用官方的Ubuntu镜像作为基础镜像
FROM ubuntu:latest
WORKDIR /home/work# 拷贝JDK安装包到容器中
# 安装jdk
ADD jdk-17_linux-x64_bin.tar.gz /usr/app/java
RUN mkdir -p /usr/app/java#设置JAVA_HOME的环境变量
ENV JAVA_HOME=/usr/app/java/jdk-17.0.10
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATHRUN apt update
RUN echo  "Y" |  apt install unzip# 将当前项目  Android Project 复制到容器----------------------------------------
COPY android_hello_world-master.zip /home/work
RUN cd /home/work && unzip android_hello_world-master.zip -d /home/work
#-----------------------------上面的Android roject是用来验证容器镜像的,可以忽略# 设置变量 /opt/app/android-sdk/sdk/cmdline-tools
ENV ANDROID_DIR=/opt/app/android-sdk
RUN mkdir -p $ANDROID_DIR
# 创建android sdk目录,并下载 sdkmanager
COPY commandlinetools-linux-11076708_latest.zip $ANDROID_DIR
RUN cd $ANDROID_DIR && unzip commandlinetools-linux-11076708_latest.zip -d $ANDROID_DIR# 解压完之后在cmdline-tools路径下创建latest文件夹
RUN mkdir -p $ANDROID_DIR/sdk/cmdline-tools/latest
#/opt/app/android-sdk/sdk/cmdline-tools
RUN cp -r $ANDROID_DIR/cmdline-tools/*  $ANDROID_DIR/sdk/cmdline-tools/latest
RUN rm -rf $ANDROID_DIR/cmdline-tools# 设置环境变量: 把 android sdk 路径加入到 PATH 中
ENV ANDROID_HOME=$ANDROID_DIR/sdk/cmdline-tools/latest
ENV PATH=$ANDROID_HOME/bin:$PATH
ENV PATH ${ANDROID_DIR}/sdk/cmdline-tools:${ANDROID_HOME}/platform-tools:${PATH}# 安装android sdk其他package, 输入y是因为此处会有一个licence,需要用户同意后才会安装
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-28"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-27"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;28.0.3"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;27.0.3"RUN echo 'y' |  /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;33.0.0" "build-tools;31.0.0" "build-tools;30.0.3" "build-tools;30.0.2"  "build-tools;30.0.0" "build-tools;29.0.3" "build-tools;29.0.2" "build-tools;29.0.1" "build-tools;29.0.0" "build-tools;28.0.3" "build-tools;28.0.2" "build-tools;27.0.3"
RUN echo 'y' | /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-21" "platforms;android-22" "platforms;android-23" "platforms;android-24" "platforms;android-25" "platforms;android-26" "platforms;android-27" "platforms;android-28" "platforms;android-29"  "platforms;android-30" "platforms;android-31" "platforms;android-32" "platforms;android-33"# 上面两种方式都未安装成功,采用下面脚本的方式成功了#复制脚本到容器内部
#COPY script.sh $ANDROID_HOME/script.sh
#赋予脚本执行权限
#RUN chmod +x $ANDROID_HOME/script.sh
# 执行shell脚本
#RUN $ANDROID_HOME/script.sh

等待命令执行完成(第一次会比较慢),最终apk地址app/build/outputs/apk/release/app-release.apk

至此我们完成了在docker上搭建了android打包编译环境,并成功编译出了apk文件。

五、写在最后(千万要注意jdk和 gradle的版本,坑 ,巨坑 )

链接: https://pan.baidu.com/s/1Emjchg1xm-FbD6OAHrEeQg 提取码: dqa5

按照下面的版本对应即可打包成功!

git clone https://github.com/hellsam/EmptyProject.git

jdk版本1.8

# 使用官方的Ubuntu镜像作为基础镜像
FROM ubuntu:latest
WORKDIR /home/workRUN apt update
RUN echo  "Y" |  apt install unzipRUN apt update
RUN echo "y" | apt install openjdk-8-jdk# 拷贝JDK安装包到容器中
# 安装jdk
#RUN mkdir -p /usr/app/java
#COPY jdk-8u401-linux-x64.tar.gz /usr/app/java
#RUN tar -czvf jdk-8u401-linux-x64.tar.gz /usr/app/java#设置JAVA_HOME的环境变量
#ENV JAVA_HOME=/usr/app/java/jdk1.8.0_401
#ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#ENV PATH=$JAVA_HOME/bin:$PATH# 将当前项目  Android Project 复制到容器----------------------------------------
COPY EmptyProject.zip /home/work
RUN cd /home/work && unzip EmptyProject.zip -d /home/work
#-----------------------------上面的Android roject是用来验证容器镜像的,可以忽略# 设置变量 /opt/app/android-sdk/sdk/cmdline-tools
ENV ANDROID_DIR=/opt/app/android-sdk
RUN mkdir -p $ANDROID_DIR
# 创建android sdk目录,并下载 sdkmanager
COPY sdk-tools-linux-4333796.zip $ANDROID_DIR
RUN cd $ANDROID_DIR && unzip sdk-tools-linux-4333796.zip -d $ANDROID_DIR# 解压完之后在cmdline-tools路径下创建latest文件夹
RUN mkdir -p $ANDROID_DIR/sdk/tools/latest
#/opt/app/android-sdk/sdk/cmdline-tools
RUN cp -r $ANDROID_DIR/tools/*  $ANDROID_DIR/sdk/tools/latest
RUN rm -rf $ANDROID_DIR/tools# 设置环境变量: 把 android sdk 路径加入到 PATH 中
ENV ANDROID_HOME=$ANDROID_DIR/sdk/tools
ENV PATH=$ANDROID_HOME/bin:$PATH
ENV PATH ${ANDROID_HOME}:${ANDROID_HOME}/platform-tools:${PATH}# 安装android sdk其他package, 输入y是因为此处会有一个licence,需要用户同意后才会安装
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-28"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-27"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;28.0.3"
# /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;27.0.3"#RUN echo 'y' | /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;33.0.0" "build-tools;31.0.0" "build-tools;30.0.3" "build-tools;30.0.2"  "build-tools;30.0.0" "build-tools;29.0.3" "build-tools;29.0.2" "build-tools;29.0.1" "build-tools;29.0.0" "build-tools;28.0.3" "build-tools;28.0.2" "build-tools;27.0.3"
#RUN echo 'y' | /opt/app/android-sdk/sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-21" "platforms;android-22" "platforms;android-23" "platforms;android-24" "platforms;android-25" "platforms;android-26" "platforms;android-27" "platforms;android-28" "platforms;android-29"  "platforms;android-30" "platforms;android-31" "platforms;android-32" "platforms;android-33"RUN echo 'y' | /opt/app/android-sdk/sdk/tools/latest/bin/sdkmanager "platforms;android-28" "platforms;android-27"
RUN echo 'y' | /opt/app/android-sdk/sdk/tools/latest/bin/sdkmanager "build-tools;28.0.3" "build-tools;27.0.3"
# 上面两种方式都未安装成功,采用下面脚本的方式成功了#复制脚本到容器内部
#COPY script.sh $ANDROID_HOME/script.sh
#赋予脚本执行权限
#RUN chmod +x $ANDROID_HOME/script.sh
# 执行shell脚本
#RUN $ANDROID_HOME/script.sh

 跟着图中的命令执行,最后等待打包apk即可。

注意 :代码里面的 这个地址需要换成镜像 地址,不然下载贼慢!

distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-4.4-all.zip

六、参考文献

docker+jenkins+android环境搭建(使用dockerfile) - 掘金

在docker搭建android编译打包环境实践 - 简书

Android cmdline-tools 版本与其最小JDK关系_java11对应的android sdk tools-linux版本是多少-CSDN博客

Linux 环境下 搭建Android SDK 和Android NDK-腾讯云开发者社区-腾讯云

zsh: command not found解决方式 - 简书

Index of /gradle/

在 Linux 系统上下载 Android SDK_linux中androidsdk环境变量配置-CSDN博客

附:安卓版本表
使用sdkmanager --list命令显示所有已经安装的和未安装的packages,如下:

Installed packages:

Path    Version    Description    Location
build-tools;24.0.3    24.0.3    Android SDK Build-Tools 24.0.3    build-tools/24.0.3/
build-tools;25.0.3    25.0.3    Android SDK Build-Tools 25.0.3    build-tools/25.0.3/
emulator    26.1.3    Android Emulator    emulator/
extras;android;m2repository    47.0.0    Android Support Repository    extras/android/m2repository/
extras;google;m2repository    57    Google Repository    extras/google/m2repository/
extras;m2reposi…ut-solver;1.0.2    1    Solver for ConstraintLayout 1.0.2    extras/m2reposi…t-solver/1.0.2/
extras;m2reposi…nt-layout;1.0.2    1    ConstraintLayout for Android 1…    extras/m2reposi…t-layout/1.0.2/
patcher;v4    1    SDK Patch Applier v4    patcher/v4/
platform-tools    26.0.0    Android SDK Platform-Tools 26    platform-tools/
platforms;android-24    2    Android SDK Platform 24    platforms/android-24/
platforms;android-25    3    Android SDK Platform 25    platforms/android-25/
tools    26.0.2    Android SDK Tools    tools/
Available Packages:

Path    Version    Description
add-ons;addon-g…_apis-google-15    3    Google APIs
add-ons;addon-g…_apis-google-16    4    Google APIs
add-ons;addon-g…_apis-google-17    4    Google APIs
add-ons;addon-g…_apis-google-18    4    Google APIs
add-ons;addon-g…_apis-google-19    20    Google APIs
add-ons;addon-g…_apis-google-21    1    Google APIs
add-ons;addon-g…_apis-google-22    1    Google APIs
add-ons;addon-g…_apis-google-23    1    Google APIs
add-ons;addon-g…_apis-google-24    1    Google APIs
add-ons;addon-g…e_gdk-google-19    11    Glass Development Kit Preview
build-tools;19.1.0    19.1.0    Android SDK Build-Tools 19.1
build-tools;20.0.0    20.0.0    Android SDK Build-Tools 20
build-tools;21.1.2    21.1.2    Android SDK Build-Tools 21.1.2
build-tools;22.0.1    22.0.1    Android SDK Build-Tools 22.0.1
build-tools;23.0.1    23.0.1    Android SDK Build-Tools 23.0.1
build-tools;23.0.2    23.0.2    Android SDK Build-Tools 23.0.2
build-tools;23.0.3    23.0.3    Android SDK Build-Tools 23.0.3
build-tools;24.0.0    24.0.0    Android SDK Build-Tools 24
build-tools;24.0.1    24.0.1    Android SDK Build-Tools 24.0.1
build-tools;24.0.2    24.0.2    Android SDK Build-Tools 24.0.2
build-tools;24.0.3    24.0.3    Android SDK Build-Tools 24.0.3
build-tools;25.0.0    25.0.0    Android SDK Build-Tools 25
build-tools;25.0.1    25.0.1    Android SDK Build-Tools 25.0.1
build-tools;25.0.2    25.0.2    Android SDK Build-Tools 25.0.2
build-tools;25.0.3    25.0.3    Android SDK Build-Tools 25.0.3
build-tools;26.0.0    26.0.0    Android SDK Build-Tools 26
build-tools;26.0.1    26.0.1    Android SDK Build-Tools 26.0.1
cmake;3.6.4111459    3.6.4111459    CMake 3.6.4111459
docs    1    Documentation for Android SDK
emulator    26.1.3    Android Emulator
extras;android;gapid;1    1.0.3    GPU Debugging tools
extras;android;gapid;3    3.1.0    GPU Debugging tools
extras;android;m2repository    47.0.0    Android Support Repository
extras;google;auto    1.1    Android Auto Desktop Head Unit…
extras;google;g…e_play_services    43    Google Play services

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/308282.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算平台原理、关键功能以及技术优势

1、什么是边缘计算及其工作原理&#xff1f; 边缘计算是一种分布式计算模型&#xff0c;它将数据处理和存储靠近数据源头和最终用户的边缘设备上&#xff0c;从而减少了数据传输和延迟。边缘计算旨在解决云计算模型所面临的问题&#xff0c;例如延迟高、带宽瓶颈和安全性等问题…

虚幻引擎架构自动化及蓝图编辑器高级开发进修班

课程名称&#xff1a;虚幻引擎架构自动化及蓝图编辑器高级开发进修班 课程介绍 大家好 我们即将推出一套课程 自动化系统开发。 自动化技术在项目开发的前中后期都大量运用。如何您是一家游戏公司&#xff0c;做的是网络游戏&#xff0c;是不是经常会遇到程序员打包加部署需…

Energia学习案例

案例一&#xff1a;编写程序&#xff0c;实现每次按下按键&#xff0c;红色LED灯改变状态&#xff08;初始点亮&#xff09;&#xff0c;在窗口监视窗中显示按击次数。[要求用计时器实现按键消抖] #include"Timer.h" //包含计时器头文件volatile int stateHIGH; //灯…

防止邮箱发信泄露服务器IP教程

使用QQ邮箱,网易邮箱,189邮箱,新浪邮箱,139邮箱可能会泄露自己的服务器IP。 泄露原理&#xff1a;服务器通过请求登录SMTP邮箱服务器接口&#xff0c;对指定的收件人发送信息。 建议大家使用商业版的邮箱&#xff0c;比如阿里云邮箱发信等 防止邮件发信漏源主要关注的是确保邮件…

蓝桥杯练习系统(算法训练)ALGO-954 逗志芃的暴走

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 逗志芃是有妹子的现充&#xff0c;但是有时候妹子就是烦恼。因为逗志芃太逗了&#xff0c;所以这段时间妹子对逗志芃发动了…

【Vue + keep-alive】路由缓存

一. 需求 列表页&#xff0c;n 条数据项可打开 n 个标签页&#xff0c;同时1条数据项的查看和编辑共用一个标签页。如下所示&#xff1a; 参考 // 主页面 // 解决因 路由缓存&#xff0c;导致 编辑后跳转到该页面 不能实时更新数据 onActivated(() > {getList() })二. 实现…

JAVA 4

这次我学习了第四次Java课程 Math #include<math.h> 数学运算 Math.main 随机数 double aMath.random(); System.out.println(a);对小数处理 double a 3.6415; System.out.println("Math.floor: " Math.floor(a));//向下最近的整数 System.out.println(&…

wpf下如何实现超低延迟的RTMP或RTSP播放

技术背景 我们在做Windows平台RTMP和RTSP播放模块对接的时候&#xff0c;有开发者需要在wpf下调用&#xff0c;如果要在wpf下使用&#xff0c;只需要参考C#的对接demo即可&#xff0c;唯一不同的是&#xff0c;视频流数据显示的话&#xff0c;要么通过控件模式&#xff0c;要么…

【黑马头条】-day09用户行为-精度丢失-点赞收藏关注

文章目录 1 long类型精度丢失问题1.1 解决1.2 导入jackson序列化工具1.3 自定义注解1.4 原理1.5 测试 2 用户行为要求3 创建微服务behavior3.1 微服务创建3.2 添加启动类3.3 创建bootstrap.yml3.4 在nacos中配置redis3.5 引入redis依赖3.6 更新minio 4 跳过 1 long类型精度丢失…

小红的白色字符串

题目描述 小红拿到了一个字符串&#xff0c;她准备将一些字母变成白色&#xff0c;变成白色的字母看上去就和空格一样&#xff0c;这样字符串就变成了一些单词。 现在小红希望&#xff0c;每个单词都满足以下两种情况中的一种&#xff1a; 1.开头第一个大写&#xff0c;其余为…

01、ArcGIS For JavaScript 4.29对3DTiles数据的支持

综述 Cesium从1.99版本开始支持I3S服务的加载&#xff0c;到目前位置&#xff0c;已经支持I3S的倾斜模型、3D Object模型以及属性查询的支持。Cesium1.115又对I3S标准的Building数据实现了加载支持。而ArcGIS之前一直没有跨越对3DTiles数据的支持&#xff0c;所以在一些开发过…

抖音滑块验证码加密的盐的位置

最近更新后之前很容易找到盐的位置的方法变了&#xff0c;抖音特意把盐隐藏起来了 {"reply": "RJC","models": "yAd8rl","in_modal": "DTn0nD2","in_slide": "ou7H0Ngda","move": …

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff0c;push是追加历史记录&#xff0c;replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

环信 IM 客户端将适配鸿蒙 HarmonyOS

自华为推出了自主研发操作系统鸿蒙 HarmonyOS 后&#xff0c;国内许多应用软件开始陆续全面兼容和接入鸿蒙操作系统。环信 IM 客户端计划将全面适配统鸿蒙 HarmonyOS &#xff0c;助力开发者快速实现社交娱乐、语聊房、在线教育、智能硬件、社交电商、在线金融、线上医疗等广泛…

基于java+springboot+vue实现的网上购物系统(文末源码+Lw+ppt)23-42

摘 要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;网上购物系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为…

我与C++的爱恋:类与对象(二)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 本篇着重介绍构造函数和析构函数&#xff0c;剩余内容在下篇解答。 一、类的默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 任何类在什么都不写时…

GFS部署实验

目录 1、部署环境 ​编辑 2、更改节点名称 3、准备环境 4、磁盘分区&#xff0c;并挂载 5. 做主机映射--/etc/hosts/ 6. 复制脚本文件 7. 执行脚本完成分区 8. 安装客户端软件 1. 安装解压源包 2. 创建gfs 3. 安装 gfs 4. 开启服务 9、 添加节点到存储信任池中 1…

RUM 最佳实践-交互延迟的探索与发现

FID 在互联网高速发展的时代&#xff0c;用户体验已成为企业竞争的关键所在。网页性能作为用户体验的重要组成部分&#xff0c;直接影响着用户的满意度和工作效率。First Input Delay&#xff08;FID&#xff09;作为衡量网页性能的重要指标&#xff0c;越来越受到业界关注。今…

【Linux学习笔记】安卓运行C可执行文件No such file or directory

文章目录 开发环境运行失败现象解决办法方法一&#xff1a;使用静态库方法二&#xff1a;使用动态库创建lib查找依赖库复制需要注意的事情 开发环境 开发板&#xff1a;正点原子RK3568开发板安卓版本&#xff1a;11可执行程序命名&#xff1a;ledApp需加载模块&#xff1a;dts…

SpringBoot3 + uniapp 对接 阿里云0SS 实现上传图片视频到 0SS 以及 0SS 里删除图片视频的操作(最新)

SpringBoot3 uniapp 对接 阿里云0SS 实现上传图片视频到 0SS 以及 0SS 里删除图片视频的操作 最终效果图uniapp 的源码UpLoadFile.vuedeleteOssFile.jshttp.js SpringBoot3 的源码FileUploadController.javaAliOssUtil.java 最终效果图 uniapp 的源码 UpLoadFile.vue <tem…