学用awk, 在linux下对android apk 重签名、安装一条龙

一键签名安装APK脚本
本文介绍了一个用于一键签名并安装APK文件的shell脚本。该脚本能够自动完成对APK文件的签名,并利用adb工具进行安装。文中提供了完整的脚本代码,方便读者直接使用。

新建 文件 apksign.sh

运行时,只需要 ./apksign xx.apk 即可,自动完成签名,并通过adb按装


linux 下的工具越用越顺手.用的时间越长积累越多。

Windows 下,每一次升级都需要学习一些新东西,同时老知识作废。经常一些绝户的事情。只在一个版本上有效。没有延继性。


内容如下:

#!/bin/sh
echo $@ | awk '
{
#printf("\n"$1"\n");
if (4 > length($1)) {
printf("./apksign.sh xx.apk\n");
exit(0);
}
len = length($1);
suffix = substr($1, length($1) - 3, 4);
if (suffix != ".apk") {
system("echo ./apksign.sh xx.apk\n");
exit(0);
}
filename = substr($1, 1, length($1) - 4);
newfile = filename"-mysign"suffix;
printf("signapk ...\n");
system("java -jar signapk.jar mykey.x509.pem mykey.pk8 "$1" " newfile "\n");


printf("install ...\n");
system("adb install -r "newfile"\n");
}'

<think>嗯……用户现在需要的是在Linux系统上安装AndroidAPK的脚本或方法。先回顾一下之前的引用内容,里面提到的是AndroidNDK的安装,虽然相关但并不是用户当前需要的。用户真正关心的是APK安装的自动化方案。看来用户可能是个Android开发人员,正在寻找更高效的测试部署方式。ta跳过基础问题直接询问脚本,说明应该已经掌握了基本adb用法,现在需要批量化/自动化的解决方案。核心解决方案其实是用adbinstall命令,但根据使用场景不同需要区分几种情况:第一种是单设备直连安装,这个最简单,直接用adbinstallpath/to/app.apk就行。但用户要求脚本化,可以写成shell脚本并配合参数传入APK路径。第二种需要处理多设备的情况。因为adb在检测到多个设备时会报错,所以要先通过adbdevices获取设备ID,再用-s参数指定设备安装。这里可能需要一些文本处理技巧来提取设备ID。第三种更复杂的是无线调试安装。因为新版Android要求先配对,步骤稍多:先用adbpairip:port配合配对码建立连接,再用adbconnect连接设备,最后才是安装。可以做成交互式脚本自动处理流程。想到用户可能需要错误处理功能,比如安装失败时能显示具体原因。可以在脚本里添加对adbinstall返回值的判断,非0时输出错误信息。还有覆盖安装(-r)和允许测试包(-t)的选项也很实用。最后用户可能需要适配不同的Linux发行版。虽然adb命令通用,但涉及USB设备权限时需要配置udev规则,这点要特别提醒,否则可能出现权限错误。考虑到用户明确要求“脚本”,准备提供两个版本参考:基础版适合单设备固定APK路径;增强版支持多设备选择和错误处理。另外无线调试部分单独写个小片段会更清晰。这个需求其实涉及adb的深入使用,后续可能会延伸出签名验证、多架构APK选择等问题……</think> 好的,在Linux系统中安装Android APK文件,核心工具是 **Android Debug Bridge (adb)**。你需要安装并配置好`adb`环境,并使用它的`install`命令。以下是详细的方法和脚本示例: ### 基础方法 (命令行安装) 1. **确保 adb 已安装**: * 大多数Linux发行版可以通过包管理器安装: ```bash # Ubuntu/Debian sudo apt update && sudo apt install android-tools-adb android-tools-fastboot -y # Fedora sudo dnf install android-tools -y # Arch/Manjaro sudo pacman -S android-tools ``` 2. **连接 Android 设备**: * **USB 连接**: * 使用USB线将设备连接到Linux电脑。 * 在设备上启用 **开发者选项**(通常需要进入“设置” > “关于手机” > 多次点击“版本号”直至提示)。 * 在开发者选项中启用 **USB 调试**。 * 当设备第一次连接时,会弹窗询问是否**允许USB调试**,勾选“始终允许”并点击“确定”。 * **无线连接 (Android 11+)**: * 确保设备和电脑在同一局域网。 * 在设备上(已启用开发者选项和USB调试),转到 **开发者选项** > **无线调试** > 启用。 * 点击**使用配对码配对设备**,记下显示的**IP地址:端口**和**配对码**。 * 在电脑终端执行: ```bash adb pair : # 用实际值替换 adb connect :# 用实际值替换 ``` 3. **验证设备连接**: ```bash adb devices ``` 如果成功连接,你会看到你的设备序列号(或IP:PORT)后面显示`device`。 4. **安装 APK**: 使用`adb install`命令: ```bash adb install /path/to/your/app.apk ``` * 覆盖安装(更新): `adb install -r /path/to/your/app.apk` * 允许测试包: `adb install -t /path/to/your/app.apk` * 多APK安装(Split APKs): `adb install-multiple app_base.apk app_feature.apk ...` ### Shell 脚本示例 下面是几个不同场景的脚本示例: #### 基础脚本 (`install_apk.sh`) ```bash #!/bin/bash # 脚本参数1: APK文件的绝对路径 APK_PATH="$1" # 参数检查 if [ -z "$APK_PATH" ]; then echo "错误: 请指定APK文件的路径作为参数." echo "用法: $0 " exit 1 fi # 检查adb是否可用 if ! command -v adb &> /dev/null; then echo "错误: adb 未找到! 请确保Android平台工具已安装并在PATH中." exit 1 fi # 检查设备连接 (简单的存在性检查) DEVICES=$(adb devices | grep -v "List of devices" | grep "device$" | wc -l) if [ "$DEVICES" -eq 0 ]; then echo "错误: 未检测到已连接的Android设备。请确认:" echo " 1. USB线连接 (或无线调试正确连接)?" echo " 2. 设备是否开启了USB调试?" echo " 3. 是否授权了这台电脑?(检查设备屏幕提示)" exit 1 fi # 尝试安装 echo "正在安装APK: $APK_PATH" echo "--------------------------------------------" adb install "$APK_PATH" INSTALL_RESULT=$? echo "--------------------------------------------" if [ $INSTALL_RESULT -eq 0 ]; then echo "安装成功!" else echo "安装失败! (adb错误代码: $INSTALL_RESULT)" fi exit $INSTALL_RESULT ``` **使用方法**: 1. 将脚本保存为`install_apk.sh`。 2. 赋予执行权限: ```bash chmod +x install_apk.sh ``` 3. 运行脚本并传递APK路径: ```bash ./install_apk.sh /home/user/downloads/my_app.apk ``` #### 增强版脚本 (处理多设备/指定设备安装) ```bash #!/bin/bash # 可选参数1: -s (指定连接的设备ID,通过 `adb devices` 获取) # 可选参数2: (APK文件路径) DEVICE_ID="" APK_PATH="" # 解析参数 while getopts "s:" opt; do case ${opt} in s) DEVICE_ID="$OPTARG" ;; \?) echo "无效选项: -$OPTARG" >&2 exit 1 ;; :) echo "选项 -$OPTARG 需要一个参数." >&2 exit 1 ;; esac done shift $((OPTIND -1)) APK_PATH="$1" # 其余检查(adb是否存在、路径检查)与基础脚本类似... # 列出设备 echo "可用设备:" adb devices | awk 'NR>1 && $2=="device"{print "-", $1}' # 构造adb命令基础 ADB_CMD="adb" if [ -n "$DEVICE_ID" ]; then ADB_CMD="$ADB_CMD -s $DEVICE_ID" echo "已指定设备ID: $DEVICE_ID" fi # 安装命令 echo "正在安装APK: $APK_PATH 到设备${DEVICE_ID:-'(默认)'}..." echo "--------------------------------------------" $ADB_CMD install "$APK_PATH" # $ADB_CMD install -r "$APK_PATH" # 如果需要覆盖安装 INSTALL_RESULT=$? # 安装结果反馈(同基础脚本)... ``` **使用方法**: 1. 安装到默认设备: ```bash ./install_apk_enhanced.sh /path/to/app.apk ``` 2. 安装到指定设备(需要设备的序列号/IP:端口): ```bash ./install_apk_enhanced.sh -s /path/to/app.apk ``` ### 关键注意事项 1. **USB 权限/udev 规则 (重要!)**: * 如果使用USB连接时`adb devices`找不到设备(或显示`??????`),可能是权限问题。 * 解决办法:添加udev规则。 * 创建文件 `/etc/udev/rules.d/51-android.rules` (需root权限)。 * 使用以下通用规则 (替换`YOUR_USERNAME`为你的用户名): ``` SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev", OWNER="YOUR_USERNAME" ``` * `idVendor=="18d1"` 代表Google (Nexus/Pixel设备)。其他厂商ID(如`0bb4` - HTC, `04e8` - Samsung, `0fce` - Sony)也需要添加或替换。查询设备ID用 `lsusb`。 * 保存后运行: ```bash sudo udevadm control --reload-rules sudo udevadm trigger ``` * 重新插拔设备。 2. **ADB 服务器管理**: * `adb kill-server`:强制停止`adb`服务器(解决卡死或无响应)。 * `adb start-server`:显式启动服务器。 * 安装脚本中可以考虑添加超时或重启逻辑来处理连接不稳定情况。 3. **文件权限**: 确保运行脚本的用户对指定的APK文件有读取权限。 4. **APK兼容性**: `adb install`会检查APK是否与目标设备的CPU架构、API Level兼容。安装失败的错误信息通常会提示原因(如`INSTALL_FAILED_NO_MATCHING_ABIS`,`INSTALL_FAILED_OLDER_SDK`)。 ### 自动化集成建议 * 将`adb`命令集成到你的CI/CD流程(如Jenkins, GitLab CI, GitHub Actions)中自动部署到连接的测试设备。 * 使用`.env`文件或命令行参数传入特定环境(如设备ID、APK存储路径、安装选项)。 * 结合`finds`或循环遍历文件夹批量安装多个APK
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值