From 6b4e526b2da109a367aa0a6142feb6e4e3c2532c Mon Sep 17 00:00:00 2001 From: Kudo Chien Date: Tue, 4 Jun 2019 12:39:41 -0700 Subject: [PATCH] Add debug build support for Android native code (#25147) Summary: With JSI based architecture, there will be more and more C++ native code involved. Original NDK builder in RN only supports release build and that's not reasonable for native debugging. This change introduces a way to build native code in debuggable version. Simply add `NATIVE_BUILD_TYPE=Debug` environment variable during gradle build, e.g. `NATIVE_BUILD_TYPE=Debug ./gradlew clean :ReactAndroid:assembleDebug` ## Changelog [Android] [Added] - Add native debug build support to improve debugging DX Pull Request resolved: https://github.com/facebook/react-native/pull/25147 Differential Revision: D15628533 Pulled By: cpojer fbshipit-source-id: 8f5b54c4580824452d2a1236a7bd641889b001ec --- ReactAndroid/build.gradle | 4 ++++ ReactAndroid/src/main/jni/react/jni/Android.mk | 8 ++++++++ ReactAndroid/src/main/jni/third-party/folly/Android.mk | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 84207fb50578dc..343543143431bc 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -33,6 +33,9 @@ def dependenciesPath = System.getenv("REACT_NATIVE_DEPENDENCIES") // and the build will use that. def boostPath = dependenciesPath ?: System.getenv("REACT_NATIVE_BOOST_PATH") +// Setup build type for NDK, supported values: {debug, release} +def nativeBuildType = System.getenv("NATIVE_BUILD_TYPE") ?: "release" + task createNativeDepsDirectories { downloadsDir.mkdirs() thirdPartyNdkDir.mkdirs() @@ -225,6 +228,7 @@ task buildReactNdkLib(dependsOn: [prepareJSC, prepareBoost, prepareDoubleConvers inputs.dir("src/main/java/com/facebook/react/modules/blob") outputs.dir("$buildDir/react-ndk/all") commandLine(getNdkBuildFullPath(), + "NDK_DEBUG=" + (nativeBuildType.equalsIgnoreCase("debug") ? "1" : "0"), "NDK_PROJECT_PATH=null", "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", "NDK_OUT=" + temporaryDir, diff --git a/ReactAndroid/src/main/jni/react/jni/Android.mk b/ReactAndroid/src/main/jni/react/jni/Android.mk index 1cf03a78a5ea19..28c1fae096e7bf 100644 --- a/ReactAndroid/src/main/jni/react/jni/Android.mk +++ b/ReactAndroid/src/main/jni/react/jni/Android.mk @@ -36,6 +36,14 @@ LOCAL_MODULE := reactnativejni # Compile all local c++ files. LOCAL_SRC_FILES := $(wildcard *.cpp) +ifeq ($(APP_OPTIM),debug) + # Keep symbols by overriding the strip command invoked by ndk-build. + # Note that this will apply to all shared libraries, + # i.e. shared libraries will NOT be stripped + # even though we override it in this Android.mk + cmd-strip := +endif + # Build the files in this directory as a shared library include $(BUILD_SHARED_LIBRARY) diff --git a/ReactAndroid/src/main/jni/third-party/folly/Android.mk b/ReactAndroid/src/main/jni/third-party/folly/Android.mk index c84f2d9330b419..7da39f37737875 100644 --- a/ReactAndroid/src/main/jni/third-party/folly/Android.mk +++ b/ReactAndroid/src/main/jni/third-party/folly/Android.mk @@ -17,6 +17,14 @@ LOCAL_SRC_FILES:= \ folly/container/detail/F14Table.cpp \ folly/ScopeGuard.cpp \ +ifeq ($(APP_OPTIM),debug) + LOCAL_SRC_FILES += \ + folly/lang/Assume.cpp \ + folly/lang/SafeAssert.cpp \ + folly/FileUtil.cpp \ + folly/portability/SysUio.cpp +endif + LOCAL_C_INCLUDES := $(LOCAL_PATH) LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)