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

2023-12-09 22:53

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/475352

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据