首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Android上的React Native中包含和读取源映射文件

在Android上的React Native中包含和读取源映射文件,可以通过以下步骤实现:

  1. 首先,确保你的React Native项目已经配置了源映射文件。源映射文件(source map)是一种用于将压缩后的代码映射回原始源代码的文件。它通常与压缩后的JavaScript文件一起生成。
  2. 在React Native项目的根目录下,找到android/app/build.gradle文件,并在android闭包内添加以下代码:
代码语言:txt
复制
project.ext.react = [
    entryFile: "index.js",
    bundleAssetName: "index.android.bundle",
    bundleInDebug: true, // 设置为true以在调试模式下包含源映射文件
    devDisabledInDebug: false, // 设置为false以在调试模式下启用开发者菜单
]

// 添加以下代码
def enableSeparateBuildPerCPUArchitecture = false

def enableProguardInReleaseBuilds = true

// ...

// 添加以下代码
project.ext.react = [
    bundleAssetName: "index.android.bundle",
    bundleInDebug: true,
    bundleInRelease: true,
    devDisabledInDebug: false,
    devDisabledInRelease: true, // 设置为true以在发布模式下禁用开发者菜单
    enableHermes: false, // 如果使用Hermes引擎,请将其设置为true
    enableSeparateBuildPerCPUArchitecture: enableSeparateBuildPerCPUArchitecture,
    hermesCommand: "../../node_modules/hermes-engine/%OS-BIN%/hermesc", // 如果使用Hermes引擎,请根据操作系统设置正确的路径
    jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
    jsBundleDirRelease: "$buildDir/intermediates/assets/release",
    jsBundleFile: "$buildDir/intermediates/assets/debug/index.android.bundle",
    jsBundleLoader: "com.facebook.react.bridge.JSBundleLoader$FileLoader",
    jsMainModuleName: "index",
    optimizeEnabled: enableProguardInReleaseBuilds,
    packageEncoding: "utf-8",
    packageObfuscationEnabled: enableProguardInReleaseBuilds,
    resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
    resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
    shrinkResources: enableProguardInReleaseBuilds,
    souceMapFile: "$buildDir/intermediates/assets/debug/index.android.bundle.map", // 设置源映射文件的路径
]
  1. 然后,在React Native项目的根目录下,找到android/app/src/main/java/com/[your-app-namespace]/MainApplication.java文件,并添加以下代码:
代码语言:txt
复制
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;

// 添加以下代码
import com.facebook.react.modules.debug.SourceMapLoader;
import com.facebook.react.modules.debug.Systrace;
import com.facebook.react.modules.debug.interfaces.DeveloperSettings;
import com.facebook.react.modules.debug.interfaces.PackagerStatusCallback;
import com.facebook.react.packagerconnection.RequestHandler;
import com.facebook.react.packagerconnection.RequestHandlerRegistry;
import com.facebook.react.packagerconnection.Responder;
import com.facebook.react.shell.MainPackageConfig;
import com.facebook.react.shell.MainPackageConfig.AppBundleSupplier;
import com.facebook.react.shell.MainPackageConfig.Builder;
import com.facebook.react.shell.MainPackageConfig.Params;
import com.facebook.react.shell.MainPackageConfigProvider;
import com.facebook.react.shell.PackageConfig;
import com.facebook.react.shell.PackageConfigProvider;
import com.facebook.react.shell.PackageList;
import com.facebook.react.shell.ReactPackageLogger;
import com.facebook.react.shell.ReactPackageRegistry;
import com.facebook.react.shell.ReactPackageRegistry.Builder;
import com.facebook.react.shell.ReactPackageRegistryProvider;
import com.facebook.react.shell.ReactPackagesProvider;
import com.facebook.react.shell.ShellReactPackage;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class MainApplication extends Application implements ReactApplication {
    // ...

    // 添加以下代码
    private static final String SOURCE_MAP_FILE_NAME = "index.android.bundle.map"; // 源映射文件的文件名

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...

        // 添加以下代码
        if (BuildConfig.DEBUG) {
            enableSourceMaps();
        }
    }

    private void enableSourceMaps() {
        try {
            String sourceMapFilePath = getFilesDir().getAbsolutePath() + File.separator + SOURCE_MAP_FILE_NAME;
            File sourceMapFile = new File(sourceMapFilePath);
            if (sourceMapFile.exists()) {
                ReactInstanceManager reactInstanceManager = getReactNativeHost().getReactInstanceManager();
                DeveloperSettings devSettings = reactInstanceManager.getDevSupportManager().getDevSettings();
                devSettings.setBundleDeltasEnabled(false);
                devSettings.setBundleSourceMapPath(sourceMapFilePath);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // ...
}
  1. 最后,在React Native项目的根目录下,运行以下命令重新构建Android应用:
代码语言:txt
复制
cd android
./gradlew clean
./gradlew assembleDebug

这样,Android上的React Native应用就可以包含和读取源映射文件了。源映射文件对于调试和错误追踪非常有用,它可以将压缩后的代码映射回原始源代码,方便开发者定位和修复bug。

推荐的腾讯云相关产品:腾讯云移动应用托管(Mobile Application Hosting),详情请参考腾讯云移动应用托管产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 领券