React Native
MAC Develop tools
ENV setup
Running on Device with Expo
# create app
npx create-expo-app@latest
# start app
npx expo start
# or
pnpm run android
# or
yarn android --mode release
# This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing.
pnpm run reset-project
# deploy to testflight
npx testflight
Build App
๐ Expo ๅทฅไฝๆต็จๅ จๆฏๅพ
ๆญๅปบ่ๆๆถ โ ้กน็ฎ้
็ฝฎ โ ๆฌๅฐๅผๅ โ ้ขๆๅปบ โ ๆๅ
APK โ ๅๅธ
// package.json
{
"dependencies": {
// === Expo ๆ ธๅฟ ===
"expo": "~53.0.0", // Expo SDK ๆ ธๅฟ
"expo-status-bar": "~2.2.0", // ็ถๆๆ
// === React ็ๆ ===
"react": "19.0.0", // React ๆ ธๅฟ
"react-native": "0.79.5", // RN ๆ ธๅฟ
// === ่ทฏ็ฑ๏ผๅฆๆไฝฟ็จ Expo Router๏ผ===
"expo-router": "~5.1.0", // ๆไปถ็ณป็ป่ทฏ็ฑ
"expo-linking": "~7.1.0", // Deep Linking
"expo-splash-screen": "~0.30.0", // ๅฏๅจๅฑๅน
// === ๅผๅๅทฅๅ
ท ===
"expo-dev-client": "~5.2.0" // ่ชๅฎไนๅผๅๅฎขๆท็ซฏ
},
"devDependencies": {
"@babel/core": "^7.28.0", // Babel ๆ ธๅฟ
"@expo/cli": "^0.24.0", // Expo CLI ๅทฅๅ
ท
"@types/react": "~19.0.0", // TS ็ฑปๅๅฎไน
"typescript": "^5.9.0" // TypeScript
}
}
// eas.json
{
"cli": {
"version": ">= 5.0.0"
},
"build": {
// === ๅผๅๆๅปบ ===
"development": {
"developmentClient": true, // ๅผๅๅฎขๆท็ซฏ
"distribution": "internal",
"android": {
"gradleCommand": ":app:assembleDebug",
"buildType": "apk"
}
},
// === ้ข่งๆๅปบ๏ผๆต่ฏ็ฏๅข๏ผ===
"preview": {
"distribution": "internal",
"android": {
"buildType": "apk" // ็ๆ APK
},
"env": {
"EXPO_PUBLIC_ENV": "staging"
}
},
// === ็ไบงๆๅปบ ===
"production": {
"android": {
"buildType": "aab" // ็ๆ AAB๏ผGoogle Play๏ผ
},
"env": {
"EXPO_PUBLIC_ENV": "production"
}
}
},
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./path/to/key.json"
}
}
}
}
// app.json
{
"ios": {
"bundleIdentifier": "com.yourcompany.yourapp"
}
}
Metro Bundler ๅไปไน๏ผ
ๆบไปฃ็ (.tsx/.ts)
โ Babel ่ฝฌ่ฏ
JavaScript Bundle
โ Metro ๆๅ
index.bundle
โ ้่ฟ HTTP ๆๅก
App ๅ ่ฝฝ่ฟ่ก
Prebuild stage
- ่ฏปๅ้ ็ฝฎ๏ผ่งฃๆ app.json ๅๆไปถ้ ็ฝฎ
- ็ๆๅ็ไปฃ็ ๏ผ
- Android: AndroidManifest.xml, build.gradle, Java/Kotlin ๆไปถ
- iOS: Info.plist, Podfile, Objective-C/Swift ๆไปถ
- ้พๆฅๅ็ๆจกๅ๏ผExpo Autolinking๏ผ็ฑปไผผ React Native CLI ็ autolinking๏ผ
- ๅบ็จๆไปถไฟฎๆน๏ผๆง่ก้ ็ฝฎๆไปถ๏ผConfig Plugins๏ผ
# Install expo-dev-client
npx expo install expo-dev-client
# Install Cli
npm install -g eas-cli && eas login
# bulild android develop
eas build --platform android --profile development
# build android product
eas build --platform android --profile production
# build ios develop
eas build --platform ios --profile development
# build production
eas build --platform ios --profile production
# submit to ios store
eas submit --platform ios
# submit to Google Play Store
https://docs.expo.dev/deploy/submit-to-app-stores/#google-play-store
# Android ็ญพๅๅฏ้ฅ๏ผEAS ไผ่ชๅจ็ฎก็๏ผ
eas credentials
# ๆๆๅจ็ๆ
keytool -genkeypair -v \
-storetype PKCS12 \
-keystore my-release-key.keystore \
-alias my-key-alias \
-keyalg RSA \
-keysize 2048 \
-validity 10000
# ๆฅ็ๆๅปบๅ่กจ
eas build:list
# ไธ่ฝฝๆๆฐๆๅปบ
eas build:download --platform android --latest
EAS Build ๅทฅไฝๆต๏ผ
- ไธไผ ไปฃ็ ๅฐ EAS ๆๅกๅจ
- ๅจไบ็ซฏ่ฟ่ก prebuild
- ๅฎ่ฃ ไพ่ต (npm install)
- ๆง่ก Gradle ๆๅปบ
- ็ญพๅ APK/AAB
- ไธไผ ๆๅปบไบง็ฉๅฐ CDN
- ่ฟๅไธ่ฝฝ้พๆฅ
Without Expo
# macOS ้่ฆๅฎ่ฃ
# 1. Android Studio
# 2. JDK 17
# 3. Android SDK (API 34+)
# 4. ้
็ฝฎ็ฏๅขๅ้
# Install jdk21 https://www.oracle.com/java/technologies/downloads/#java21
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
export PATH="$JAVA_HOME/bin:$PATH"
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
# ้ช่ฏ็ฏๅข
adb --version
sdkmanager --list
# create app
npx @react-native-community/cli@latest init AwesomeProject
# ้ขๆๅปบ
npx expo prebuild --platform android --clean
# ๆฃๆฅ็ๆ็ๆไปถ
ls -la android/
# build local pkg for development
npx expo run:android
# ๆฌๅฐๆๅปบ APK
# ๆนๆณ 1๏ผไฝฟ็จ Expo CLI๏ผๆจ่๏ผ
npx expo run:android --variant release
# ๆนๆณ 2๏ผ็ดๆฅไฝฟ็จ Gradle
cd android
./gradlew assembleRelease # ็ๆ APK
./gradlew bundleRelease # ็ๆ AAB
# APK ไฝ็ฝฎ
# android/app/build/outputs/apk/release/app-release.apk
# start metro in one terminal
yarn start
# start app in the other terminal
yarn android --port 8080 --verbose
# check status
npx react-native doctor
# find the id for the process that is listening on port
sudo lsof -i :8081
# kill process
kill -9 <PID>
็ญพๅ APK
# 1. ๅๅปบ็ญพๅ้
็ฝฎๆไปถ
# android/app/build.gradle
android {
signingConfigs {
release {
storeFile file("my-release-key.keystore")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
# 2. ่ฎพ็ฝฎ็ฏๅขๅ้
export KEYSTORE_PASSWORD="your_password"
export KEY_ALIAS="your_alias"
export KEY_PASSWORD="your_key_password"
# 3. ๆๅปบ็ญพๅ APK
cd android
./gradlew assembleRelease
Build Optimization
# ๅๅฐ APK ไฝ็งฏ
// android/app/build.gradle
android {
// ๅฏ็จ ProGuard/R8 ไปฃ็ ๆททๆท
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
}
}
// ๆๅ APK๏ผๆๆถๆ๏ผ
splits {
abi {
enable true
reset()
include "armeabi-v7a", "arm64-v8a"
universalApk false
}
}
}
// app.json
// ๅฏ็จ Hermes ๅผๆ
{
"expo": {
"jsEngine": "hermes", // ้ป่ฎคๅทฒๅฏ็จ
"android": {
"enableProguardInReleaseBuilds": true,
"enableShrinkResourcesInReleaseBuilds": true
}
}
}
ๅฎๆดๆๅปบๆต็จ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Expo ้กน็ฎๆบไปฃ็ โ
โ (TypeScript/JSX + app.json + eas.json) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ npx expo prebuild โ
โ (็ๆๅ็ไปฃ็ ) โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโดโโโโโโโโโโโโ
โผ โผ
โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
โ android/ โ โ ios/ โ
โ (Java/Kotlin) โ โ (Obj-C/Swift) โ
โโโโโโโโโโฌโโโโโโโโ โโโโโโโโโโฌโโโโโโโโ
โ โ
โผ โผ
โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
โ Gradle Build โ โ Xcode Build โ
โ ./gradlew โ โ xcodebuild โ
โโโโโโโโโโฌโโโโโโโโ โโโโโโโโโโฌโโโโโโโโ
โ โ
โผ โผ
โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
โ APK / AAB โ โ IPA โ
โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
Troubleshooting
# ้ฎ้ข 1๏ผMetro Bundler ็ผๅญ้่ฏฏ
rm -rf node_modules/.cache .expo
npx expo start -c
# Android Gradle ๆๅปบๅคฑ่ดฅ
## ๆธ
็ Gradle ็ผๅญ
cd android
./gradlew clean
cd ..
## ้ๆฐ็ๆๅ็ไปฃ็
npx expo prebuild --clean
# ไพ่ตๅฒ็ช
rm -rf node_modules pnpm-lock.yaml
pnpm install
## ๆไฝฟ็จ Expo ไฟฎๅคๅทฅๅ
ท
npx expo install --fix
# ๆฅ็ Android ๆฅๅฟ
adb logcat | grep ReactNative
# RN ๆฅๅฟ
npx react-native log-android
Expo
# Check Expo Version Compatibility
npx expo install --fix
npx expo prebuild --clean
npx expo run:android
- Android emulator
- iOS simulator
- Expo documentation: Learn fundamentals, or go into advanced topics with our
- guides.
- Learn Expo tutorial: Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web.
clean and reinstall dependencies
rm -rf node_modules
rm -rf .expo
pnpm install
npx expo install <pkg-name>
builds
npx expo build:android
eas build --platform android --profile production --local
ADB
# list devices
adb devices -l
List of devices attached
emulator-5554 device product:sdk_gphone64_x86_64 model:sdk_gphone64_x86_64 device:emu64xa transport_id:2
5EGBB22511208006 device product:KATHY-AN00 model:Hera_BD00 device:TS-KATHY-Q transport_id:1
Page Source