JSI 기반 React Native 라이브러리에 전처리기 플래그를 지정하는 방법

안녕하세요 타쿠야입니다.
React Native를 사용하여 모바일용 Inkdrop이라는 메모 작성 앱을 만들고 있습니다.

이 앱은 SQLite의 빠른 래퍼인 react-native-quick-sqlite를 사용합니다.


오스프랑코 / react-native-quick-sqlite


react-native를 위한 빠른 SQLite.







    yarn add react-native-quick-sqlite
    npx pod-install


Quick SQLite embeds the latest version of SQLite and provides a low-level JSI-backed API to execute SQL queries. By using an embedded SQLite you get access the latest security patches and latest features.

Performance metrics are intentionally not posted, suggest anywhere between 2x and 5x speed improvement.

잡았다

  • Javascript cannot represent integers larger than 53 bits, be careful when loading data if it came from other systems. Read more.
  • It's not possible to use a browser to debug a JSI app, use Flipper (for android Flipper also has SQLite Database explorer).

API

/**
 * All SQLite command results will have at least this status definition:
 * Specific statements or actions can bring more data, relative to its context
 * status: 0 or undefined for correct execution, 1 for error
 *  message: if status === 1, here you will find error

It embeds the latest version of SQLite in C/C++.
That means that you build SQLite from source in your RN project on Xcode and Android Studio (CMake).

It doesn't enable any compile-time options by default, and I needed to enable FTS5 for full-text search in my app.
It can be enabled by specifying a SQLITE_ENABLE_FTS5 pre-processor flag when compiling.

I've managed to enable FTS5 and I'd like to share how to do that in your project.
For Android, the library needs to make some changes. So, it'd be helpful for library maintainers who would support accepting custom build flags.

아이폰 OS

Fortunately, CocoaPods allows you to customize the pods project settings via Podfile:

Add a post_install block to your <PROJECT_ROOT>/ios/Podfile like so:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "react-native-quick-sqlite" then
      target.build_configurations.each do |config|
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '<SQLITE_FLAGS>']
      end
    end
  end
end
<SQLITE_FLAGS> 부분을 추가하려는 플래그로 바꿉니다.
예를 들어 SQLITE_ENABLE_FTS5=1GCC_PREPROCESSOR_DEFINITIONS에 추가하여 iOS 프로젝트에서 FTS5를 활성화할 수 있습니다.

기계적 인조 인간



네이티브 모듈은 CMakeLists.txt 를 읽는 CMake로 컴파일됩니다.

CMake는 add_definitions command 으로 플래그 추가를 지원합니다.

라이브러리의 CMakeLists.txt에 다음 줄을 추가합니다.

add_definitions(
  ${SQLITE_FLAGS}
)

다음과 같이 SQLITE_FLAGS에 지정해야 하는 변수 react-native-quick-sqlite/android/build.gradle를 통해 플래그를 지정합니다.

def SQLITE_FLAGS = rootProject.properties['quickSqliteFlags']

android {
  defaultConfig {
    externalNativeBuild {
        cmake {
            arguments '-DANDROID_STL=c++_shared',
              "-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION}",
              "-DNODE_MODULES_DIR=${nodeModules}",
              "-DSQLITE_FLAGS='${SQLITE_FLAGS ? SQLITE_FLAGS : ''}'"
        }
    }

이제 다음과 같이 <PROJECT_ROOT>/android/gradle.properties에서 플래그를 정의할 수 있습니다.

quickSqliteFlags="<SQLITE_FLAGS>"

그게 다야!
빠른 sqlite 저장소에 풀 요청을 보냈습니다.

feat(ios&android): sqlite에 전처리기 플래그 지정 지원 #86







craftzdog
에 게시됨



전처리기 플래그를 지정하여 iOS와 Android 모두에서 FTS5를 활성화했습니다.
Android에서는 상위 프로젝트의 설정을 수락해야 합니다.
이 PR을 사용하면 android/gradle.properties를 통해 SQLite 플래그를 지정할 수 있습니다.
또한 iOS 및 Android에서 이를 수행하는 방법에 대한 지침을 추가했습니다.
문법이 개선될 수도 있습니다.
수정 #37


View on GitHub



도움이 되길 바랍니다.


온라인으로 저를 팔로우하세요


  • Inkdrop — A Markdown note-taking app이라는 내 앱을 확인하세요.
  • 트위터
  • 블로그 https://blog.inkdrop.app/
  • 유튜브
  • 인스타그램
  • 좋은 웹페이지 즐겨찾기