#!/bin/bash # Android自定义GPS位置设置脚本 # 适用于修改了frameworks/base的Android系统 # 用法: ./set_custom_gps.sh <纬度> <经度> # 示例: ./set_custom_gps.sh 39.904989 116.405285 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color if [ $# -ne 2 ]; then echo -e "${RED}用法: $0 <纬度> <经度>${NC}" echo "" echo -e "${BLUE}示例位置:${NC}" echo -e " ${GREEN}北京天安门:${NC} $0 39.904989 116.405285" echo -e " ${GREEN}上海外滩:${NC} $0 31.239666 121.499809" echo -e " ${GREEN}广州塔:${NC} $0 23.109831 113.324504" echo -e " ${GREEN}深圳地王:${NC} $0 22.544249 114.095298" echo -e " ${GREEN}杭州西湖:${NC} $0 30.281026 120.019348" echo -e " ${GREEN}东京塔:${NC} $0 35.658651 139.745415" echo -e " ${GREEN}纽约时代广场:${NC} $0 40.758896 -73.985130" echo "" echo -e "${YELLOW}坐标范围:${NC}" echo -e " 纬度: -90 到 90" echo -e " 经度: -180 到 180" exit 1 fi LATITUDE=$1 LONGITUDE=$2 # 验证数字格式 if ! [[ $LATITUDE =~ ^-?[0-9]+\.?[0-9]*$ ]]; then echo -e "${RED}错误: 纬度必须是有效的数字${NC}" exit 1 fi if ! [[ $LONGITUDE =~ ^-?[0-9]+\.?[0-9]*$ ]]; then echo -e "${RED}错误: 经度必须是有效的数字${NC}" exit 1 fi # 验证坐标范围 if (( $(echo "$LATITUDE < -90.0 || $LATITUDE > 90.0" | bc -l 2>/dev/null || echo "1") )); then echo -e "${RED}错误: 纬度必须在 -90 到 90 之间${NC}" exit 1 fi if (( $(echo "$LONGITUDE < -180.0 || $LONGITUDE > 180.0" | bc -l 2>/dev/null || echo "1") )); then echo -e "${RED}错误: 经度必须在 -180 到 180 之间${NC}" exit 1 fi GPS_FILE="/data/vendor/gps/custom_location.txt" GPS_DIR="/data/vendor/gps" echo -e "${BLUE}🌍 设置GPS位置为: 纬度 ${GREEN}$LATITUDE${BLUE}, 经度 ${GREEN}$LONGITUDE${NC}" # 检查ADB连接 if ! command -v adb >/dev/null 2>&1; then echo -e "${RED}❌ 错误: 未找到adb命令${NC}" echo -e "${YELLOW}请确保Android SDK已安装并添加到PATH${NC}" exit 1 fi # 检查设备连接 DEVICE_COUNT=$(adb devices | grep -c "device$") if [ "$DEVICE_COUNT" -eq 0 ]; then echo -e "${RED}❌ 错误: 未找到连接的Android设备${NC}" echo -e "${YELLOW}请确保:${NC}" echo "1. 设备已连接并启用USB调试" echo "2. 已授权计算机的USB调试请求" echo "3. 使用 'adb devices' 验证设备连接" exit 1 elif [ "$DEVICE_COUNT" -gt 1 ]; then echo -e "${YELLOW}⚠️ 检测到多个设备,使用第一个设备${NC}" fi # 创建临时文件 TEMP_FILE=$(mktemp) echo "$LATITUDE,$LONGITUDE" > "$TEMP_FILE" echo -e "${BLUE}📁 正在创建GPS目录...${NC}" adb shell "mkdir -p $GPS_DIR" 2>/dev/null echo -e "${BLUE}📤 正在上传GPS位置文件...${NC}" adb push "$TEMP_FILE" "$GPS_FILE" >/dev/null 2>&1 if [ $? -eq 0 ]; then echo -e "${GREEN}✅ GPS位置文件上传成功!${NC}" # 设置正确权限 echo -e "${BLUE}🔐 正在设置文件权限...${NC}" adb shell "chown system:system $GPS_FILE" 2>/dev/null adb shell "chmod 644 $GPS_FILE" 2>/dev/null # 验证文件内容 echo -e "${BLUE}📍 当前GPS位置配置:${NC}" CURRENT_LOCATION=$(adb shell "cat $GPS_FILE" 2>/dev/null | tr -d '\r\n') if [ -n "$CURRENT_LOCATION" ]; then echo -e " ${GREEN}$CURRENT_LOCATION${NC}" else echo -e " ${RED}无法读取配置文件${NC}" fi echo "" echo -e "${GREEN}🎉 GPS位置设置完成!${NC}" echo "" echo -e "${YELLOW}💡 使用提示:${NC}" echo "• 新位置将在下次GPS请求时生效" echo "• 重启GPS服务或应用以立即生效" echo "• 打开地图应用验证位置是否正确" echo "" echo -e "${BLUE}🔍 调试命令:${NC}" echo "• 查看GPS日志: ${GREEN}adb logcat | grep -i 'custom.*gps'${NC}" echo "• 删除自定义位置: ${GREEN}adb shell 'rm $GPS_FILE'${NC}" echo "• 重启位置服务: ${GREEN}adb shell 'setprop ctl.restart location'${NC}" else echo -e "${RED}❌ GPS位置文件上传失败${NC}" echo -e "${YELLOW}可能的原因:${NC}" echo "1. 设备没有root权限" echo "2. 系统分区为只读" echo "3. SELinux策略限制" echo "" echo -e "${BLUE}尝试解决方案:${NC}" echo "• 确保设备已获得root权限" echo "• 尝试: adb root && adb remount" echo "• 检查SELinux设置: adb shell getenforce" fi # 清理临时文件 rm -f "$TEMP_FILE" echo "" echo -e "${BLUE}📱 支持的Android版本: Android 8.0+ (API Level 26+)${NC}" echo -e "${BLUE}🔧 需要: 已修改frameworks/base的自定义Android系统${NC}"