feat: 添加自定义GPS位置支持,更新相关脚本和配置,移除旧的GPS实现

This commit is contained in:
2025-09-17 12:13:58 +08:00
parent 97dbd94b3a
commit df8fec5bbe
8 changed files with 306 additions and 1582 deletions

View File

@@ -1,67 +0,0 @@
// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
cc_library_shared {
name: "libredroid_gps_jni",
srcs: [
"com_android_server_location_GnssLocationProvider.cpp",
],
cflags: [
"-Wall",
"-Werror",
"-Wextra",
"-std=c++17",
],
shared_libs: [
"libandroid_runtime",
"libbinder",
"libcutils",
"liblog",
"libnativehelper",
"libutils",
"libhardware",
"libhardware_legacy",
"libhidlbase",
"libhidltransport",
"android.hardware.gnss@1.0",
"android.hardware.gnss@1.1",
"android.hardware.gnss@2.0",
"android.hardware.gnss@2.1",
"android.hardware.gnss-V1-ndk",
"android.hardware.gnss-V1-cpp",
],
static_libs: [
"libc++fs",
],
header_libs: [
"jni_headers",
// "libandroid_runtime_headers",
],
include_dirs: [
"frameworks/base/services/core/jni",
"frameworks/base/core/jni",
],
vendor: true,
compile_multilib: "both",
relative_install_path: "hw",
}

View File

@@ -1,196 +0,0 @@
# Redroid 自定义GPS位置构建指南
本指南详细说明如何构建和使用Redroid的自定义GPS位置功能。
## 📋 修改的文件列表
### 1. 核心实现文件
- `gps/com_android_server_location_GnssLocationProvider.cpp` - 主要的JNI实现
- `gps/Android.bp` - 编译配置文件(新增)
- `gps/init.redroid.gps.sh` - GPS初始化脚本
### 2. 集成配置文件
- `vendor.mk` - 添加GPS JNI库到产品包
- `redroid.legacy.rc` - 调整GPS目录权限
## 🔧 构建步骤
### 1. 准备源码
确保所有修改的文件都在正确的位置:
```bash
vendor/redroid/
├── gps/
│ ├── com_android_server_location_GnssLocationProvider.cpp
│ ├── Android.bp
│ └── init.redroid.gps.sh
├── vendor.mk
└── redroid.legacy.rc
```
### 2. 编译系统
在Android源码根目录执行
```bash
# 设置环境
source build/envsetup.sh
# 选择目标(根据你的设备调整)
lunch aosp_arm64-eng
# 编译GPS JNI库
m libredroid_gps_jni
# 或者编译整个vendor模块
m vendor-redroid
```
### 3. 验证编译结果
检查编译输出:
```bash
# 检查生成的库文件
ls -la out/target/product/*/vendor/lib*/hw/libredroid_gps_jni.so
```
## 🚀 部署和使用
### 1. 系统启动
当Android系统启动时`redroid.legacy.rc`会自动:
- 创建`/data/vendor/gps`目录
- 执行`init.redroid.gps.sh`脚本
- 设置正确的权限
### 2. 默认位置
系统会创建默认的GPS位置文件
```bash
/data/vendor/gps/custom_location.txt
```
默认坐标(杭州):`30.281026,120.019348`
### 3. 自定义位置
修改GPS位置只需编辑文件
```bash
# 使用adb连接设备
adb shell
# 修改GPS位置例如北京天安门
echo "39.904989,116.405285" > /data/vendor/gps/custom_location.txt
# 或者使用adb push
echo "39.904989,116.405285" > custom_location.txt
adb push custom_location.txt /data/vendor/gps/
```
### 4. 实时生效
- 修改文件后新的GPS位置会在下次位置请求时自动生效
- 无需重启系统或GPS服务
- 系统会检测文件修改时间并自动加载新坐标
## 📍 支持的坐标格式
### 逗号分隔格式
```
纬度,经度
39.904989,116.405285
```
### 空格分隔格式
```
纬度 经度
39.904989 116.405285
```
### 坐标范围
- 纬度:-90° 到 +90°
- 经度:-180° 到 +180°
## 🧪 测试验证
### 1. 查看日志
```bash
# 查看GPS相关日志
adb logcat | grep -i gnss
adb logcat | grep -i "custom.*gps"
# 期望看到的日志:
# I/GnssLocationProviderJni: Custom GPS location loaded: lat=39.904989, lon=116.405285
# I/GnssLocationProviderJni: Using custom GPS location: lat=39.904989, lon=116.405285
```
### 2. 使用GPS应用
- 打开地图应用如Google Maps
- 启用位置服务
- 应该显示自定义的GPS位置
### 3. 验证位置变更
```bash
# 修改位置
echo "31.239666,121.499809" > /data/vendor/gps/custom_location.txt
# 在地图应用中观察位置变化
```
## 🔍 故障排除
### 编译错误
1. 确保Android编译环境正确设置
2. 检查依赖库是否存在
3. 验证Android.bp语法
### 运行时错误
1. 检查文件权限:
```bash
ls -la /data/vendor/gps/
```
2. 验证文件格式:
```bash
cat /data/vendor/gps/custom_location.txt
```
3. 查看详细日志:
```bash
adb logcat -v threadtime | grep -E "(Gnss|GPS)"
```
### 权限问题
如果遇到权限错误:
```bash
# 重新设置权限
adb shell
chown system:system /data/vendor/gps/custom_location.txt
chmod 644 /data/vendor/gps/custom_location.txt
```
## 📱 兼容性
### Android版本
- 支持Android 8.0+API 26+
- 测试过的版本Android 11、12、13
### 架构支持
- ARM64
- ARM32
- x86_64通过Android.bp的compile_multilib配置
## 🔄 回退到默认GPS
如果要禁用自定义GPS功能
```bash
# 删除自定义位置文件
rm /data/vendor/gps/custom_location.txt
# 系统会自动回退到默认GPS行为
```
## 📞 技术支持
如果遇到问题,请提供:
1. Android版本和设备信息
2. 完整的logcat日志
3. 文件权限和内容截图
4. 具体的错误现象描述

File diff suppressed because it is too large Load Diff

View File

@@ -1,82 +0,0 @@
#!/bin/bash
# Redroid GPS位置设置脚本
# 用法: ./set_gps_location.sh <纬度> <经度>
# 示例: ./set_gps_location.sh 39.904989 116.405285
if [ $# -ne 2 ]; then
echo "用法: $0 <纬度> <经度>"
echo ""
echo "示例位置:"
echo " 北京天安门: $0 39.904989 116.405285"
echo " 上海外滩: $0 31.239666 121.499809"
echo " 广州塔: $0 23.109831 113.324504"
echo " 深圳地王: $0 22.544249 114.095298"
echo " 杭州西湖: $0 30.281026 120.019348"
echo ""
echo "坐标范围:"
echo " 纬度: -90 到 90"
echo " 经度: -180 到 180"
exit 1
fi
LATITUDE=$1
LONGITUDE=$2
# 验证纬度范围
if (( $(echo "$LATITUDE < -90.0 || $LATITUDE > 90.0" | bc -l) )); then
echo "错误: 纬度必须在 -90 到 90 之间"
exit 1
fi
# 验证经度范围
if (( $(echo "$LONGITUDE < -180.0 || $LONGITUDE > 180.0" | bc -l) )); then
echo "错误: 经度必须在 -180 到 180 之间"
exit 1
fi
GPS_FILE="/data/vendor/gps/custom_location.txt"
echo "设置GPS位置为: 纬度 $LATITUDE, 经度 $LONGITUDE"
# 检查设备连接
if ! adb devices | grep -q "device$"; then
echo "错误: 未找到连接的Android设备"
echo "请确保:"
echo "1. 设备已连接并启用USB调试"
echo "2. 已授权计算机的USB调试请求"
exit 1
fi
# 创建临时文件
TEMP_FILE=$(mktemp)
echo "$LATITUDE,$LONGITUDE" > "$TEMP_FILE"
# 推送到设备
echo "正在更新GPS位置文件..."
adb push "$TEMP_FILE" "$GPS_FILE"
if [ $? -eq 0 ]; then
echo "✅ GPS位置更新成功"
# 设置正确权限
adb shell "chown system:system $GPS_FILE"
adb shell "chmod 644 $GPS_FILE"
# 验证文件内容
echo "📍 当前GPS位置"
adb shell "cat $GPS_FILE"
echo ""
echo "💡 提示:"
echo "- 新位置将在下次GPS请求时生效"
echo "- 打开地图应用验证位置是否正确"
echo "- 查看日志: adb logcat | grep -i 'custom.*gps'"
else
echo "❌ GPS位置更新失败"
echo "请检查设备权限和连接状态"
fi
# 清理临时文件
rm -f "$TEMP_FILE"