React native 在项目根目录外解析与本机捆绑包文件相关的资产

React native 在项目根目录外解析与本机捆绑包文件相关的资产,react-native,code-push,react-native-code-push,React Native,Code Push,React Native Code Push,问题(android):如果捆绑文件位于项目根目录之外,那么相对于js捆绑文件,将图像资产放置在何处 我们有一个小服务,在每个构建中上传JS包。例如,我们有appcom.example,如果我们想更新我们的app(app商店中app review处于挂起状态),那么我们: 将JS捆绑包下载到android路径/data/data/com.example/files/bundle/android.bundle 通过将此捆绑设置为活动 想象一下,在react应用程序组件中,我们有一个路径为star.

问题(android):如果捆绑文件位于项目根目录之外,那么相对于js捆绑文件,将图像资产放置在何处

我们有一个小服务,在每个构建中上传JS包。例如,我们有app
com.example
,如果我们想更新我们的app(app商店中app review处于挂起状态),那么我们:

  • 将JS捆绑包下载到android路径
    /data/data/com.example/files/bundle/android.bundle
  • 通过将此捆绑设置为活动
  • 想象一下,在react应用程序组件中,我们有一个路径为
    star.png
    的图像

    当我们激活一个新的包时,星图就不显示了

    我已经在发布版本中检查了图像路径,图像uri解析为
    star

    因此,我尝试了以下文件结构:

    №一,

    数据
    --资料
    ----com.example
    ------档案
    --------捆
    
    ----------android.bundle捆绑资产应放在js捆绑文件所在的文件夹中(仅在android上测试)

    您始终可以通过获取捆绑资产路径

    如何测试:

  • 将图像
    star.png
    放入项目根目录
  • 使用以下代码创建react本机应用程序:
  • 通过以下方式创建android JS捆绑包和资产:
  • 通过以下方式安装调试版本:
  • 注意:仅通过
    /gradlew installDebug
    进行测试,而不运行metro bundler,因为它总是重写捆绑路径

    现在,如果你运行应用程序,你会得到一个错误“Bundle not found”

  • android.bundle
    文件上载到
    /data/data/com.testassetsapp/files/android.bundle
  • 现在,如果你运行应用程序,它应该启动。但恒星图像尚未显示

  • 将捆绑包文件从
    资产
    文件夹上载到
    /data/data/com.testassetsapp/files
    以便应用程序数据结构应如下所示:
  • 现在,如果重新启动应用程序,应显示星形图像

    data
    --data
    ----com.example
    ------files
    --------bundle
    ----------android.bundle <= dynamic bundle from remote server
    ----------star // <= our image
    
    data
    --data
    ----com.example
    ------files
    --------bundle
    ----------android.bundle <= dynamic bundle from remote server
    ----------star.png // <= our image
    
    import React from 'react';
    import {
      SafeAreaView,
      Text,
      StatusBar,
      Image
    } from 'react-native';
    import Star from './star.png';
    
    const App: () => React$Node = () => {
    
      const r = Image.resolveAssetSource(Star);
      console.log(r);
    
      return (
        <>
          <StatusBar barStyle="dark-content" />
          <SafeAreaView>
            <Text>TestAssetsApp</Text>
            <Image
              style={{width: 50, height: 50}}
              source={Star}
            />
          </SafeAreaView>
        </>
      );
    };
    
    export default App;
    
    
    public class MainApplication extends Application implements ReactApplication {
    
      private final ReactNativeHost mReactNativeHost =
          new ReactNativeHost(this) {
            @Override
            public boolean getUseDeveloperSupport() {
              return BuildConfig.DEBUG;
            }
    
            @Override
            protected List<ReactPackage> getPackages() {
              @SuppressWarnings("UnnecessaryLocalVariable")
              List<ReactPackage> packages = new PackageList(this).getPackages();
              // Packages that cannot be autolinked yet can be added manually here, for example:
              // packages.add(new MyReactNativePackage());
              return packages;
            }
    
            @Override
            protected String getJSMainModuleName() {
              return "index";
            }
    
            // Add this method
            @Override
            protected String getJSBundleFile() {
              return "/data/data/com.testassetsapp/files/android.bundle";
            }
          };
    
    react-native bundle --platform android --dev false --entry-file index.js --bundle-output android.bundle --assets-dest assets
    
    cd android && ./gradlew installDebug