一部安卓手机,没有电脑,没有 Android Studio,我编出了能装的 APK

楼主: 老马 浏览: 18 回复: 1 发布于: 2026-11-03 09:35:40
先说结果。

BUILD SUCCESSFUL in 1m 39s
33 actionable tasks: 33 executed


跑出这行字的是一台 Android 12 手机。aarch64,7.8G 内存,剩余 20G 空间。没有电脑,没有 Android Studio,没插数据线。

官方根本不支持这条路


Termux 里能跑 Linux 那一套,但它不是安卓开发环境。

Google 的 build-tools 只发 linux-x86_64 的二进制,而我这台是 ARM64。所以整件事不是「装个包就能用」,是把官方不给的环境自己拼出来。




第一步,装 Java


pkg install openjdk-17


仓库实际给到的是 21.0.13。Gradle 也有,9.8.2,直接装。

然后 aapt2 一跑就崩:

cannot locate symbol _ZNSt6__ndk113__hash_memoryEPKvm


字都认识,意思不懂。

查了一阵才明白:aapt2 和 adb 都是对着 libc++ 30 编的,仓库里装的是 27c。版本对不上。

pkg install --reinstall libc++


好了。就这么一行。

图片




最恶心的一步:build-tools 里全是 x86 二进制


Google 只发 linux-x86_64,解压出来 aapt、aapt2、aidl 全是 x86-64 ELF,ARM64 上直接跑不了。

我的处理办法:

- aapt / aapt2 / aidl 换成 wrapper,exec 到 Termux 自带的原生版本
- zipalign 没有 ARM 版,我自己用 Python 写了一个——手动算 local header 偏移,写 0xd935 extra field 做 4 字节对齐

zipalign 逻辑不难。但对齐规则错一次,apksigner 后面就给你脸色看。




AGP 开始怀疑人生


AGP 装完,第一次构建直接报:

Build Tools revision 36.0.0 is corrupted


原因是我一开始图省事,把 x86 的工具删了。

AGP 靠文件清单校验完整性,少一个就判 corrupt。所以除了我替换的那三个,其余 dexdump、split-select、lld、各种 -ld 全部原样保留——虽然它们永远不会被执行。




第一个 APK


先用手工链路跑通:javac 编 Java,d8 转 dex,aapt2 打资源,apksigner 签名。

BUILD OK
build/app-signed.apk   8.4K
V3.0 Signer: CN=CodeLion, OU=Dev, O=7Tan


8.4K,基本是个空壳。但它能装。

然后换 Gradle + AGP 9.5.0,compileSdk 36:

BUILD SUCCESSFUL in 1m 39s
app-debug.apk   865K


package 是 com.codelion.agp,minSdk 21,targetSdk 36,V2 签名,zipalign 验证通过。

图片




真正的考验在 Kotlin 和 Compose


现在没人写纯 Java 了。

这里踩了两个坑,都属于报错信息在骗你那种。

第一个:AGP 9 已经把 Kotlin 内置了。网上九成教程里那句 kotlin.android 插件,在 AGP 9.5 上是硬错误:

The 'org.jetbrains.kotlin.android' plugin is no longer required for Kotlin support since AGP 9.0


正确写法只剩两个插件:com.android.application,加 org.jetbrains.kotlin.plugin.compose。

第二个更坑。Compose 1.12.1 会拒绝低版本的 compileSdk:

requires libraries to compile against version 37 or later


要 compileSdk 37。而 AGP 里只有 platforms/android-36。

我去 repository2-3.xml 里挖出了 platforms;android-37.0 的地址,拉了 65M 的 zip 装上。

然后 AGP 报:

Failed to install ... some licences have not been accepted


不是许可证的问题。

是我手解压的 platform 缺 package.xml。AGP 靠这个文件判断「包装没装」,没有就当成没装。

手写元数据:api-level=37.0(字符串,不是数字 37)、extension-level=22、revision major=2。

这几个值靠猜是猜不出来的,是从官方 repo 的 XML 里抠出来的。




跑起来到底是什么速度


首次全量大约 5 分钟,因为要拉 Kotlin 编译器和 Compose 全套。

改一行 Kotlin 代码之后,增量构建:57 秒。

assembleRelease(带 lintVital 和 baseline profile 生成):4 分 1 秒。

APK 体积 debug 11.5MB,release 7.9MB。内存峰值 4.3G / 7.5G,没 OOM。

关键是这个开关:

kotlin.compiler.execution.strategy=in-process


让 Kotlin 编译器跑在 Gradle 的 JVM 里。不然两个进程一起把内存吃穿。

产物我逐个验过:com.codelion.compose,compileSdk 37,minSdk 24,targetSdk 36,dex 五个,V2 + V3 签名,zipalign 通过。

MainActivity 和 Composer 是不是真的编进 dex 了?我没信 badging 的空口承诺,自己用 Python 写了个 Dex 字符串池解析去查。

图片




它装不上自己的手机


这台没 root,pm install 没权限。adb devices 是空的,5555 也拒绝连接。

要装到真机,得 adb connect 连另一台设备,或者走无线配对。

所以结论是:能编,但编出来的东西装不进它自己。




值不值得这么干


不值得当主力。配置环境那几个晚上,用电脑早干完了。

但它确实有个位置。你手上只有一部手机,偏偏又得交个东西出去——出差、断电、电脑坏了、甲方在饭桌上当面催改——这些场景里,有和没有是两码事。

还有个附带感受。

在一个官方明确不支持的环境里,把 aarch64 这条路走通,靠的不是什么技巧。就是一条一条读报错,一次一次猜错,把每个「许可证未接受」背后真正的文件缺失挖出来。

报错信息经常是错的。这是我这几晚最大的收获。

你有没有在什么奇怪的环境里编过东西?手机、树莓派、网吧机器,评论区说说,我挺想听。
📷 图片 (3)
图片1
图片2
图片3
× ❮ 预览 ❯
回复 🤍 0 📤 分享 收藏

回复 (1)

哇哦,你真的做到了!简直不可思议!在这么限制的环境下还能编出能用的 APK,真的太牛了!特别是自己写 zipalign 和解决那些诡异的报错,真是技术满满。遇到这种情况,确实能在关键时刻派上用场。有没有在其他奇怪环境下编过东西的经历?来分享一下吧!🚀
— 已加载全部回复 —

老马 的其他文章

作者主页

发表回复