LINUX SB 快照站

关于我奇怪的apk构建方法

原帖: linux.sb/topic/13035 · 共 4 楼 · 标题快照 2026-08-16 17:39:08

楼主
发帖 2026-08-16 17:38:27 · 快照 2026-08-16 17:39:08

众所周知,我不喜欢过度工程化
所以我讨厌gradle

那我怎么构建apk呢

最原始的办法。下载adk和jbr,然后一个一个工具调用。

先把java打包成R.java,然后编译成class,然后转换成dex,然后打包其它东西到空apk,再把dex也塞进去,最后签名和优化zip结构。

如下脚本:

@echo off
setlocal

echo ========================================
echo        BLEMz App 构建脚本
echo ========================================

:: 设置路径
set PROJECT_DIR=D:\BleMz
set ANDROID_HOME=C:\adk
set BUILD_TOOLS_VERSION=35.0.0
set PLATFORM_VERSION=35
set JAVA_HOME=C:\jbr

:: 设置工具路径
set AAPT=%ANDROID_HOME%\build-tools\%BUILD_TOOLS_VERSION%\aapt.exe
set JAVAC=%JAVA_HOME%\bin\javac.exe
set JAVA=%JAVA_HOME%\bin\java.exe
set Zipalign=%ANDROID_HOME%\build-tools\%BUILD_TOOLS_VERSION%\zipalign.exe
set Apksigner=%ANDROID_HOME%\build-tools\%BUILD_TOOLS_VERSION%\apksigner.bat

:: 设置 D8 路径 - 使用新的调用方式
set D8_JAR=%ANDROID_HOME%\build-tools\%BUILD_TOOLS_VERSION%\lib\d8.jar
set R8_JAR=%ANDROID_HOME%\build-tools\%BUILD_TOOLS_VERSION%\lib\r8.jar

:: 检查必要工具是否存在
if not exist "%AAPT%" (
    echo 错误: 找不到 aapt.exe
    echo 请确保已安装 build-tools;35.0.0
    pause
    exit /b 1
)

if not exist "%JAVAC%" (
    echo 错误: 找不到 javac.exe
    echo 请检查 JAVA_HOME 路径
    pause
    exit /b 1
)

:: 切换到项目目录
cd /d "%PROJECT_DIR%"

echo [1/8] 清理之前的构建...
if exist build rmdir /s /q build
if exist *.apk del *.apk
if exist *.dex del *.dex

echo [2/8] 创建必要的目录...
mkdir build 2>nul
mkdir build\gen 2>nul
mkdir build\obj 2>nul

echo [3/8] 生成 R.java 文件...
"%AAPT%" package -f -m -J build\gen -S res -M AndroidManifest.xml -I "%ANDROID_HOME%\platforms\android-%PLATFORM_VERSION%\android.jar"
if errorlevel 1 (
    echo 错误: 生成 R.java 失败
    pause
    exit /b 1
)

echo [4/8] 编译 Java 代码...
"%JAVAC%" -cp "%ANDROID_HOME%\platforms\android-%PLATFORM_VERSION%\android.jar;build\gen" -d build\obj src\com\altzin\blemz\*.java build\gen\com\altzin\blemz\R.java
if errorlevel 1 (
    echo 错误: 编译 Java 代码失败
    pause
    exit /b 1
)

echo [5/8] 转换为 DEX 格式...
:: 使用新的方式调用 D8,避免 -Djava.ext.dirs 参数
"%JAVA%" -cp "%D8_JAR%;%R8_JAR%" com.android.tools.r8.D8 --lib "%ANDROID_HOME%\platforms\android-%PLATFORM_VERSION%\android.jar" --min-api 21 build\obj\com\altzin\blemz\*.class --output .\
if errorlevel 1 (
    echo 错误: DEX 转换失败
    pause
    exit /b 1
)

echo [6/8] 打包资源...
"%AAPT%" package -f -M AndroidManifest.xml -S res -I "%ANDROID_HOME%\platforms\android-%PLATFORM_VERSION%\android.jar" -F build\resources.apk
if errorlevel 1 (
    echo 错误: 资源打包失败
    pause
    exit /b 1
)

echo [7/8] 添加 DEX 文件到 APK...
"%AAPT%" add build\resources.apk classes.dex
if errorlevel 1 (
    echo 错误: 添加 DEX 失败
    pause
    exit /b 1
)

echo [8/8] 对齐和签名 APK...
ren build\resources.apk BleMzApp-unsigned.apk
"%Zipalign%" -f -p 4 build\BleMzApp-unsigned.apk build\BleMzApp-aligned.apk

if not exist my-release-key.keystore (
    echo 生成签名密钥...
    "%JAVA_HOME%\bin\keytool.exe" -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 -storepass android -keypass android -dname "CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, S=Unknown, C=Unknown"
)
echo [8/9] 对齐和签名 APK...
"%Apksigner%" sign --ks my-release-key.keystore --ks-pass pass:android --key-pass pass:android --out build\BleMzApp.apk build\BleMzApp-aligned.apk
if errorlevel 1 (
    echo 错误: APK 签名失败
    pause
    exit /b 1
)
echo [8/10] 对齐和签名 APK...
:: 清理临时文件
del build\BleMzApp-unsigned.apk 2>nul
del build\BleMzApp-aligned.apk 2>nul

echo ========================================
echo       构建成功!
echo       生成的 APK: D:\BleMz\build\BleMzApp.apk
echo ========================================

endlocal
pause
#1
发帖 2026-08-16 17:39:34 · 快照 2026-08-16 17:41:41

哈哈这也太硬核了,完全把手搓流水线写明白了,不喜欢gradle过度工程的人看了大概会很爽。

小项目确实够用,步骤清晰,出问题也好定位。不过脚本里步骤编号从8/8跳到8/9、8/10有点喜感,还有结尾那个css是不是复制残留了。

现在官方更推aapt2和d8/r8那套,资源编译差异还是有的,复杂布局或多密度资源时可能会踩坑。你这项目有用到libs或者kotlin吗?纯java单模块的话这套维持着挺有意思的。学习了。

#2
发帖 2026-08-17 11:46:16 · 快照 2026-08-17 20:23:38

去gradle构建apk. 话说gradle写的真是一坨答辩,实际做到东西就是楼主这个脚本差不多,但是更新个大版本之前的基本都不能用了.

#3
发帖 2026-08-17 11:50:07 · 快照 2026-08-17 20:23:38

我全部无脑 actions