关于charles抓包快速设置android代理的探索

1,887 阅读2分钟

前言

android中经常要用到charles抓包。每次抓包的步骤异常繁琐:

  • 手机打开设置 -> WLAN > 找到wifi高级设置 > 代理:手动 > 打开charles本机ip地址 > 手机输入ip地址

尤其是每次ip地址的获取输入很让人痛苦,为什么这么麻烦?有没有可以自动设置代理的方法: 完美解决在不需要代理和设置代理之间快捷切换

代理自动设置PAC

详细使用见参考1

PAC, 全称Proxy Auto Config. 代理自动设置. 通过设置这个配置文件可以指定url怎么走哪个代理. 这个配置文件可以放置在自定义的服务器上(缺点是如果本机ip不确定, 还需要更新配置文件), 把这个配置文件放置在app server上也避免不了ip切换的问题.

还有一个问题, 当代理服务器(charles)没有启动时, 使用了pac配置代理, 那么也是无法联网的. 此时, 只能在手机wifi上手动关闭代理. 下一次启动pac配置代理, 还是需要手动输入代理pac的地址.

综上, 免不了手动输入ip地址的步骤, 无论是手动设置代理还是pac设置代理. 而接下来的adb shell脚本设置代理则可以避免此步骤

adb shell脚本设置代理

主要用到这两个命令

adb shell settings put global http_proxy 10.128.213.73:8888
adb shell settings delete global http_proxy

其中, 10.128.213.73是charles所在主机的ip地址. 第一个命令设置代理, 第二个命令清除代理

缺点

  • 忘记清除代理后, 无法上网. 唯有重新插上usb线通过adb shell清除代理

具体用法, 参考了easy_proxy

#!/bin/bash

echo "\n---------------- Support ------------------"
echo "设置默认代理    easyproxy set"
echo "设置自定义代理   easyproxy set ****:8888"
echo "删除代理        easyproxy clean"
echo "--------------------------------------------\n"

if [ "$1" == "set" ];then
    if [ -n "$2" ];then
        echo "设置自定义代理 $2"
        adb shell settings put global http_proxy $2
    else
        # 获取 IP
        ip=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
        echo $ip
        count=$(echo $ip | tr ' ' '\n' | wc -l )
        if [ $count -gt 1 ];then
        echo "多个ip,请手动选择一个"
        exit
        fi
        default_proxy=${ip}":8888"
        echo "本机IP为: $default_proxy"
        echo "设置本机IP代理 $default_proxy"
        adb shell settings put global http_proxy $default_proxy
    fi
elif [ "$1" == "clean" ];then
    echo "清除代理成功"
    adb shell settings put global http_proxy :0
else
    echo "!!! 请输入合法的操作符 !!!"
fi

拷贝到本地proxy.sh

# 默认设置本机ip为默认手机代理
sh proxy.sh set
# 清除手机代理
sh proxy.sh clean

当然, 也可以添加alias

普通app不能运行adb

如题, 普通app不能运行adb, 报错Cannot run program "adb": error=13, Permission denied. 通过编写app运行清除代理的adb shel命令这条路页走不通, 如果忘记清除adb shell设置的代理只能重连usb线了.

参考