开源Android apk转aab工具

功能

  1. 自动化将apk转为aab文件.
  2. 自动化实现打包smali,签名,安装.

用法

配置文件(config.toml )

复制代码
[sign]
#"exec command: java -jar {} build-apks --bundle {} --output {} --ks {} --ks-pass pass:{} --ks-key-alias {} --key-pass pass:{}", config.jar.bundletool_path, aab_path.to_string_lossy(), apks_path.to_string_lossy(), config.sign.keystore, config.sign.keystore_pass, config.sign.keystore_key_alias, config.sign.keystore_key_pass
keystore = "your_keystore_path/yourkeystore.jks"
keystore_pass= "your keystore password"
keystore_key_alias="your keystore alias"
keystore_key_pass="your key password"

[apk]
#"exec command: java -jar {} d {} -s -o {}", config.jar.apktool_path, config.apk.apk_path, config.apk.apk_outdir
apk_path="your_apk_path/yourapk.apk"
apk_outdir="your output dir"
#"exec command: aapt2 link --proto-format -o {} -I {} --min-sdk-version {} --target-sdk-version {} --version-code {} --version-name {} --manifest {} -R {} --auto-add-overlay",base_apk_path.to_string_lossy(), config.jar.android_jar_path, config.apk.min_sdk_version, config.apk.target_sdk_version, config.apk.version_code, config.apk.version_name,manifest_path.to_string_lossy(),res_zip_path.to_string_lossy()
min_sdk_version="21"
target_sdk_version="31"
version_code="101"
version_name="1.0.1"
#"{}_{}-sign.apk", time, config.apk.app_name
app_name="your app name"

[jar]
#"exec command: java -jar {} d {} -s -o {}", config.jar.apktool_path, config.apk.apk_path, config.apk.apk_outdir
apktool_path="your_apktool_path/apktool.jar"
#"exec command: aapt2 link --proto-format -o {} -I {} --min-sdk-version {} --target-sdk-version {} --version-code {} --version-name {} --manifest {} -R {} --auto-add-overlay",base_apk_path.to_string_lossy(), config.jar.android_jar_path, config.apk.min_sdk_version, config.apk.target_sdk_version, config.apk.version_code, config.apk.version_name,manifest_path.to_string_lossy(),res_zip_path.to_string_lossy()
bundletool_path="your_bundletool_path/bundletool-all-1.15.2.jar"
android_jar_path="your_sdkpath/sdk/platforms/android-31/android.jar"

[config]
#"exec command: adb install -r {}", apk_sign_path.to_string_lossy().to_string()
install = true
#"exec command: adb shell am start -n {}", config.config.main_activity
launch = true
main_activity = "your_package/your_launcher_activity"
#"exec command: java -jar {} build-bundle --modules {} --output {} --config={}", config.jar.bundletool_path, zip_path.to_string_lossy(), aab_path.to_string_lossy(), config.config.bundletool_config_path)
bundletool_config_path = "bundletool config file path"

[build_apk]
#"exec command: java -jar {} b {} -o {}", config.jar.apktool_path, config.build_apk.app_path, apk_unsign_path.to_string_lossy().to_string();
app_path="your smali dir"

apk转aab命令

复制代码
./abtool_cli -c config.toml -a aab

config.toml为配置文件. aab为指定将apk转为aab流程.

主要流程如下:

复制代码
  let outdir = Path::new(config.apk.apk_outdir.as_str());

    if !outdir.exists() {
        decode_apk(&config)?;
    }

    compile_resources(&config)?;
    link_resources(&config)?;
    unzip_apk(&config)?;
    copy_resources(&config)?;
    zip_resources(&config)?;
    compile_app_bundle(&config, time)?;
    let aab_name = sign_app_bundle(&config, time)?;

    if config.config.install {
        build_apks(&config, time)?;
        install_apks(&config)?;
        if config.config.launch {
            launch_app(&config)?;
        }
    }

编译apk

复制代码
./abtool_cli -c config.toml -a apk

smali工程编译成apk并签名.

主要流程如下:

复制代码
    apktool_build(&config, time)?;
    zipalign(&config, time)?;
    let apk_name = apksigner(&config, time)?;
    if config.config.install {
        install_apk(&config, time)?;
        if config.config.launch {
            launch_app(&config)?;
        }
    }

源码

  1. 编译

    cargo build -p abtool_cli --release

  2. upx压缩(可选)
    target/release

    upx --best --lzma abtool_cli

压缩后linux平台二进制文件大小在880k左右.

  1. 从源码运行

    cargo run -p abtool_cli -- -c your_config_file_path/config.toml -a aab

跨平台

目前在linux设备上完美运行,理论上已经适配了Windowsmac OS系统, 但未能拿到相关设备进行测试.

github项目地址:https://github.com/tangxuesong6/abtool.

相关推荐
techdashen4 分钟前
你想在 Rust 中实现动态库热重载?
开发语言·chrome·rust
黄林晴28 分钟前
官方实战指南!Compose 项目无缝迁移 KMP
android·kotlin
云樱梦海36 分钟前
FunASR:阿里达摩院开源的工业级语音识别工具包(4 款模型 + Gradio 可视化)
人工智能·开源·语音识别
tryqaaa_38 分钟前
学习日志(五)【php反序列化全加例题】【pop链,字符逃逸,session,伪协议】
android·学习·php·web·pop·session
jingling55543 分钟前
自建技术博客实战(三):工具专栏——地图定位、声音复刻与 rembg 抠图
android·开发语言·前端·ai·nextjs
Co_Hui1 小时前
Android:Service 启动
android
X54先生(人文科技)1 小时前
《元创力》纪实录·桥段刻舟遗碑:当“唯一解”的文明抵达终点
人工智能·开源·开源协议·零知识证明
DisonTangor1 小时前
微软重磅开源 Lens: 重新思考基础文本到图像模型的训练效率
人工智能·microsoft·ai作画·开源·aigc
爱睡觉1111 小时前
Android 底层输入系统改造实录:把 gpio-keys "凭空捏造"成虚拟键盘
android
plainGeekDev1 小时前
XML Shape/Selector → Kotlin 动态创建
android·java·kotlin