当前位置: 首页 > news >正文

ubuntu上搭建bazel编译环境,构建Android APP

背景是github上下载的工程,说明仅支持bazel编译,折腾了一天Android studio,失败。

不得不尝试单价bazel编译环境,并不复杂,过程记录如下

说明:ubuntu环境是20.04,pve虚拟机安装

1.安装jdk

sudo apt install openjdk-11-jdk

2.下载安装Android Studio

Google网站下载linux上的二进制包,也可以apt安装,前者定制方便些

下载地址:下载 Android Studio 和应用工具 - Android 开发者  |  Android Developers

为了方便描述,加速下载目录是用户根目录,即$HOME

cd ~
tar -xvf android-studio-*.tar.gz

运行:

cd ~/android-studio/bin
./studio.sh

随后的界面与Windows上没什么区别,我是ssh登录的,居然也可以图形交互,运行过程会下载安装android sdk,这个是最主要的,google不让单独下载android sdk了,没办法。

记录下,默认的sdk目录~/Android/Sdk/

3.编译bazel

出于某些考虑,没有安装最新版本,挑了个中间点的版本。例如4.2.2

下载地址:https://github.com/bazelbuild/bazel/releases/download/4.2.2/bazel-4.2.2-dist.zip

解压编译:

unzip bazel-4.2.2-dist.zip
sudo ./compile.sh

编译过程出现了python报错,做个软链接解决

ERROR: /mnt/sdb/code/05_AS/src/BUILD:319:9: Executing genrule //src:embedded_tools_nojdk failed: (Exit 127): bash failed: error executing command(cd /tmp/bazel_SpFJt8tb/out/execroot/io_bazel && \exec env - \PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin \/bin/bash -c 'source external/bazel_tools/tools/genrule/genrule-setup.sh; bazel-out/host/bin/src/create_embedded_tools "bazel-out/k8-opt/bin/src/embedded_tools_nojdk.zip" bazel-out/k8-opt/bin/src/embedded_tools_nojdk.params')
Execution platform: //:default_host_platform
/usr/bin/env: 'python': No such file or directory
Target //src:bazel_nojdk failed to build
INFO: Elapsed time: 398.790s, Critical Path: 53.56s
INFO: 1055 processes: 31 internal, 1024 local.
FAILED: Build did NOT complete successfully

原因是/usr/bin目录下找不到python,加软连接

ln -s /usr/bin/python3.8 /usr/bin/python

编译ok后,把out目录的编译结果拷贝到/usr/bin

cp ./output/bazel /usr/bin
chmod 777 /usr/bin/bazel

4. 编译Android 工程

在下载好的Android工程下执行

bazel build testdpc

报错:

obana@pve-ubt20:/mnt/sdb/code/03_github/android-testdpc$ bazel build testdpc
Extracting Bazel installation...
Starting local Bazel server and connecting to it...
ERROR: While resolving toolchains for target //:testdpc: no matching toolchains found for types @bazel_tools//tools/android:sdk_toolchain_type
ERROR: Analysis of target '//:testdpc' failed; build aborted: no matching toolchains found for types @bazel_tools//tools/android:sdk_toolchain_type
INFO: Elapsed time: 20.400s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (12 packages loaded, 19 targets configured)

原因是没有加入android sdk环境变量

export ANDROID_HOME=$HOME/Android/Sdk/

后续编译方便,可以把这行加入~/.bashrc

接着下一个报错:

obana@pve-ubt20:/mnt/sdb/code/03_github/android-testdpc$ bazel build testdpc
INFO: Analyzed target //:testdpc (30 packages loaded, 1164 targets configured).
INFO: Found 1 target...
ERROR: /home/obana/.cache/bazel/_bazel_obana/f87dd64c2bc0bae87f9a70b466547b28/external/androidsdk/BUILD.bazel:13:25: Extracting interface @androidsdk//:dx_jar_import failed: missing input file 'external/androidsdk/build-tools/34.0.0/lib/dx.jar', owner: '@androidsdk//:build-tools/34.0.0/lib/dx.jar'
Target //:testdpc failed to build
Use --verbose_failures to see the command lines of failed build steps.
ERROR: /home/obana/.cache/bazel/_bazel_obana/f87dd64c2bc0bae87f9a70b466547b28/external/androidsdk/BUILD.bazel:13:25 Extracting interface @androidsdk//:dx_jar_import failed: 1 input file(s) do not exist
INFO: Elapsed time: 430.708s, Critical Path: 1.62s
INFO: 29 processes: 27 internal, 2 linux-sandbox.
FAILED: Build did NOT complete successfully

这个错误,很多同学应该熟悉,解决方案很简单,打开Android Studio,下载32版本的build tool,然后切换到32版本。

修改项目根目录下的WORKSPACE文件,

android_sdk_repository(name = "androidsdk",api_level = 34,build_tools_version = "32.0.0",
)

也有一种改法,就是仿照windows上处理。

cp ~/Android/Sdk/build-tools/34.0.0/d8 ~/Android/Sdk/build-tools/34.0.0/dx
cp ~/Android/Sdk/build-tools/34.0.0/lib/d8.jar ~/Android/Sdk/build-tools/34.0.0/lib/dx.jar

我也在stackoverflow上找到如下方法,不知道改哪,放弃;上述方法更通用些

# Enable d8 merger
build --define=android_dexmerger_tool=d8_dexmerger# Flags for the d8 dexer
build --define=android_incremental_dexing_tool=d8_dexbuilder
build --define=android_standalone_dexing_tool=d8_compat_dx
build --nouse_workers_with_dexbuilder

5.运行APP

编译成功后,可以用下命令运行APP,可以连物理机,也可以avd运行

bazel mobile-install //android:android

教程结束,enjoy!

附:官方文档地址Build Tutorial - Android - Bazel 0.20.0

相关文章:

ubuntu上搭建bazel编译环境,构建Android APP

背景是github上下载的工程,说明仅支持bazel编译,折腾了一天Android studio,失败。 不得不尝试单价bazel编译环境,并不复杂,过程记录如下 说明:ubuntu环境是20.04,pve虚拟机安装 1.安装jdk sudo…...

(第38天)RAC 修改 IP 信息

介绍 在生产中有时候会遇到机房搬迁网络变更、系统上线由测试环境切换为生产环境、系统层面双网卡绑定或者解绑等情况。Oracle RAC 环境下应该如何操作?首先,我们都知道 Oracle RAC 中的 IP 主要有:Public IP、Virtual IP、SCAN IP、Private IP 这几种,接下来分别讲解这几…...

利用法线贴图渲染逼真的3D老虎模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…...

『 MySQL数据库 』聚合统计

文章目录 前言 🥑🥝 聚合函数🍓 COUNT( ) 查询数据数量🍓 SUM( ) 查询数据总和🍓 AVG( ) 查询数据平均值🍓 MAX( ) 查询数据最大值🍓 MIN( ) 查询数据最小值 🥝 数据分组GROUP BY子句…...

Redis - 事务隔离机制

Redis 的事务的本质是 一组命令的批处理 。这组命令在执行过程中会被顺序地、一次性 全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。 当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消。 如果事务中的…...

android项目实战之编辑器图片上传预览

现状分析 项目的需求用到编辑器,编辑器中又可能用到图片上传功能。 实现方案 1. 增加依赖库,可以参考前面的几篇文章,都有描述。 2. 核心代码实现 PictureSelector.create(GoodItemContentFragment.this) .openGallery(SelectMimeType.…...

微信小程序:上传图片到别的域名文件下

效果 wxml <!-- 上传照片 --> <view class"addbtn"><view classpic name"fault_photo" wx:for"{{imgs}}" wx:for-item"item" wx:key"*this"><image classweui-uploader_img src"{{item}}"…...

Linux----内核及发行版

1. Linux内核 Linux内核是操作系统内部操作和控制硬件设备的核心程序&#xff0c;它是由芬兰人林纳斯开发的。 内核效果图: 说明: 真正操作和控制硬件是由内核来完成的&#xff0c;操作系统是基于内核开发出来的。 2. Linux发行版 是Linux内核与各种常用软件的组合产品&am…...

设备制造行业CRM:提升客户满意度,驱动业务增长

设备制造行业客户需求多样化、服务链路长&#xff0c;企业在关注APS、EMS等工业软件之余还要以客户为中心&#xff0c;做好客户服务。设备制造行业CRM管理系统是企业管理客户关系的利器&#xff0c;设备制造行业CRM的作用有哪些&#xff1f;一文带您看懂。 设备制造行业需要解…...

JavaScript实现复制功能函数

function copyUrl() {var copyText document.getElementById("url");copyText.select();document.execCommand("copy"); }其中&#xff0c;copyUrl()函数用于复制&#xff0c;document.getElementById(“url”)用于获取链接的DOM元素&#xff0c;select()…...

JVM垃圾收集器

主要垃圾收集器如下&#xff0c;图中标出了它们的工作区域、垃圾收集算法&#xff0c;以及配合关系。 HotSpot虚拟机垃圾收集器 这些收集器里&#xff0c;面试的重点是两个——CMS和G1。 Serial 收集器 Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾…...

LeetCode(58)随机链表的复制【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 随机链表的复制 1.题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节…...

JVM源码剖析之registerNatives方法

目录 版本信息&#xff1a; 写在前面&#xff1a; 源码论证&#xff1a; 总结&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;jdk8u40 写在前面&#xff1a; 在Java类库中很多类都有一个registerNatives的native方法&#xff0c;并且写在static静态代码块中进行初…...

HarmonyOS鸿蒙应用开发——数据持久化Preferences

文章目录 数据持久化简述基本使用与封装测试用例参考 数据持久化简述 数据持久化就是将内存数据通过文件或者数据库的方式保存到设备中。HarmonyOS提供两两种持久化方案&#xff1a; Preferences&#xff1a;主要用于保存一些配置信息&#xff0c;是通过文本的形式存储的&…...

C++STL库的 deque、stack、queue、list、set/multiset、map/multimap

deque 容器 Vector 容器是单向开口的连续内存空间&#xff0c; deque 则是一种双向开口的连续线性空 间。所谓的双向开口&#xff0c;意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c;当然&#xff0c; vector 容器也可以在头尾两端插入元素&#xff0c;但是在其…...

Vuex快速上手

一、Vuex 概述 目标&#xff1a;明确Vuex是什么&#xff0c;应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购…...

计网 - LVS 是如何直接基于 IP 层进行负载平衡调度

文章目录 模型LVS的工作机制初探LVS的负载均衡机制初探 模型 大致来说&#xff0c;可以这么理解&#xff08;只是帮助我们理解&#xff0c;实际上肯定会有点出入&#xff09;&#xff0c;对于我们的 PC 机来说&#xff0c;物理层可以看成网卡&#xff0c;数据链路层可以看成网卡…...

GEE机器学习——利用支持向量机SVM进行土地分类和精度评定

支持向量机方法 支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,主要用于分类和回归问题。SVM的目标是找到一个最优的超平面,将不同类别的样本点分隔开来,使得两个类别的间隔最大化。具体来说,SVM通过寻找支持向量(即距离超平面最近的样本点),确定…...

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 断点 Break 命令篇】

文章目录 1. Break.Set1.1 TRACE32 Break1.1.1 Break命令控制CPU的暂停1.2 Break.Set 设置断点1.2.1 Trace32 程序断点1.2.2 读写断点1.2.2.1 变量被改写为特定值触发halt1.2.2.2 设定非值触发halt1.2.2.4 变量被特定函数改写触发halt1.2.3 使用C/C++语法设置断点条件1.2.4 使用…...

【JVM入门到实战】(三) 查看字节码文件的工具

一、 javap -v命令 javap是JDK自带的反编译工具&#xff0c;可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件内容。直接输入javap查看所有参数。输入javap -v 字节码文件名称 查看具体的字节码信息。&#xff08;如果jar包需要先使用 jar –xvf 命令解压&a…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...