mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-02-10 17:44:44 +08:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2d1d6be6b0 | ||
|
|
a471889c17 | ||
|
|
8ea09a18b8 | ||
|
|
58bc857325 | ||
|
|
22926a686b | ||
|
|
fbe858715a | ||
|
|
5e1f7520d2 |
@@ -107,7 +107,7 @@ yarn android-tv
|
||||
|
||||
|
||||
## 其他
|
||||
- 最低版本是android 7,可用,但是不推荐
|
||||
- 最低版本是android 6.0,可用,但是不推荐
|
||||
- 如果使用https的后端接口无法访问,在确认服务没有问题的情况下,请检查https的TLS协议,Android 10 之后版本才支持 TLS1.3
|
||||
|
||||
## 📜 主要脚本
|
||||
|
||||
24
app/live.tsx
24
app/live.tsx
@@ -4,7 +4,6 @@ import LivePlayer from "@/components/LivePlayer";
|
||||
import { fetchAndParseM3u, getPlayableUrl, Channel } from "@/services/m3u";
|
||||
import { ThemedView } from "@/components/ThemedView";
|
||||
import { StyledButton } from "@/components/StyledButton";
|
||||
import { AVPlaybackStatus } from "expo-av";
|
||||
import { useSettingsStore } from "@/stores/settingsStore";
|
||||
|
||||
export default function LiveScreen() {
|
||||
@@ -66,15 +65,18 @@ export default function LiveScreen() {
|
||||
}
|
||||
};
|
||||
|
||||
const changeChannel = (direction: "next" | "prev") => {
|
||||
if (channels.length === 0) return;
|
||||
let newIndex =
|
||||
direction === "next"
|
||||
? (currentChannelIndex + 1) % channels.length
|
||||
: (currentChannelIndex - 1 + channels.length) % channels.length;
|
||||
setCurrentChannelIndex(newIndex);
|
||||
showChannelTitle(channels[newIndex].name);
|
||||
};
|
||||
const changeChannel = useCallback(
|
||||
(direction: "next" | "prev") => {
|
||||
if (channels.length === 0) return;
|
||||
let newIndex =
|
||||
direction === "next"
|
||||
? (currentChannelIndex + 1) % channels.length
|
||||
: (currentChannelIndex - 1 + channels.length) % channels.length;
|
||||
setCurrentChannelIndex(newIndex);
|
||||
showChannelTitle(channels[newIndex].name);
|
||||
},
|
||||
[channels, currentChannelIndex]
|
||||
);
|
||||
|
||||
const handleTVEvent = useCallback(
|
||||
(event: HWEvent) => {
|
||||
@@ -83,7 +85,7 @@ export default function LiveScreen() {
|
||||
else if (event.eventType === "left") changeChannel("prev");
|
||||
else if (event.eventType === "right") changeChannel("next");
|
||||
},
|
||||
[channels, currentChannelIndex, isChannelListVisible]
|
||||
[changeChannel, isChannelListVisible]
|
||||
);
|
||||
|
||||
useTVEventHandler(handleTVEvent);
|
||||
|
||||
@@ -31,7 +31,7 @@ export const VideoSourceSection: React.FC<VideoSourceSectionProps> = ({ onChange
|
||||
const resourcesList = await api.getResources();
|
||||
setResources(resourcesList);
|
||||
|
||||
if (videoSource.enabledAll && resourcesList.length === 0) {
|
||||
if (videoSource.enabledAll && Object.keys(videoSource.sources).length === 0) {
|
||||
const allResourceKeys: { [key: string]: boolean } = {};
|
||||
for (const resource of resourcesList) {
|
||||
allResourceKeys[resource.key] = true;
|
||||
|
||||
284
docs/ANDROID_5_COMPATIBILITY_ANALYSIS.md
Normal file
284
docs/ANDROID_5_COMPATIBILITY_ANALYSIS.md
Normal file
@@ -0,0 +1,284 @@
|
||||
# OrionTV Android 5.0 兼容性分析报告
|
||||
|
||||
## 项目概述
|
||||
|
||||
OrionTV是一个基于React Native TVOS和Expo SDK的电视端视频流媒体应用,专为Apple TV和Android TV平台设计。本文档分析了将项目降级到支持Android 5.0 (API Level 21)的兼容性风险和实施方案。
|
||||
|
||||
## 当前技术栈
|
||||
|
||||
### 核心框架版本
|
||||
- **React Native**: `npm:react-native-tvos@~0.74.2-0`
|
||||
- **Expo SDK**: `~51.0.13`
|
||||
- **React**: `18.2.0`
|
||||
- **TypeScript**: `~5.3.3`
|
||||
- **最小Android API级别**: 23 (Android 6.0)
|
||||
- **目标Android API级别**: 34 (Android 14)
|
||||
|
||||
### 关键依赖
|
||||
- `expo-av`: `~14.0.7` (视频播放)
|
||||
- `expo-router`: `~3.5.16` (路由导航)
|
||||
- `react-native-reanimated`: `~3.10.1` (动画)
|
||||
- `react-native-tcp-socket`: `^6.0.6` (网络服务)
|
||||
- `zustand`: `^5.0.6` (状态管理)
|
||||
|
||||
## 兼容性限制分析
|
||||
|
||||
### React Native 0.74 限制
|
||||
根据官方文档,React Native 0.74已将最低Android API级别要求提升到23 (Android 6.0),不再支持Android 5.0 (API Level 21)。
|
||||
|
||||
### Expo SDK 51 限制
|
||||
Expo SDK 51基于React Native 0.74,同样不支持Android 5.0。
|
||||
|
||||
## 降级方案
|
||||
|
||||
### 推荐的版本组合
|
||||
|
||||
#### 方案A: 保持TV功能的最新兼容版本
|
||||
```json
|
||||
{
|
||||
"react-native": "npm:react-native-tvos@~0.73.8-0",
|
||||
"expo": "~50.0.0",
|
||||
"expo-av": "~13.10.x",
|
||||
"expo-router": "~3.4.x",
|
||||
"react-native-reanimated": "~3.8.x"
|
||||
}
|
||||
```
|
||||
|
||||
#### 方案B: 最大向后兼容版本
|
||||
```json
|
||||
{
|
||||
"react-native": "npm:react-native-tvos@~0.72.12-0",
|
||||
"expo": "~49.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
### Android配置修改
|
||||
```gradle
|
||||
// android/build.gradle
|
||||
android {
|
||||
minSdkVersion = 21 // 支持Android 5.0
|
||||
targetSdkVersion = 30 // 降级到Android 11
|
||||
compileSdkVersion = 33 // 对应的编译SDK版本
|
||||
}
|
||||
```
|
||||
|
||||
## 风险评估
|
||||
|
||||
### 🔴 高风险组件
|
||||
|
||||
#### 1. 视频播放功能 (expo-av)
|
||||
- **影响文件**: `hooks/usePlaybackManager.ts`, `app/play.tsx`, `stores/playerStore.ts`
|
||||
- **风险**: API变化可能影响播放控制
|
||||
- **关键代码**:
|
||||
```typescript
|
||||
import { Video, AVPlaybackStatus } from "expo-av";
|
||||
// 可能受影响的API调用
|
||||
videoRef?.current?.replayAsync();
|
||||
videoRef?.current?.pauseAsync();
|
||||
videoRef?.current?.playAsync();
|
||||
```
|
||||
|
||||
#### 2. TV遥控器功能 (react-native-tvos)
|
||||
- **影响文件**: `hooks/useTVRemoteHandler.ts` + 7个组件文件
|
||||
- **风险**: 遥控器事件处理可能有变化
|
||||
- **关键代码**:
|
||||
```typescript
|
||||
import { useTVEventHandler, HWEvent } from "react-native";
|
||||
// 长按事件处理可能需要调整
|
||||
case "longRight":
|
||||
case "longLeft":
|
||||
```
|
||||
|
||||
#### 3. 路由导航 (expo-router)
|
||||
- **影响文件**: 9个页面文件
|
||||
- **风险**: 路由配置和参数传递可能有变化
|
||||
- **关键代码**:
|
||||
```typescript
|
||||
import { useRouter, useLocalSearchParams } from "expo-router";
|
||||
```
|
||||
|
||||
### 🟡 中等风险组件
|
||||
|
||||
#### 1. 远程控制服务 (react-native-tcp-socket)
|
||||
- **影响文件**: `services/tcpHttpServer.ts`
|
||||
- **风险**: 网络API兼容性问题
|
||||
- **关键代码**:
|
||||
```typescript
|
||||
import TcpSocket from 'react-native-tcp-socket';
|
||||
this.server = TcpSocket.createServer((socket: TcpSocket.Socket) => {});
|
||||
```
|
||||
|
||||
#### 2. 动画效果 (react-native-reanimated)
|
||||
- **影响文件**: `components/VideoCard.tv.tsx`
|
||||
- **风险**: 动画性能可能下降
|
||||
- **关键代码**:
|
||||
```typescript
|
||||
import Animated, { useSharedValue, useAnimatedStyle, withSpring } from "react-native-reanimated";
|
||||
```
|
||||
|
||||
### 🟢 低风险组件
|
||||
|
||||
#### 1. 状态管理 (zustand)
|
||||
- **影响**: 与React Native版本无直接关系
|
||||
- **风险**: 极低
|
||||
|
||||
#### 2. 数据存储 (AsyncStorage)
|
||||
- **影响文件**: `services/storage.ts`
|
||||
- **风险**: 极低,API稳定
|
||||
|
||||
## 平台特定风险
|
||||
|
||||
### Android API 23 → 21 降级影响
|
||||
|
||||
#### 1. 运行时权限模型
|
||||
- **API 23+**: 需要运行时权限请求
|
||||
- **API 21-22**: 安装时权限模型
|
||||
- **影响**: 网络权限处理可能需要调整
|
||||
|
||||
#### 2. 网络安全配置
|
||||
- **风险**: HTTP cleartext流量处理
|
||||
- **当前配置**: `android.usesCleartextTraffic = true`
|
||||
- **建议**: 保持当前配置确保向后兼容
|
||||
|
||||
#### 3. 后台服务限制
|
||||
- **API 23+**: 更严格的后台服务限制
|
||||
- **API 21-22**: 相对宽松的后台服务策略
|
||||
- **影响**: 远程控制服务可能表现不同
|
||||
|
||||
## 实施步骤
|
||||
|
||||
### 1. 准备阶段
|
||||
```bash
|
||||
# 1. 备份当前项目
|
||||
git checkout -b android-5-compatibility
|
||||
|
||||
# 2. 清理现有依赖
|
||||
rm -rf node_modules
|
||||
rm yarn.lock
|
||||
```
|
||||
|
||||
### 2. 版本降级
|
||||
```bash
|
||||
# 3. 修改package.json依赖版本
|
||||
# 4. 重新安装依赖
|
||||
yarn install
|
||||
|
||||
# 5. 清理原生代码
|
||||
yarn prebuild-tv --clean
|
||||
```
|
||||
|
||||
### 3. 配置修改
|
||||
```bash
|
||||
# 6. 修改android/build.gradle
|
||||
# 7. 更新app.json配置
|
||||
# 8. 复制TV相关配置
|
||||
yarn copy-config
|
||||
```
|
||||
|
||||
### 4. 测试构建
|
||||
```bash
|
||||
# 9. 本地构建测试
|
||||
yarn build-local
|
||||
|
||||
# 10. 运行测试
|
||||
yarn test
|
||||
```
|
||||
|
||||
## 测试清单
|
||||
|
||||
### 核心功能测试
|
||||
- [ ] 视频播放、暂停、进度控制
|
||||
- [ ] 遥控器所有按键响应(上下左右、选择、菜单、返回)
|
||||
- [ ] 长按快进/快退功能
|
||||
- [ ] 页面导航和参数传递
|
||||
- [ ] 焦点管理和视觉反馈
|
||||
|
||||
### TV特定功能测试
|
||||
- [ ] 控制条自动显示/隐藏
|
||||
- [ ] 剧集切换功能
|
||||
- [ ] 远程控制HTTP服务
|
||||
- [ ] 设置页面各项配置
|
||||
- [ ] 搜索功能
|
||||
|
||||
### 兼容性测试
|
||||
- [ ] Android 5.0真机测试
|
||||
- [ ] Android TV模拟器测试
|
||||
- [ ] Apple TV模拟器测试
|
||||
- [ ] 不同屏幕尺寸适配
|
||||
- [ ] 内存使用情况
|
||||
- [ ] 启动性能测试
|
||||
|
||||
## 依赖版本对照表
|
||||
|
||||
| 组件 | 当前版本 | 目标版本 | 风险等级 | 备注 |
|
||||
|------|----------|----------|----------|------|
|
||||
| react-native-tvos | ~0.74.2-0 | ~0.73.8-0 | 🔴 高 | TV功能核心 |
|
||||
| expo | ~51.0.13 | ~50.0.0 | 🔴 高 | 框架基础 |
|
||||
| expo-av | ~14.0.7 | ~13.10.x | 🔴 高 | 视频播放 |
|
||||
| expo-router | ~3.5.16 | ~3.4.x | 🔴 高 | 路由导航 |
|
||||
| react-native-reanimated | ~3.10.1 | ~3.8.x | 🟡 中 | 动画效果 |
|
||||
| react-native-tcp-socket | ^6.0.6 | ^6.0.4 | 🟡 中 | 网络服务 |
|
||||
| zustand | ^5.0.6 | ^5.0.6 | 🟢 低 | 状态管理 |
|
||||
| @react-native-async-storage/async-storage | ^2.2.0 | ^2.1.x | 🟢 低 | 数据存储 |
|
||||
|
||||
## 潜在问题和解决方案
|
||||
|
||||
### 1. 视频播放问题
|
||||
**问题**: expo-av版本降级可能导致某些视频格式不支持
|
||||
**解决方案**:
|
||||
- 测试主要视频格式(MP4, M3U8)
|
||||
- 必要时实现格式转换
|
||||
- 提供播放失败的友好提示
|
||||
|
||||
### 2. 遥控器响应问题
|
||||
**问题**: TV事件处理可能有差异
|
||||
**解决方案**:
|
||||
- 仔细测试所有遥控器按键
|
||||
- 调整事件处理逻辑
|
||||
- 增加兼容性检查
|
||||
|
||||
### 3. 路由导航问题
|
||||
**问题**: 页面跳转参数传递可能有变化
|
||||
**解决方案**:
|
||||
- 测试所有页面跳转
|
||||
- 验证参数正确传递
|
||||
- 必要时调整路由配置
|
||||
|
||||
### 4. 动画性能问题
|
||||
**问题**: 动画可能在低端设备上表现不佳
|
||||
**解决方案**:
|
||||
- 简化动画效果
|
||||
- 增加性能检测
|
||||
- 提供动画开关选项
|
||||
|
||||
## 建议与结论
|
||||
|
||||
### 风险总结
|
||||
- **总体风险等级**: 🔴 **高等风险**
|
||||
- **主要风险点**: 视频播放、遥控器功能、路由导航
|
||||
- **预计工作量**: 2-3周开发 + 1-2周测试
|
||||
|
||||
### 成本效益分析
|
||||
- **开发成本**: 高(需要大量测试和调试)
|
||||
- **维护成本**: 高(使用较旧版本,安全更新有限)
|
||||
- **用户覆盖**: 低(Android 5用户占比通常<2%)
|
||||
|
||||
### 最终建议
|
||||
**不建议进行降级**,原因如下:
|
||||
1. 技术风险高,可能影响核心功能稳定性
|
||||
2. 维护成本高,需要长期支持多个版本
|
||||
3. 用户收益有限,Android 5用户占比极低
|
||||
4. 与业界趋势不符,各大平台都在提升最低版本要求
|
||||
|
||||
### 替代方案
|
||||
1. **统计用户分布**: 收集实际用户设备数据,确认Android 5用户占比
|
||||
2. **渐进式升级**: 引导用户升级设备,提供升级指南
|
||||
3. **精简版本**: 为老设备提供功能精简的独立版本
|
||||
4. **Web版本**: 提供Web端访问方式作为补充
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [React Native 0.74 Release Notes](https://reactnative.dev/blog/2024/04/22/release-0.74)
|
||||
- [Expo SDK 51 Changelog](https://expo.dev/changelog/2024-05-07-sdk-51)
|
||||
- [React Native TV OS Documentation](https://github.com/react-native-tvos/react-native-tvos)
|
||||
- [Android API Level Distribution](https://developer.android.com/about/dashboards)
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "OrionTV",
|
||||
"private": true,
|
||||
"main": "expo-router/entry",
|
||||
"version": "1.1.1",
|
||||
"version": "1.1.2",
|
||||
"scripts": {
|
||||
"start": "EXPO_USE_METRO_WORKSPACE_ROOT=1 expo start",
|
||||
"start-tv": "EXPO_TV=1 EXPO_USE_METRO_WORKSPACE_ROOT=1 expo start",
|
||||
|
||||
Reference in New Issue
Block a user