android - 为什么无法为 Expo SDK 32 生成 APK 文件?有什么选择吗?
问题描述
我有一个使用 SDK 版本 32 在 Expo 上编写的非常旧的 react 本机应用程序。不幸的是,我们没有时间和资源迁移到最新版本的 SDK (40)。
所以,现在,我们正在努力解决一个在 Android 上重现的问题。我们的一个屏幕有一个背景视频(使用 Expo Video 组件实现)和两个按钮。
import React from 'react';
import { TouchableOpacity, StyleSheet, View, Text, Animated, Dimensions } from 'react-native';
import { AppLoading, Asset, Video } from 'expo';
const defaultVideoSource = require('../content/videos/be.mp4');
export default class HomeScreen extends React.Component {
static navigationOptions = {
header: null,
};
constructor(props) {
super(props);
this.state = {
backgroundOpacity: new Animated.Value(0),
loaded: false,
videoHeight: height,
videoWidth: width,
};
}
async componentWillMount() { }
// this is called from the video::onLoad()
fadeInVideo = () => {
const { backgroundOpacity } = this.state;
setTimeout(() => {
Animated.spring(backgroundOpacity, {
toValue: 1
}).start();
}, 400);
};
render() {
const { backgroundOpacity, loaded, videoHeight, videoWidth } = this.state;
if (!loaded) { return <AppLoading />; }
return (
<View style={styles.container}>
<View style={styles.background}>
<Animated.View
style={[
styles.backgroundViewWrapper,
{ opacity: backgroundOpacity }
]}
>
<Video
isLooping
isMuted={false}
onLoad={() => this.fadeInVideo()}
resizeMode="cover"
shouldPlay
source= { defaultVideoSource }
style={{ height: videoHeight, width: videoWidth }}
/>
</Animated.View>
</View>
<View style={styles.overlay}>
// BUTTONS OVER THE VIDEO
</View>
</View>
);
}
}
const styles = StyleSheet.create({
// ...
});
但是由于某种原因,当我将其发布到我的 Expo 帐户并从那里运行时,视频会在某个时刻冻结并停止播放。
视频上的按钮仍处于活动状态且功能正常。就像什么都没发生,但我需要重新启动应用程序(通过 Android 上的 Expo 客户端应用程序)才能再次开始播放。我注意到如果我使用以下命令在调试模式下启动它:
expo start
并从 Expo 客户端应用程序扫描 QR 码,视频不会冻结。因此,出于这个原因,我想创建一个独立文件 (.apk),我可以直接在我的设备上执行,而无需使用 Expo 客户端应用程序。但是,这里的问题是当我尝试使用命令时:
expo build:android
我收到一条错误消息:
不支持的 SDK 版本:我们的应用程序构建器不再支持 SDK 版本 32。请至少升级到 SDK 36。
但是,正如我所说,我们目前没有时间这样做,因为这(SDK 更新)会影响需要重写和重新测试的应用程序的其他组件。所以,最后我的问题是:在使用 SDK 32.0 时构建 .apk 是否有任何替代方法?
解决方案
可以构建使用旧 expo sdks 的应用程序,但我不确定 Play 商店是否会接受这些旧版本,隐私政策和服务条款发生了很多变化,而且在某些时候谷歌开始需要 64 位二进制文件(我不确定 sdk 32 是否已经进行了这些更改)。如果是这种情况,您唯一的选择是升级到受支持的 SDK。
如果您想构建该应用程序,您可以使用 turtle-cli https://www.npmjs.com/package/turtle-cli来实现。该工具在本地执行与在 expo 服务器上运行的代码相同的代码,但它没有与 expo 基础设施完全集成,因此您需要在 cli 中手动提供密钥库和所有密码,以及您的 expo 凭据(如果使用expo publish
)或 url 以js 包(如果你是自托管的)。您将需要使用仍然具有该 sdk 的足够旧版本的 turtle-cli,您可以在此处查阅 CHANGELOG https://github.com/expo/turtle/blob/master/CHANGELOG.md进行检查。
推荐阅读
- database - 从查询中将值设置为报表文本框
- html - 有没有办法
元素不会以 HTML 中断结尾?
- javascript - 如何在 jQuery 中组合各种独立的验证?
- node.js - 如何从 Express API 获取数据并将其显示到 React 应用程序?
- python - 子类化异常有什么帮助?
- .net - 无法安装 Xero.NetStandard.OAuth2Client
- sqlite - 显示获得最多三柱门(作为投球手)的球员(作为击球手)的姓名和得分
- seo - 需要帮助在 schema.org 结构中形成有效的“引文”数据
- node.js - Electron 和 couchbase:该模块是针对不同的 node.js 版本编译的(win)
- node.js - 在 Node.js 中达到 SetInterval 后,异步函数返回“未定义”