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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

坚鹏:广发银行梅州分行银行数字化转型战略、方法与案例培训

广发银行成立于1988年,前身为广东发展银行,经国务院和中国人民银行批准,是国内首批组建的全国性股份制商业银行之一,2016年8月,广发银行成为中国人寿团成员单位,2021年成为首批国内系统重要性银行。2022年&…

Java解决矩阵对角线元素的和问题

Java解决矩阵对角线元素的和问题 01 题目 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a…

Ubuntu-rsyslog和systemd-journald日志服务

rsyslog日志服务 rsyslog作为传统的系统日志服务,把所有收集到的日志都记录到/var/log/目录下的各个日志文件中。 常见的日志文件如下: /var/log/messages 绝大多数的系统日志都记录到该文件 /var/log/secure 所有跟安全和认证授权等日志…

k8s初始化报错 [ERROR CRI]: container runtime is not running: ......

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

构建Servlet项目流程

第一步:创建maven项目 部分基础 依赖的模板基础部分如下 maven-archetype-quickstart: 这是最基本的Archetype,它创建一个包含简单Java类和单元测试的项目。 maven-archetype-webapp: 这个Archetype创建一个简单的Java web应用,包括一个serv…

企业计算机服务器中了eking勒索病毒怎么办,eking勒索病毒解密数据恢复

随着计算机网络技术的不断发展与应用,企业的生产运营效率得到了极大提升,但网络安全威胁一直存在,网络威胁的技术也在不断更新,给企业的数据安全带来了严重威胁。在本月,云天数据恢复中心陆续接到很多企业的求助&#…

国产Type-C PD芯片—接口快充取电芯片

常用USB PDTYPE-C受电端,即设备端协议IC芯片(PD Sink,也叫PD诱骗芯片),诱导取电芯片。 产品介绍 LDR6328: ◇ 采用 SOP-8 封装 ◇ 兼容 USB PD 3.0 规范,支持 USB PD 2.0 ◇ 兼容 QC 3.0 规范&#x…

每日一练【四数之和】

一、题目描述 18. 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复&#x…

99、NeRF ray space

CG相机模型 在图形学中最常用的相机模型的原理和小孔成像是类似的。 不同之处在于,如上图,小孔成像得到的图像是倒立的,但是我们希望得到的图像是正向的,因此,我们选择小孔前成像。 从 3D 到 2D 的投影,…

前端开发学习 (五) 生命周期函数、Ajax请求

关于vue实例的声明周期,从Vue实例创建、运行、到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期 (https://cn.vuejs.org/v2/guide/instance.html#实例生命周期 ) 而声明周期勾子就是生命周期…

uniapp切换页面时报错问题

我们来看如下错误: 该错误的意思是不能切换到 tabbar 页面。tabbar页面通常是公共页面或者底部导航栏,如果我们用 navigateTo 或者 redirectTo 都不能实现页面切换。 我们有两种方式: 第一种是用 switchTab 来进行切换,但注意切…

了解c++11中的新增

一,统一的初始化列表 在引入c11后,我们得出计划都可以用初始化列表进行初始化。 C11 扩大了用大括号括起的列表 ( 初始化列表 ) 的使用范围,使其可用于所有的内置类型和用户自 定义的类型, 使用初始化列表时,可添加等…

从简单的词法分析、语法分析、目标代码生成、语法解释器的过程,粗略讲一下代码的运行过程

目录 简述 为什么能常说C、C语言比C#或java性能好呢 编程语言类别 代码实现一个从源码到到AST再到Interpreter 词法分析器(Lexer) 语法分析器(Parser) 解释器(Interpreter) 代码生成器(C…

uni-app 设置当前page界面进入直接变为横屏模式

首先 我们打开项目的 manifest.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏…

智能优化算法应用:基于侏儒猫鼬算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于侏儒猫鼬算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于侏儒猫鼬算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.侏儒猫鼬算法4.实验参数设定5.算法结果6.参考…

智能优化算法应用:基于海鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于海鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于海鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.海鸥算法4.实验参数设定5.算法结果6.参考文献7.MA…

mapbox导入本地geojson数据并渲染

成果图 思路与源码 我这里使用的是ant的upload组件 <a-uploadv-model:file-list"fileList":showUploadListfalsename"file"action"https://www.mocky.io/v2/5cc8019d300000980a055e76":headers"headers"change"handleChange&…

Redis主从复制的配置和实现原理

Redis的持久化功能在一定程度上保证了数据的安全性&#xff0c;即便是服务器宕机的情况下&#xff0c;也可以保证数据的丢失非常少。通常&#xff0c;为了避免服务的单点故障&#xff0c;会把数据复制到多个副本放在不同的服务器上&#xff0c;且这些拥有数据副本的服务器可以用…

Leetcode—290.单词规律【简单】

2023每日刷题&#xff08;五十一&#xff09; Leetcode—290.单词规律 实现代码 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

配电室无人值守改造

配电室无人值守改造是通过运用先进的技术和设备&#xff0c;将传统的需要人工值守的配电室改造成可以远程监控和管理的智能化配电室&#xff0c;从而实现无人值守。这种改造可以提高配电室的安全性、可靠性和效率&#xff0c;降低运维成本。 建立智能监控系统&#xff1a;通过安…