官网:https://expo.dev/ # 初始化项目 # 打包 ## 云打包 1. 安装 EAS CLI ```bash npm install -g eas-cli ``` 2. 注册并登录 Expo 账户 - 访问 https://expo.dev/ 注册账户,然后命令行登录: ```bash expo login ``` 3. 配置项目构建 - 输入以下命令,选择 Android 平台即可。 ```bash eas build:configure ``` 4. 构建 Android 包 - 默认构建 AAB 包(上传 Google Play): ```bash eas build --platform android ``` - 构建 APK(可直接安装): ```bash eas build -p android --profile preview ``` ## 本地打包(EAS方式) ## 本地打包(原生方式) ### 1. 安装 [Android Studio]( https://developer.android.com/?hl=zh-cn) 1. 下载安装 - 按照官网提示依次安装 SDK 工具和必要组件。 - 安装完成后,记住 SDK 的安装路径(例如:`D:\data\sdk`,默认位置是:`C:\Users\<你的用户名>\AppData\Local\Android\Sdk`),后续需要用到。 2. 配置环境变量 - 打开 **系统属性 → 高级 → 环境变量**。 - 在 **系统变量** 中新增: ``` 变量名:ANDROID_HOME 变量值:D:\data\sdk ``` - 在 **Path** 中新增: ```bash %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools %ANDROID_HOME%\tools\bin ``` - 保存设置。 3. 验证安装 - 打开命令行,执行: ``` echo %ANDROID_HOME% ``` - 如果输出 SDK 路径,则说明配置成功。 ### 2. 安装 [jdk17](https://adoptium.net/zh-CN/temurin/releases?version=8&os=any&arch=any) 1. 下载安装 - 下载对应版本解压即可。 - 安装成功后,记住 jdk 的安装路径,后续需要用到。 2. 配置环境变量 - 打开 **系统属性 → 高级 → 环境变量**。 - 在 **系统变量** 中新增: ```bash 变量名:JAVA_HOME 变量值:D:\devtool\jdk\jdk-17.0.16+8 ``` - 在 **Path** 中新增: ```bash %JAVA_HOME%\bin ``` - 保存设置。 3. 验证安装 - 打开命令行,执行: ```bash java --version ``` - 如果输出 jdk 的信息,则说明配置成功。 ### 3. Expo 项目启用 [Prebuild](https://docs.expo.dev/workflow/prebuild/) 1. 生成原生项目 ```bash npx expo prebuild ``` 然后执行完毕后,会生成 `android` 目录。 2. 清除并重新生成原生项目 ```bash npx expo prebuild --clean ``` 会删除已有的 `android` 和 `ios` 目录,然后重新生成。 ### 4. 配置 Keystore #### 4.1 生成密钥 ```bash keytool -genkey -v -keystore android-release.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 ``` 说明: - `my-release-key.keystore`:生成的密钥文件名,可自定义路径 - `my-key-alias`:密钥别名 - `RSA`:加密算法 - `2048`:密钥长度 - `10000`:有效期(天) #### 4.2 手动配置 修改 `android/app/build.gradle` 文件 1. 修改 `signingConfigs` ```bash signingConfigs { release { storeFile file('android-release.keystore') // keystore 文件路径 storePassword '你的Keystore密码' // keystore 密码 keyAlias '你的KeyAlias' // 密钥别名 keyPassword '你的Key密码' // key 密码 } debug { storeFile file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } } ``` 2. 在 `buildTypes` 中设置 release 使用 release 签名 ```bash buildTypes { release { signingConfig signingConfigs.release } debug { signingConfig signingConfigs.debug } } ``` #### 4.3 脚本配置(推荐) 1. 在 expo 项目根目录下新增 `plugins\withAndroidSignature.js` 文件,内容如下: ```js // plugins/withAndroidSignature.js const { withAppBuildGradle } = require("@expo/config-plugins"); const fs = require("fs"); const path = require("path"); module.exports = function withAndroidSignature(config) { return withAppBuildGradle(config, config => { if (config.modResults.language === "groovy") { config.modResults.contents = setAndroidSignature(config.modResults.contents); } else { throw new Error("如果不是 groovy,则无法在 app/build.gradle 中设置 signingConfigs"); } return config; }); }; function setAndroidSignature(appBuildGradle) { if (!fs.existsSync(path.resolve(__dirname, "../credentials.json"))) { console.warn("警告:没有设置正式版本的 Android Keystore 文件,因为 credentials.json 不存在。"); return appBuildGradle; } const info = JSON.parse(fs.readFileSync(path.resolve(__dirname, "../credentials.json"), { encoding: "utf8" })); // 使用正则表达式插入签名信息 let output = appBuildGradle.replace( /(signingConfigs\s*\{)/, `$1 release { storeFile file(${JSON.stringify(path.resolve(__dirname, "../credentials/android-release.keystore"))}) storePassword ${JSON.stringify(info.android.keystore.keystorePassword)} keyAlias ${JSON.stringify(info.android.keystore.keyAlias)} keyPassword ${JSON.stringify(info.android.keystore.keyPassword)} }`, ); // 使用正则表达式替换 signingConfig output = output.replace( /(release\s*\{)[^}]*?signingConfig\s+signingConfigs\.debug/s, `$1 signingConfig signingConfigs.release `, ); return output; } ``` 2. 在 expo 项目根目录下新增 `credentials.json` 文件(该文件主要是 Keystore 的信息): ```json { "android": { "keystore": { "keystorePath": "credentials/android-release.keystore", // Android keystore 文件路径 "keystorePassword": "123456", // keystore 密码 "keyAlias": "my-key-alias", // Key 别名 "keyPassword": "123456" // Key 密码 } }, "ios": { "provisioningProfilePath": "ios/certs/profile.mobileprovision", // iOS 描述文件路径 "distributionCertificate": { "path": "ios/certs/dist-cert.p12", // iOS 分发证书路径 "password": "password" // 证书密码 } } } ``` 3. 在 `app.json` 中指定这个项目级插件: ```json { "expo": { "plugins": [ "./plugins/withAndroidSignature" ] } } ``` ### 5. 编译