使用docker创建自己的Android编译容器
文章目录
- 背景
- 步骤
- 1.创建Dockerfile
- 2.编写Dockerfile指令
- 3.编译
- 4.使用
背景
每次拿到新机器或者系统重装,最麻烦的就是各种环境配置,最近学习了一下docker的知识,用dockerfile创建一个Android编译容器,这样就不用每次都吭哧吭哧的配置各种环境,至少编译可以方便点,开发环境还是得手动配的。
步骤
1.创建Dockerfile
新建一个目录,创建Dockerfile,并在这个目录下创建apps文件夹,在这个文件夹下放入jdk和commandlinetools,这个需要我们去官网上下载。
jdk:https://www.oracle.com/java/technologies/downloads/
commandline:https://developer.android.com/studio?gclid=Cj0KCQiA4Y-sBhC6ARIsAGXF1g5cCwfbTSfschbk_6x-YpZv3lN5PEDKAX3x18d71w54crTtfJYitbYaAoCpEALw_wcB&gclsrc=aw.ds&hl=zh-cn
2.编写Dockerfile指令
# 基于ubuntu基础镜像
FROM ubuntu:latest# 安装常用命令
RUN apt-get update \&& apt-get install -y curl \&& apt-get install -y wget \&& apt-get install -y zip \&& apt-get install -y unzip \&& apt-get install -y tar \&& apt-get install -y lsof \&& apt-get install -y git \&& apt-get install -y git-lfs \&& git lfs install \&& apt-get install -y tar \&& apt-get install -y python3 \&& apt-get clean all#设置工作目录
WORKDIR /home
COPY apps/ /home/# 设置java环境
RUN mkdir -p /opt/app/jdk \&& tar -xzvf jdk-17_linux-x64_bin.tar.gz -C /opt/app/jdk \&& rm jdk-17_linux-x64_bin.tar.gz
ENV JAVA_HOME=/opt/app/jdk/jdk-17.0.9
ENV PATH=$PATH:$JAVA_HOME/bin# 设置android环境
RUN mkdir -p /opt/app/android-sdk \&& unzip commandlinetools-linux-10406996_latest.zip -d /opt/app/android-sdk/ \&& rm commandlinetools-linux-10406996_latest.zip \&& mkdir -p /opt/app/android-sdk/cmdline-tools/latest \&& find /opt/app/android-sdk/cmdline-tools/ -maxdepth 1 -mindepth 1 -not -name 'latest' -exec mv {} /opt/app/android-sdk/cmdline-tools/latest/ \;
ENV ANDROID_HOME=/opt/app/android-sdk
ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin# 安装需要的platforms和build-tools版本
RUN yes | /opt/app/android-sdk/cmdline-tools/latest/bin/sdkmanager "platforms;android-34" \&& yes | /opt/app/android-sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;30.0.3"
这里的指令还是比较简单的,比如 COPY 就可以将apps文件夹下的文件复制到容器的home目录,ENV设置环境变量,RUN可以执行shell命令。
需要注意的是,RUN和COPY指令都会增加容器的层级,所以我们尽可能的将可以合并的指令通过 && 连接起来,以此来减少容器的层级,减少容器的大小。
3.编译
在根目录下执行以下指令
docker build -t android-package:0.0.1 .
等待执行完成就可以看到我们编译出来的镜像了
4.使用
我们用这个镜像创建一个容器,并进入到这个容器中
docker run -it android-package:0.0.1 /bin/bash
发现已经有java的环境变量了
再clone一个工程,尝试编译,发现能够编译成功。
大功告成!
相关文章:
使用docker创建自己的Android编译容器
文章目录 背景步骤1.创建Dockerfile2.编写Dockerfile指令3.编译4.使用 背景 每次拿到新机器或者系统重装,最麻烦的就是各种环境配置,最近学习了一下docker的知识,用dockerfile创建一个Android编译容器,这样就不用每次都吭哧吭哧的…...
4-Docker命令之docker load
1.docker load介绍 docker load命令是用来将从tar归档文件载入镜像 docker load命令相对应的命令是docker save 2.docker load用法 docker load [参数] [root@centos79 ~]# docker load --helpUsage: docker load [OPTIONS]Load an image from a tar archive or STDINAli…...
微信小程序格创校园跑腿小程序源码v1.1.64+前端
简介: 版本号:1.1.64 – 多学校版本 本次更新内容: 订单问题修复 (无需上传小程序) 版本号:1.1.63 – 多学校版本 本次更新内容: 失物招领增加内容安全接口; 认证增加性别选…...
【单元测试】测还是不测,这是一个问题
这篇文章也可以在我的博客中查看 “册”那!! 相信大家从小就被千叮万嘱要做单元测试。然后秉承这一信念,成为了一个测试狂魔。凡有代码,测!覆盖!最终,一波操作猛如虎:467测试&…...
Global Mapper SDK 19 中文开发文档(八)
7.2.8 GM_DBUtil (1)声明 public static class GM_DBUtil (2)方法 方法描述DBGetTableList获取指定空间数据库中的表列表DBIsDatabaseFile指示输入文件是否为数据库(Esri地理数据库、Spatialite等)DBMa…...
es检索之复合检索
背景:向量检索是文本相似度检索,现在增加新的字段进行过滤,如果以filter方式进行过滤,那么最终结果不保证有topK个,甚至一个都没有,因为它是先进行topK个向量召回,再进行filter。 当然有人建议采用scriptScore方式进行检索,但此方式可能造成请求压力过大,内存消耗。 …...
09.list 容器
9、list 容器 功能: 将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成: 链表由一系列结点组成 结点的组成: 一个是存…...
速盾网络:网站用速盾cdn的好处
随着互联网的快速发展,网站的速度和稳定性成为了用户访问体验的关键因素。为了提高网站的性能和可用性,许多网站开始使用CDN(Content Delivery Network)服务。本文将介绍CDN的基本概念、工作原理以及使用CDN的好处。一、CDN的基本…...
Centos7在安装Graylog时新安装MongoDB报错端口不监听服务不启动无法运行启动失败
由于虚拟机服务器上需要安装Graylog需要安装MongoDB,尝试官网下载安装包,和yum安装均无法正常启动,折腾了好几天,重装了十几次,网上搜索了很多很多资料,均无法正常运行,百度上搜索各种文档&…...
Spark Machine Learning进行数据挖掘的简单应用(兴趣预测问题)
数据挖掘的过程 数据挖掘任务主要分为以下六个步骤: 1.数据预处理2.特征转换3.特征选择4.训练模型5.模型预测6.评估预测结果 数据准备 这里准备了20条关于不同地区、不同性别、不同身高、体重…的人的兴趣数据集(命名为hobby.csv): id,h…...
DRF从入门到精通二(Request源码分析、DRF之序列化、反序列化、反序列化校验、序列化器常用字段及参数、source、定制字段、保存数据)
文章目录 一、Request对象源码分析区分原生request和新生request新的request还能像原来的reqeust一样使用吗源码片段分析总结: 二、DRF之序列化组件序列化介绍序列化步骤序列化组件的基本使用反序列化基本使用反序列化的新增反序列化的新增删除单条 反序列化的校验序…...
Flink系列之:Upsert Kafka SQL 连接器
Flink系列之:Upsert Kafka SQL 连接器 一、Upsert Kafka SQL 连接器二、依赖三、完整示例四、可用元数据五、键和值格式六、主键约束七、一致性保证八、为每个分区生成相应的watermark九、数据类型映射 一、Upsert Kafka SQL 连接器 Scan Source: Unbounded 、Sink…...
前端与后端的异步编排(promise、async、await 、CompletableFuture)
前端与后端的异步编排 文章目录 前端与后端的异步编排1、为什么需要异步编排2、前端中的异步2.1 、Promise的使用2.1.1、Promise的基础概念2.1.2、Promise中的两个回调函数2.1.3、工具方法1、Promise.all()2、Promise.race()3、Promise.resolve() 2.2 、async 与 aw…...
python打开opencv图像与QImage图像及其转化
目录 1、Qimage图像 2、opencv图像 3、python打开QImage图像通过Qlabel控件显示 4、python打开QImage图像通过opencv显示 5、python打开opencv图像并显示 6、python打开opencv图像通过Qlabel控件显示 1、Qimage图像 QImage是Qt库中用于存储和处理图像的类。它可以存储多种…...
linux 其他版本RCU
1、不可抢占RCU 如果我们的需求是“不管内核是否编译了可抢占RCU,都要使用不可抢占RCU”,那么应该使用不可抢占RCU的专用编程接口。 读者使用函数rcu_read_lock_sched()标记进入读端临界区,使用函数rcu_read_unlock_ sched()标记退出读端临界…...
【单调栈】LeetCode:2818操作使得分最大
作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个长度为 n 的正整数数组 nums 和一个整数 k 。 一开始,你的分数为 1 。你可以进行以下操作至多 k 次,目标是使你的分数最大: 选择一个之前没有选过的 非…...
uniapp 添加分包页面,配置分包预下载
为什么要分包 ? 分包即将小程序代码分成多个部分打包,可以减少小程序的加载时间,提升用户体验 添加分包页面 比较便捷的方法是使用vscode插件 uni-create-view 新建分包文件夹 以在我的页面,添加分包的设置页面为例,新建文件夹 s…...
成功案例分享:物业管理小程序如何助力打造智慧社区
随着科技的进步和互联网的普及,数字化转型已经渗透到各个行业,包括物业管理。借助小程序这一轻量级应用,物业管理可以实现线上线下服务的无缝对接,提升服务质量,优化用户体验。本文将详细介绍如何通过乔拓云网设计小程…...
Electron执行本地cmd命令
javascript执行本地cmd命令,javascript代码怎么执行_js调用本机cmd-CSDN博客 使用 Node.js 打开本地应用_nodejs启动应用-CSDN博客 笔记:nodejs脚本唤醒本地应用程序或者调用命令-CSDN博客 electron调起本地应用_electron 调用本地程序-CSDN博客 命令行打开vscode 你可以使用…...
YOLOv8改进 | 主干篇 | 利用MobileNetV3替换Backbone(轻量化网络结构)
一、本文介绍 本文给大家带来的改进机制是MobileNetV3,其主要改进思想集中在结合硬件感知的网络架构搜索(NAS)和NetAdapt算法,以优化移动设备CPU上的性能。它采用了新颖的架构设计,包括反转残差结构和线性瓶颈层&…...
MATLAB Mobile - 使用预训练网络对手机拍摄的图像进行分类
系列文章目录 前言 此示例说明如何使用深度学习对移动设备摄像头采集的图像进行分类。 在您的移动设备上安装和设置 MATLAB Mobile™。然后,从 MATLAB Mobile 的“设置”登录 MathWorks Cloud。 在您的设备上启动 MATLAB Mobile。 一、在您的设备上安装 MATLAB M…...
LangChain入门指南:定义、功能和工作原理
LangChain入门指南:定义、功能和工作原理 引言LangChain是什么?LangChain的核心功能LangChain的工作原理LangChain实际应用案例如何开始使用LangChain 引言 在人工智能的浪潮中,语言模型已成为推动技术革新的重要力量。从简单的文本生成到复…...
关键字:import关键字
在 Java 中,import关键字用于导入类或接口,使你可以在代码中使用它们而无需完全限定其名称。以下是使用import关键字的示例代码: 在上述示例中,通过使用import关键字导入了java.util.ArrayList类,这样就可以在代码中直…...
【C#】.net core 6.0 通过依赖注入注册和使用上下文服务
给自己一个目标,然后坚持一段时间,总会有收获和感悟! 请求上下文是指在 Web 应用程序中处理请求时,包含有关当前请求的各种信息的对象。这些信息包括请求的头部、身体、查询字符串、路由数据、用户身份验证信息以及其他与请求相关…...
关于redis单线程和IO多路复用的理解
首先,Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储…...
第四十一章 XML 映射参数摘要
文章目录 第四十一章 XML 映射参数摘要 第四十一章 XML 映射参数摘要 TopicParameters启用 XML 映射。XMLENABLED 类参数将属性映射到元素或属性。XMLPROJECTION property parameter ("NONE", "ATTRIBUTE", "XMLATTRIBUTE", "CONTENT"…...
redis之五种基本数据类型
一) 字符串(String) 1 使用场景 2 编码 3 编码转换 二) List(列表) 1 使用场景 2 编码 三) Set(无序集合) 1 使用场景 2 编码 3 编码转换 四) ZSet(有序集合) 1 使用场景 2 编码 3 编码转换 五) Hash 1 使用场景 2 编码 3 编码转换 五种基本数据类型 redis…...
RocketMQ系统性学习-RocketMQ高级特性之消息大量堆积处理、部署架构和高可用机制
🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁dz…...
Angular 进阶之五: Signals到底用不用?
Angular 在V16的时候推出了Signals,在17正式作为主打功能之一强烈推荐,看过了各种博主的各种科普文章也没说明白,到底这东西值不值得用?毕竟项目大了,重构代码也不是闹着玩儿的。各种科普文章主要在说两点:…...
构建数字化金融生态系统:云原生的创新方法
内容来自演讲:曾祥龙 | DaoCloud | 解决方案架构师 摘要 本文探讨了金融企业在实施云原生体系时面临的挑战,包括复杂性、安全、数据持久化、服务网格使用和高可用容灾架构等。针对网络管理复杂性,文章提出了Spiderpool开源项目,…...
广州网站制作托管/seo中文全称是什么
300W逆变电源资料 pcb,原理图 300W逆变电源资料 pcb,原理图 id658271275104&...
可以自己制作视频的软件/沈阳网站优化
就目前的感觉,js的用途还是挺大的,而作为一个将要出道的小小程序仔,学习一下js还是很有必要的,js的总体感觉其实和别的编程语言差别不打,熟悉一下api很容易上手:现在就通过一个猜数字小游戏,熟悉…...
珠海响应式网站建设费用/北京百度总部电话
二分查找 1. 适用场景 适用于对排好序的序列的指定值进行查找 2. 复杂度 O(logN) 3. 代码 /*cpp*/ int binarySearch(int[] a, int key){int a_len sizeof(a)/sizeof(a[0]);int lo 0, hi a_len - 1;while (lo < hi){int mid lo (hi - lo) / 2;if (key < a[mid]) h…...
家具制作网站/新型实体企业100强
这个错误通常是由于卷积层(Convolutional layer)的输入通道数与卷积核(Convolutional kernel)的通道数不匹配导致的。具体地说,卷积核的通道数应该与输入 tensor 的通道数相同。 在你的代码中,卷积层的卷积…...
网站怎么做自动回复的客服/市场调研报告word模板
Java 8 C# 6 Swift 变量 类型 变量名; 类型 变量名; var 变量名 : 类型; 变量(类型推断) N/A var 变量名初值; var 变量名初值; 常量 final 类型 常量名初值; readonly 类型 常量名初值; let 常量名 : 类型 初值; 基本类型 int short long byte doub…...
网站开发外文参考文献/百度统计代码
24.文件a1.txt内容(注意每行中的空格是不一样的,需要对空格进行处理)序号 部门 人数 平均年龄 备注 1 python 30 26 单身狗 2 Linux 26 30 没对象 3 运营部 20 24 女生多通过代码,将其构建成这种数据类型:…...