Skip to content

Commit bb3e488

Browse files
authored
Build from source (#97)
# Why react-native upstream upgrade frequently and i don't have much time to keep publish with every versions. nowadays gradle can install ndk if necessary, that makes it easier to build form source code. # How - add autolinking code - add cmake gradle integration (referenced from reanimated) # Test Plan update github actions workflows to do e2e test
1 parent 8163f99 commit bb3e488

40 files changed

+885
-567
lines changed

.github/workflows/android.yml

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,29 @@
1-
name: Build for Android
1+
name: E2E tests for Android
22

33
on:
44
push:
55
branches:
66
- main
7-
- '*-stable'
7+
- "*-stable"
88
pull_request:
99

1010
jobs:
11-
build:
12-
runs-on: ubuntu-latest
13-
container:
14-
image: reactnativecommunity/react-native-android:5.0
15-
16-
steps:
17-
- uses: actions/checkout@v2
18-
19-
- name: Install packages
20-
run: |
21-
# Workaround for: https://github.com/nodesource/distributions/issues/1266
22-
mv /etc/apt/sources.list.d/nodesource.list /etc/apt/sources.list.d/nodesource.list.disabled
23-
apt-get update
24-
apt-get -y upgrade
25-
apt-get install -y ca-certificates libgnutls30
26-
mv /etc/apt/sources.list.d/nodesource.list.disabled /etc/apt/sources.list.d/nodesource.list
27-
apt-get update
28-
apt-get install patch -y
29-
30-
- name: Install node modules
31-
run: yarn install
32-
33-
- name: Export settings from npm package
34-
run: npm run export_npm_env
35-
36-
- name: Build React Native V8
37-
run: scripts/build.sh
38-
39-
- uses: actions/upload-artifact@v2
40-
with:
41-
name: dist
42-
path: dist
43-
4411
e2e-test:
45-
needs: build
46-
if: ${{ github.ref != 'refs/heads/main' && github.base_ref != 'main' }}
4712
runs-on: macos-10.15
4813
strategy:
4914
matrix:
50-
variant: [intl, nointl, jit-intl, jit-nointl]
15+
rn-version: [0.67, 0.66]
16+
v8-android-variant:
17+
[v8-android-jit, v8-android-jit-nointl, v8-android, v8-android-nointl]
5118

5219
steps:
5320
- uses: actions/checkout@v2
5421

55-
- name: Install v8 package
56-
run: |
57-
RN_VERSION=$(cat package.json | jq '.config.RN_VERSION' | tr -d '"' | sed 's/^v//')
58-
echo "RN_VERSION=$RN_VERSION" >> $GITHUB_ENV
59-
V8_VERSION=$(cat package.json | jq '.dependencies."v8-android-jit"' | tr -d '"')
60-
V8_VARIANT=$(echo v8-android-${{ matrix.variant }} | sed 's/-intl$//')
61-
echo "V8_VARIANT=$V8_VARIANT" >> $GITHUB_ENV
62-
yarn add "$V8_VARIANT@$V8_VERSION"
63-
64-
- uses: actions/download-artifact@v2
65-
with:
66-
name: dist
67-
path: dist
68-
6922
- name: Run tests
7023
uses: reactivecircus/android-emulator-runner@v2
7124
with:
7225
api-level: 29
7326
script: |
7427
adb logcat -c
75-
python3 scripts/gen_project.py --version $RN_VERSION --from dist --v8_maven_repo node_modules/$V8_VARIANT/dist TestApp
28+
python3 scripts/gen_project.py --rn-version ${{ matrix.rn-version }} --v8-android-variant ${{ matrix.v8-android-variant }} TestApp
7629
adb logcat -d | grep -E "=== V8 version\[.+\] ===" > /dev/null

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ package-lock.json
33
/dist
44

55
scripts/depot_tools
6-
v8
6+
v8/
7+
!android/src/main/java/io/csie/kudo/reactnative/v8/
78

89
# Created by https://www.gitignore.io/api/node,android,reactnative,intellij+all,androidstudio,visualstudiocode
910

@@ -103,6 +104,7 @@ gen-external-apklibs
103104

104105
# NDK
105106
obj/
107+
.cxx/
106108

107109
# IntelliJ IDEA
108110
*.iws

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2019 Kudo
3+
Copyright (c) 2019 Kudo Chien
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

android/CMakeLists.txt

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#
2+
# Copyright (c) Software Mansion <swmansion.com>.
3+
# Copyright (c) Kudo Chien.
4+
#
5+
# This source code is licensed under the MIT license found in the
6+
# LICENSE file in the root directory of this source tree.
7+
#
8+
9+
cmake_minimum_required(VERSION 3.5.1)
10+
11+
set(CMAKE_VERBOSE_MAKEFILE ON)
12+
set(CMAKE_CXX_STANDARD 14)
13+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
14+
set(CMAKE_CXX_EXTENSIONS OFF)
15+
set(CMAKE_CXX_FLAGS "-DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -fexceptions -fno-omit-frame-pointer -frtti -Wno-sign-compare")
16+
17+
# if(${NATIVE_DEBUG})
18+
# set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
19+
# set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
20+
# endif()
21+
22+
if(${ANDROID_ABI} STREQUAL "arm64-v8a" OR ${ANDROID_ABI} STREQUAL "x86_64")
23+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DV8_COMPRESS_POINTERS")
24+
endif()
25+
26+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
27+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
28+
29+
set(PACKAGE_NAME "v8executor")
30+
set(SRC_DIR "${CMAKE_SOURCE_DIR}/src/main/cpp")
31+
32+
set(RN_SO_DIR "${RN_DIR}/ReactAndroid/src/main/jni/first-party/react/jni")
33+
set(FBJNI_HEADERS_DIR "${RN_SO_DIR}/../../fbjni/headers")
34+
35+
set(V8RUNTIME_COMMON_DIR "${CMAKE_SOURCE_DIR}/../src/v8runtime")
36+
file(GLOB SOURCES_V8RUNTIME "${V8RUNTIME_COMMON_DIR}/*.cpp")
37+
38+
add_library(
39+
${PACKAGE_NAME}
40+
SHARED
41+
${SOURCES_V8RUNTIME}
42+
"${SRC_DIR}/V8ExecutorFactory.cpp"
43+
"${SRC_DIR}/OnLoad.cpp"
44+
)
45+
46+
# includes
47+
48+
file(GLOB LIBFBJNI_INCLUDE_DIR ${FBJNI_HEADERS_DIR})
49+
50+
target_include_directories(
51+
${PACKAGE_NAME}
52+
PRIVATE
53+
"${V8RUNTIME_COMMON_DIR}"
54+
"${LIBFBJNI_INCLUDE_DIR}"
55+
"${BUILD_DIR}/third-party-ndk/boost/boost_${BOOST_VERSION}"
56+
"${BUILD_DIR}/third-party-ndk/double-conversion"
57+
"${BUILD_DIR}/third-party-ndk/folly"
58+
"${BUILD_DIR}/third-party-ndk/glog/exported"
59+
"${RN_DIR}/ReactAndroid/src/main/jni"
60+
"${RN_DIR}/ReactCommon"
61+
"${RN_DIR}/ReactCommon/jsi"
62+
"${RN_DIR}/ReactCommon/jsiexecutor"
63+
"${V8_ANDROID_DIR}/dist/include"
64+
)
65+
66+
# find libraries
67+
68+
file(GLOB LIBRN_DIR "${RN_SO_DIR}/${ANDROID_ABI}")
69+
file(GLOB LIBV8_DIR "${RN_SO_DIR}/../../v8/jni/${ANDROID_ABI}")
70+
71+
find_library(
72+
LOG_LIB
73+
log
74+
)
75+
find_library(
76+
FOLLY_JSON_LIB
77+
folly_json
78+
PATHS ${LIBRN_DIR}
79+
NO_CMAKE_FIND_ROOT_PATH
80+
)
81+
find_library(
82+
REACT_NATIVE_JNI_LIB
83+
reactnativejni
84+
PATHS ${LIBRN_DIR}
85+
NO_CMAKE_FIND_ROOT_PATH
86+
)
87+
find_library(
88+
GLOG_LIB
89+
glog
90+
PATHS ${LIBRN_DIR}
91+
NO_CMAKE_FIND_ROOT_PATH
92+
)
93+
find_library(
94+
FBJNI_LIB
95+
fbjni
96+
PATHS ${LIBRN_DIR}
97+
NO_CMAKE_FIND_ROOT_PATH
98+
)
99+
find_library(
100+
JSI_LIB
101+
jsi
102+
PATHS ${LIBRN_DIR}
103+
NO_CMAKE_FIND_ROOT_PATH
104+
)
105+
find_library(
106+
V8_ANDROID_LIB
107+
v8android
108+
PATHS ${LIBV8_DIR}
109+
NO_CMAKE_FIND_ROOT_PATH
110+
)
111+
112+
# reactnative_internal_static
113+
file(GLOB INCLUDE_RN_JSIREACT_CPP "${RN_DIR}/ReactCommon/jsiexecutor/jsireact/*.cpp")
114+
file(GLOB INCLUDE_RN_JSINSPECTOR_CPP "${RN_DIR}/ReactCommon/jsinspector/*.cpp")
115+
file(GLOB INCLUDE_RN_REACTPERFLOGGER_CPP "${RN_DIR}/ReactCommon/reactperflogger/reactperflogger/*.cpp")
116+
117+
add_library(
118+
reactnative_internal_static
119+
STATIC
120+
"${INCLUDE_RN_JSIREACT_CPP}"
121+
"${INCLUDE_RN_JSINSPECTOR_CPP}"
122+
"${INCLUDE_RN_REACTPERFLOGGER_CPP}"
123+
"${RN_DIR}/ReactCommon/cxxreact/JSExecutor.cpp"
124+
)
125+
126+
target_include_directories(
127+
reactnative_internal_static
128+
PRIVATE
129+
"${BUILD_DIR}/third-party-ndk/boost/boost_${BOOST_VERSION}"
130+
"${BUILD_DIR}/third-party-ndk/double-conversion"
131+
"${BUILD_DIR}/third-party-ndk/folly"
132+
"${BUILD_DIR}/third-party-ndk/glog/exported"
133+
"${RN_DIR}/ReactCommon"
134+
"${RN_DIR}/ReactCommon/jsi"
135+
"${RN_DIR}/ReactCommon/jsiexecutor"
136+
"${RN_DIR}/ReactCommon/jsinspector"
137+
"${RN_DIR}/ReactCommon/reactperflogger"
138+
)
139+
140+
target_link_libraries(
141+
reactnative_internal_static
142+
${FOLLY_JSON_LIB}
143+
)
144+
145+
# link to shared libraries
146+
147+
set_target_properties(${PACKAGE_NAME} PROPERTIES LINKER_LANGUAGE CXX)
148+
149+
target_link_libraries(
150+
${PACKAGE_NAME}
151+
${LOG_LIB}
152+
${JSI_LIB}
153+
${GLOG_LIB}
154+
${FBJNI_LIB}
155+
${FOLLY_JSON_LIB}
156+
${REACT_NATIVE_JNI_LIB}
157+
${V8_ANDROID_LIB}
158+
reactnative_internal_static
159+
android
160+
)

0 commit comments

Comments
 (0)