美文网首页
ADB导出指定应用APK安装包

ADB导出指定应用APK安装包

作者: RZWP | 来源:发表于2022-06-04 02:30 被阅读0次

    要求

    • 无需 root
    • 系统环境中已配置 adb 命令
    • 系统环境中已配置 aapt 命令 (可选,用于解析APP中文名,用于导出文件的重命名)

    思路

    整体思路.png

    步骤

    1. 手动启动应用
    2. 栈顶获取包名
    ➜  ~ adb shell dumpsys activity top | grep -w ACTIVITY | tail -n 1 | awk '{ printf $2}' | cut -d "/" -f 1
    com.android.browser
    
    1. 获取安装路径
    ➜  ~ adb shell pm path com.android.browser | cut -d ":" -f 2
    /data/app/~~1VThWJXJ1-CLosRKqPgHtg==/com.android.browser-QoQ8ZoUwRi1jCEu6w-B0Mw==/base.apk
    
    1. 导出安装包到指定位置 (如:~/Desktop)
    ➜  ~ adb pull /data/app/~~1VThWJXJ1-CLosRKqPgHtg==/com.android.browser-QoQ8ZoUwRi1jCEu6w-B0Mw==/base.apk ~/Desktop
    /data/app/~~1VThWJXJ1-CLosRKqPgHtg==/com.android.browser-QoQ8ZoUwRi1...apk: 1 file pulled, 0 skipped. 32.8 MB/s (132671840 bytes in 3.860s)
    
    1. aapt 解析APP中文名称,方便进行重命名 (可选, 可用于脚本中自动化处理)
    ➜  ~ aapt d badging ~/Desktop/base.apk | grep "application-label-zh-CN" | cut -d ':' -f 2 | sed "s/'//g"
    浏览器
    ➜  ~ mv ~/Desktop/base.apk ~/Desktop/浏览器.apk
    

    组合

    组合以上命令使用
    如在 .zshrc 或 .bashrc 中添加 function 函数,通过Terminal一键执行

    function export_apk() {
        if [ ! -d "$1" ]; then
            echo "导出目录无效"
            return
        fi
        # 导出后绝对路径
        save_dir=$(
            cd ${1%/}
            pwd
        )
        echo "正在导出"
        pkg_name=$(adb shell dumpsys activity top 2>/dev/null | grep -w ACTIVITY | tail -n 1 | awk '{ printf $2}' | cut -d "/" -f 1)
        apk_path=$(adb shell pm path "$pkg_name" 2>/dev/null | cut -d ":" -f 2)
    
        # 导出后的默认名称为 {包名}.apk
        def_path=${save_dir}/"$pkg_name".apk
        output=$(adb pull "$apk_path" "$def_path")
    
        # 检查导出是否成功
        if [[ $output != *"file pulled"* ]]; then
            printf "导出失败 ($output)\n"
            return
        fi
    
        # 如果环境中配置了AAPT命令,则尝试解析APK对应的中文名,并进行重命名
        if [[ -x "$(command -v "aapt")" ]]; then
            app_name=$(aapt d badging "$def_path" 2>/dev/null | grep "application-label-zh-CN" | cut -d ':' -f 2 | sed "s/'//g")
            if [[ -n $app_name ]]; then
                new_path="$save_dir"/"$app_name".apk
                mv "$def_path" "$new_path"
                printf "导出成功 %s\n" "$new_path"
                return
            fi
        fi
        printf "导出成功 %s\n" "$def_path"
    }
    

    使用方法:

    export_apk {保存的位置} 
    

    效果演示:

    • 无可用设备时
      ➜  ~ export_apk ~/Desktop
      正在导出
      导出失败 (adb: error: failed to get feature set: no devices/emulators found)
      
    • 有可用设备时
      ➜  ~ export_apk ~/Desktop
      正在导出
      导出成功 /Users/XXX/Desktop/浏览器.apk
      
    • 环境中未配置AAPT命令时 (导出的文件默认为包名命名)
      ➜  ~ export_apk ~/Desktop
      正在导出
      导出成功 /Users/XXX/Desktop/com.android.browser.apk
      

    相关文章

      网友评论

          本文标题:ADB导出指定应用APK安装包

          本文链接:https://www.haomeiwen.com/subject/dpkkmrtx.html