首页 > 解决方案 > 为什么无法为 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 是否有任何替代方法?

标签: androidreact-nativeexpo

解决方案


可以构建使用旧 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进行检查。


推荐阅读