背景,个人从windows 电脑换成公司的mac 电脑,没有右键菜单自定义功能一点也不习惯,之前写的注册表右键菜单,根据后缀是apk显示右键菜单,调用adb 进行安装到常用手机,而在mac OS 中不支持根据后缀显示菜单,要实现根据后缀显示菜单的话,只能开发一个Finder插件,或者买一个右键菜单工具iRightMenu Pro,它可以根据后缀显示一级菜单。然而macos 的快速操作也可以显示右键菜单,只是不能根据后缀动态显示,如果快速操作菜单写得多了,所有的文件和文件夹都会有个快速操作的菜单,会显得很难看。
本文现在说的就是使用快速操作,给选中的apk写一个app,实现选择安装到指定的设备中。
第一步:创建应用程序 app
-
打开自动操作,选择应用程序 图1
-
选择实用工具-点击"运行shell脚本" 图2
-
Shell,选择/bin/bash ,传递输入,选择 作为自变量
-
编写shell 脚本,复制下面我给到的脚本代码,将 ADB 的路径切换成你自己电脑的ADB 路径
-
调试运行脚本,可以临时将APK_PATH的值替换成你的apk 文件路径,然后就可以点击右上角的运行按钮,看看能否正常使用了,能正常使用就将该路径内容还原。
-
保存,可以将应用程序保存到应用程序目录。就会生成.app文件了
图1 选择应用程序
图2 编写shell
#!/bin/bash
# 获取 APK 文件路径(第一个传入参数)
APK_PATH="$1"
# 检查参数
if [ -z "$APK_PATH" ]; then
osascript -e 'display dialog "请拖入 APK 文件启动安装。" with title "系统提示" buttons {"OK"}'
exit 0
fi
# 检查文件是否存在
if [ ! -f "$APK_PATH" ]; then
osascript -e 'display dialog "错误:文件不存在!" with title "系统提示" buttons {"OK"}'
exit 0
fi
# 指定 ADB 路径(你可以修改为自己本机路径)
ADB="$HOME/Library/Android/sdk/platform-tools/adb"
# 检查 ADB 是否存在
if [ ! -x "$ADB" ]; then
osascript -e 'display dialog "找不到 adb,请检查路径。" with title "系统提示" buttons {"OK"}'
exit 0
fi
# 获取连接的设备(使用 adb devices -l 获取 model 名)
devices_output=$("$ADB" devices -l | grep 'device ')
# 存储显示名和 serial 的对应数组
device_names=()
device_serials=()
while read -r line; do
serial=$(echo "$line" | awk '{print $1}')
model=$(echo "$line" | grep -o 'model:[^[:space:]]*' | cut -d: -f2)
if [ -z "$model" ]; then
model="$serial"
fi
display_name="$model ($serial)"
device_names+=("$display_name")
device_serials+=("$serial")
done <<< "$devices_output"
# 没有设备连接
if [ ${#device_serials[@]} -eq 0 ]; then
osascript -e 'display dialog "未检测到连接的 Android 设备。" with title "系统提示" buttons {"OK"}'
exit 0
fi
# 如果只有一个设备,直接安装
if [ ${#device_serials[@]} -eq 1 ]; then
selected_serials=("${device_serials[0]}")
selected_display_names=("${device_names[0]}")
else
# 多设备时显示选择框
device_names+=("全部设备")
SELECTION=$(osascript <<EOF
set deviceList to {$(printf '"%s", ' "${device_names[@]}" | sed 's/, $//')}
choose from list deviceList with prompt "请选择要安装 APK 的设备(可多选):" with title "系统提示" with multiple selections allowed default items {"全部设备"}
EOF
)
if [ "$SELECTION" = "false" ]; then
osascript -e 'display dialog "用户取消了操作。" with title "系统提示" buttons {"OK"}'
exit 0
fi
# 替换原有的清理逻辑
IFS=$'\n' read -d '' -r -a SELECTION_ARR <<< "$(echo "$SELECTION" | tr -d '{}' | sed 's/^ *"//;s/" *$//' | tr ',' '\n')"
selected_serials=()
selected_display_names=()
for choice in "${SELECTION_ARR[@]}"; do
choice=$(echo "$choice" | xargs) # 去除首尾空格
if [[ "$choice" == "全部设备" ]]; then
selected_serials=("${device_serials[@]}")
selected_display_names=("${device_names[@]}")
break
else
for i in "${!device_names[@]}"; do
if [[ "${device_names[$i]}" == "$choice" ]]; then
selected_serials+=("${device_serials[$i]}")
selected_display_names+=("${device_names[$i]}")
fi
done
fi
done
fi
# 安装 APK 到选中的设备
for i in "${!selected_serials[@]}"; do
serial="${selected_serials[$i]}"
display_name="${selected_display_names[$i]}"
"$ADB" -s "$serial" install -r "$APK_PATH" >/tmp/install_log 2>&1
if [ $? -eq 0 ]; then
osascript -e "display notification \"${display_name} 安装成功 ✅\" with title \"APK 安装器\""
else
err=$(cat /tmp/install_log)
osascript -e "display dialog \"${display_name} 安装失败 ❌\n$err\" buttons {\"OK\"}"
fi
done
第二步:创建快速操作的右键菜单
-
自动操作,选择快速操作 图3
-
选择实用工具-点击"运行shell脚本" 图5
-
工作流程收到当前 选择 文件或文件夹,位于 访达.app
-
Shell,选择/bin/bash ,传递输入,选择 作为自变量
-
输入脚本内容 open -a "/Applications/ApkInstall.app" --args "$1",ApkInstall.app为你保存的app 名称,输入app 的绝对路径 ,加上后面的参数
-
保存起来
-
去系统设置-通用-登录项与扩展-扩展-访达,开启保存的菜单名,点击完成
-
随便找一个apk 文件,右键-快速操作-ApkInstall,多设备连接时会显示选择设备列表,供用户选择设备安装apk,单设备连接时,会自动安装连接的设备 图6
-
安装成功会有通知提示 图8
图5 编写右键菜单shell
图6 选择apk 文件,安装
当然本文的脚本内容是由chatgpt 生成的,也是通过chatgpt,才知道 osascript -e 'display dialog "未检测到连接的 Android 设备。" with title "系统提示" buttons {"OK"}',能够直接显示dialog 弹窗,允许用户操作,倒是方便了不少。
同理,我们也可以使用快速操作进行其他的功能设计。