Termux配置安卓编译环境

前言

Termux安装后,就相当于把手机变成了一台Linux服务器,而且现在手机卡通常是能拿到ipv6公网地址的,所以,这个服务器能干啥?

  • 编程
  • 搭建网站
  • 跑脚本

本文讲述的就是怎么在Termux搭建安卓编译环境,实现手机app自产自编,自己搞自己,脱离电脑搞app开发。

Step1 配置sdkmanager

打开android 官网,下载sdkmanager最新版,推送到Termux中,创建android sdk 保存目录,解压commandline-tools并进行调整,参考android sdk标准目录,把解压内容都放到latest中。
不要直接解压,这个commandline-tools解压后不是标准目录。

标准的sdk目录是这样的
在这里插入图片描述

脚本执行处理:

curl -O https://googledownloads.cn/android/repository/commandlinetools-linux-11076708_latest.zipANDROID_HOME=~/android/sdk/
mkdir -p $ANDROID_HOME
unzip `ls |grep "commandlinetools-linux.*_latest.zip"` -d $ANDROID_HOME
# cmdline-tools 的产物需要移动到cmdline-tools/latest目录中,这是android sdk固定的路径组织形式
# 压缩包没有包含在latest文件夹中,自己移动一下
mv $ANDROID_HOME/cmdline-tools/* $ANDROID_HOME/latest
mv $ANDROID_HOME/latest $ANDROID_HOME/cmdline-tools

啥,命令有点多,手指打字累死

那还是连接个蓝牙键盘吧,打开手机otg功能,就可以自由输入了,啥,你没有蓝牙键盘?没事,淘宝几元一个usb otg转接头,把键盘插到手机上也可以。

啥?都没有,那你还是开启sshd服务,电脑连接手机吧,可以参考作者前一篇文。

Step2 配置android环境变量

命令

vim ~/.bashrc

配置:

echo "用户:"$(whoami)if pgrep -x "sshd" >/dev/nullthenecho#echo "sshd运行中..."elsesshdecho "自动启动sshd"
fi
export ANDROID_HOME=~/android/sdk
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH

执行source .bashrc 更新环境变量,使之生效
不生效就干掉Termux,重新打开。

Step3 下载android sdk开发工具

sdkmanager下载之后不代表弄完了android开发环境,这个sdkmanager仅仅是个管理sdk的命令行工具,它是用来下载、更新、移除安卓sdk的。

所以,通过它安装目前最新的安卓版本开发工具吧:

#查看sdk列表
sdkmanager --list
#安装安卓14平台开发工具
sdkmanager --install "platforms;android-34"
#安装支持安卓14的构建工具
sdkmanager --install "build-tools;34.0.0"

Step3 配置Java环境

Termux显然不能直接安装android studio来使用,所以需要我们自己配置java环境(当然,你又在Termux中安装ubutun当我没说)

Termux 官方的jdk是17,比较新,正常来说,本文发布时安卓开发用得最多的是jdk11,jdk17部分老项目无法编译。

但是jdk11的Termux兼容版本被原作者干掉了,所以,想折腾的兄弟去github再找找吧,不行就自己编译。

不用纠结,上jdk17,编译不了的项目,给它升级!

Termux安装jdk17一条命令即可:

pkg install openjdk-17

哈哈哈,啊啊啊~你仰天大笑一声,竖子!敢尔。你以为不过如此,和linux平台搞环境一毛一样,于是你匆匆忙忙安装git,然后迫不及待地下载一个项目来编译,结果编译失败,你傻眼了。

Step5 安卓sdk环境修复

第一个异常

你的操作过程如下:

# 下载一个git项目
git clone xxxx.git
cd xxxx
# 赋予gradle脚本执行权限
chmod +x ./gradlew
./gradlew build

你得到的错误如下:
在这里插入图片描述

原因很简单,环境变量ANDROID_HOME没配置???什么,之前不是配置了吗?你不管了,你知道Termux和正常的Linux还是有区别的,于是vim local.properties 编辑文件,指定了

# 写全路径,不写$ANDROID_HOME,读不到
sdk.dir=/data/data/com.termux/files/home/android/sdk

再然后,编译,你又傻眼了

第二个异常

在这里插入图片描述

你观察发现,似乎报错是说这个错误正常不应该出现。所以是sdk异常?
问谷歌,你找到了原因,原来是google编译的安卓sdk没有arm版本,而现代手机通常都是arm-v8-64架构。
github一番,你千辛万苦找到了sdk工具的各种架构版本:
https://github.com/lzhiyong/android-sdk-tools/releases/tag/34.0.3

https://github.com/lzhiyong/android-sdk-tools/releases/download/34.0.3/android-sdk-tools-static-aarch64.zip

https://github.com/lzhiyong/android-sdk-tools/releases/download/34.0.3/android-sdk-tools-static-arm.zip

https://github.com/lzhiyong/android-sdk-tools/releases/download/34.0.3/android-sdk-tools-static-i686.zip

https://github.com/lzhiyong/android-sdk-tools/releases/download/34.0.3/android-sdk-tools-static-x86_64.zip

你选择了arm版本下载,按照指引将其解压到sdk对应的目录,并覆盖掉。

命令:

curl -O https://github.com/lzhiyong/android-sdk-tools/releases/download/34.0.3/android-sdk-tools-static-arm.zipunzip android-sdk-tools-static-arm.zip -d ./armtools
# 下载的是34版本的,所以,覆盖到34版本的目录
cp -p ./armtools/build-tools/*  ~/android/sdk/build-tools/34.0.0
cp -p ./armtools/platform-tools/*  ~/android/sdk/platform-tools 

再次编译项目,你懵逼了,怎么还是一样的错误?你不禁深深地怀疑人生。

经过一个香烟的思考时间后,你终于把目光看向这一行报错代码:
/data/data/com.termux/files/home/.gradle/caches/transforms-4/2e9d53eb8f30ecd552adf0fe0f14f8c5/transformed/aapt2-8.4.0-alpha07-11315950-linux/aapt2[2]: syntax error: unexpected '('

这说明.gradle下存在一个aapt2,gradle编译的时根本没拿sdk目录的aapt 文件?

你进到报错的目录一看,果然如此!

你不禁跃跃欲试:“大胆点?我直接把这个gradle路径下的aapt2替换掉?”

说干就干。
因为sdk目录的aapt2已经被替换了,所以,你直接命令行覆盖报错:

# 注意,因为gradle草丹的缓存机制,每个人甚至每个项目的路径都不一样,请按照自己报错的路径进行替换
cp -f ~/android/sdk/build-tools/34.0.0/aapt2 /data/data/com.termux/files/home/.gradle/caches/transforms-4/2e9d53eb8f30ecd552adf0fe0f14f8c5/transformed/aapt2-8.4.0-alpha07-11315950-linux/aapt2

再次编译,./gradlew assembleDebug
Good good study, day day up.
Success!

可以愉快地去安装apk了。

在这里插入图片描述

Setup6 安装apk到手机中

编译已经完成,我相信,大家可以随意拖apk出来,然后点击安装了。

不外呼:cp ./app/build/outputs/apk/debug/app-debug.apk /sdcard/
然后打开手机,去点击安装嘛。

不过,现在我要介绍的是,执行adb安装到本手机上。

adb在sdk的platform-tools下,将其添加到环境变量中,以便运行

echo "用户:"$(whoami)if pgrep -x "sshd" >/dev/nullthenecho#echo "sshd运行中..."elsesshdecho "自动启动sshd"
fi
export ANDROID_HOME=~/android/sdk
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH

如果,我是说如果你是普通运用,只想用adb安装东西,不想安装sdk那么繁琐,完全可以执行命令安装pkg install android-tools
这会安装一个旧版本的安卓开发工具包,包含adb。

接下来就是重头戏。平时我们都是电脑调式手机,现在如何让手机自己调试自己呢?

换个角度,平时电脑执行adb,相当与Termux现在是电脑,如何让手机开启调式后,连上自己呢?

我们可以通过开启wifi调试来使Termux中的adb连接到手机本身

具体步骤:

  • 手机和电脑同一个局域网,且连接USB到电脑
  • 手机开启wifi调试模式
  • 获取wifi调试地址,命令连接:adb connect xxxxx:xxx

以上是针对android11及以上手机,如果是安卓10以以下的手机:

  • adb tcpip 6666 开启手机调式端口,6666
  • 打开Termux,·adb connect 手机ip:6666· 即可连接
  • 拔掉USB。正常在Termux使用adb调式

和一般的adb wifi调试没有任何区别

针对远程云手机,又是什么情况呢?

不通过adb显示画面的远程云机
直接在Termux操作就行,但不一定能开启,因为低于安卓11的手机,需要USB线连接电脑后才能执行命令打开wifi连接,但远程云机基本都是虚拟机,根本没有USB这回事儿。

通过adb显示画面的远程云机

  • 由于adb连接地址本身就Termux尝试通过

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

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

相关文章

c++之说_12|模板

关于模板&#xff0c;至少我们要先了解几个概念 一&#xff1a;函数模板 二&#xff1a;类模板 三&#xff1a;模板特化 四&#xff1a;形参参数包 模板覆盖的东西太多 我目前也不了解太多 函数模板 语法 template<typename 类型名,typename 类型名,typename ...多参…

CopyOnWriteArrayList底层原理全面解析【建议收藏】

简介 CopyOnWriteArrayList是Java中的一个线程安全的集合类&#xff0c;是ArrayList线程安全版本&#xff0c;主要通过Copy-On-Write&#xff08;写时复制&#xff0c;简称COW&#xff09;机制来保证线程安全。 Copy-On-Write机制核心思想&#xff1a;向一个数组中添加数据时…

LabVIEW动平衡测试与振动分析系统

LabVIEW动平衡测试与振动分析系统 介绍了利用LabVIEW软件和虚拟仪器技术开发一个动平衡测试与振动分析系统。该系统旨在提高旋转机械设备的测试精度和可靠性&#xff0c;通过精确测量和分析设备的振动数据&#xff0c;以识别和校正不平衡问题&#xff0c;从而保证机械设备的高…

Springboot集成jasypt实现配置文件加密

Jasypt它提供了单密钥对称加密和非对称加密两种加密方式。 单密钥对称加密&#xff1a;一个密钥加盐&#xff0c;可以同时用作内容的加密和解密依据&#xff1b; 非对称加密&#xff1a;使用公钥和私钥两个密钥&#xff0c;才可以对内容加密和解密&#xff1b; 我们以单密钥对称…

前端 reduce()用法总结

定义 reduce()方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行)&#xff0c;将其结果汇总为单个返回值。语法为&#xff1a; array.reduce(function(accumulator, currentValue, currentIndex, arr), initialValue); /*accumulator: 必需。累计器currentValu…

5 步轻松上手,教你从 0 到 1 落地 Jmeter 接口自动化脚本!

Jmeter是进行接口测试的一款非常主流的工具&#xff0c;但绝大部分测试工程师&#xff0c;对于Jmeter接口测试脚本整理都是一知半解的。今天这篇文章&#xff0c;就以一个金融项目中接口为例&#xff0c;通过简单5步&#xff0c;教大家如何0代码编写Jmeter接口自动化脚本&#…

CPU和GPU有什么区别,玩游戏哪个更重要?

大家好&#xff01;今天我们要聊的话题是CPU和GPU&#xff0c;它们在电脑中扮演着重要的角色&#xff0c;虽然看起来只是两个简单的缩写&#xff0c;但它们的功能和影响是截然不同的&#xff01; 那么&#xff0c;究竟CPU和GPU有什么区别呢&#xff1f;在玩游戏时&#xff0c;…

Linux 系统开启网络服务

首先&#xff0c;大家新装的linux系统可能都没有安装vim工具&#xff0c;所以打开文件的方式是 vi /etc/sysconfig/network-scripts/ifcfg-ens33在这个界面把onboot改为yes&#xff0c;我这里是设置完的。然后通过下面语句重新启动服务就可以了。 service network restartcen…

2024.2.7日总结(小程序开发4)

页面导航 页面导航是页面之间的相互跳转&#xff1a; <a>链接location.href 小程序中实现页面导航的两种方式&#xff1a; 声明式导航 在页面上声明一个<navigator>导航组件通过点击<navigator>组件实现页面跳转 编程式导航 调用小程序的导航API&…

飞天使-k8s知识点15-kubernetes散装知识点4-CNI网络插件与kubectl

文章目录 CNI 网络插件安装任意节点运行kubectlAPI的版本区别与废弃API查询 CNI 网络插件安装 这里将以 Calico 为例&#xff0c;提供在 Kubernetes 1.20.6 版本上安装 CNI 插件的步骤。请注意&#xff0c;具体的步骤可能会因 CNI 插件的类型和你的特定环境而略有不同。设置 Ku…

BaseMapper中提供的方法(17种CRUD)

BaseMapper封装的17种增删改查方法 MybatisPlus框架中mapper层继承了BaseMapper接口&#xff0c;该接口中封装了常用的增删改查方法&#xff0c;共有17种&#xff0c;以下是方法的详情介绍 首先需要明确的括号内的一些对象定义 泛型T&#xff1a;实体类类型Param注解&#x…

iPhone解锁 AnyMP4 iPhone Unlocker

AnyMP4 iPhone Unlocker是一款功能强大的iPhone解锁软件&#xff0c;旨在帮助用户轻松解决iPhone密码忘记、设备锁定等问题。无论是屏幕密码、指纹解锁还是Face ID&#xff0c;该软件都能提供有效的解决方案。 这款软件支持多种iPhone型号&#xff0c;包括最新的iPhone 14系列…

2.3_9 吸烟者问题

2.3_9 吸烟者问题 问题描述 问题分析 假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它&#xff0c;但是要卷起并抽掉一支烟&#xff0c;抽烟者需要有三种材料&#xff1a;烟草、纸和胶水。三个抽烟者中&#xff0c;第一个拥有烟草、第二个拥有纸…

泛娱乐社交出海洞察,Flat Ads解锁海外增长新思路

摘要:解读泛娱乐社交应用出海现状与趋势,解锁“掘金”泛娱乐社交出海赛道新思路。 根据全球舆情监测机构 Meltwater 和社交媒体机构We are Social最新发布数据显示,全球社交媒体活跃用户数量已突破50亿,约占世界人口总数62.5%。庞大的用户数量意味着广阔的增量空间,目前,随着全…

使用HCPpipelines分割皮层

前段时间阅读了一篇文献,文章的做法我比较感兴趣,所以打算学习一下文献的做法。文章的最开始一部分是使用HCPpipelines对T1和T2像进行皮层分割,调用的是freesurfer6。https://github.com/Washington-University/HCPpipelines 一、工作环境准备 1.安装好FSL,版本在6.0.2以上…

Linux环境下配置HTTP代理服务器教程

大家好&#xff0c;我是你们可爱的Linux小助手&#xff01;今天&#xff0c;我将带你们一起探索如何在Linux环境下配置一个HTTP代理服务器。请注意&#xff0c;这不是一次火箭科学的实验&#xff0c;而是一次简单而有趣的冒险。 首先&#xff0c;我们需要明确什么是HTTP代理服…

Unity AnimationRigging无法修改权重?

个人理解&#xff0c;已解决无法修改权重的问题: unity自带的动画系统是在FixUpdate和Update之后LateUpdate之前执行&#xff0c;如果在这FixedUpdate或Update函数内更新AnimationRigging内的权重后&#xff0c;内部动画系统会覆盖权重的修改&#xff0c;导致无法正确更新&…

通过docker-compose部署NGINX服务,并使该服务开机自启

要在通过docker-compose部署的NGINX服务实现开机自启&#xff0c;你需要确保Docker守护进程在系统启动时自动运行&#xff0c;并配置docker-compose.yml文件以在容器中运行NGINX服务。以下是步骤&#xff1a; 确保Docker守护进程开机启动&#xff1a; 在Ubuntu/Debian上&#x…

FL Studio21最新正式版更新下载及实用功能详解

FL Studio 21是一款功能强大的音乐制作软件&#xff0c;它经历了多个版本的更新&#xff0c;每次更新都会增加新的功能和优化现有功能&#xff0c;提高用户体验和工作效率。以下是FL Studio 21的一些版本更新、功能特点以及下载方式的介绍&#xff1a; 版本更新&#xff1a; F…

C++判断回文字符串的两种方法

解法1&#xff1a;遍历一半字符串 若字符串个数为奇数遍历到n/2 若为偶数则遍历到n/2-1中间最后只剩一个字符不需判断 &#xff08;int是向下取整的&#xff09; 假设字符串长度为len&#xff0c;字符下标从0~len-1 先看第0个和第len-1字符是否相同&#xff0c; 在看第1和第…