2026/6/19 23:57:38
网站建设
项目流程
全国信息企业查询系统官网,扬州seo推广,网络营销方案设计题,破解网站后台账号密码1. 部署 APK 到系统分区
将应用放入 /system/priv-app 会使其自动成为“特权系统应用”#xff0c;从而获得访问系统内部库的权限。
1.1操作步骤#xff1a;
adb root
adb disable-verity # 针对 RK3399 固件#xff0c;通常需要关闭校验才能修改 /system
adb reboo…1. 部署 APK 到系统分区将应用放入 /system/priv-app 会使其自动成为“特权系统应用”从而获得访问系统内部库的权限。1.1操作步骤adb root adb disable-verity # 针对 RK3399 固件通常需要关闭校验才能修改 /system adb reboot # 重启以生效 adb root adb remount # 重新挂载分区为可读写1.2 推送 APK# 创建存放目录建议与应用包名一致 adb shell mkdir -p /system/priv-app/xxxApp # 将编译好的 APK 推送进去 adb push YourApp-release.apk /system/priv-app/xxxApp/xxxApp.apk1.3 设置权限关键adb shell chmod 755 /system/priv-app/xxxApp adb shell chmod 644 /system/priv-app/xxxApp/xxxApp.apk adb shell chown root:root /system/priv-app/xxxApp/xxxApp.apk2. 实现加载系统 librosa.so仅仅把 APK 放进系统是不够的Android 11 的 Linker Namespace链接器命名空间 依然会拦截对非标准库的加载。2.1 配置白名单修改 /system/etc/public.libraries.txt在文件末尾添加一行不要带路径libxxx.so注这告诉系统librosa.so 是一个允许被 App 加载的公共库。2.2 放置系统库如果你还没放adb push librosa.so /system/lib64/ adb shell chmod 644 /system/lib64/libxxx.so2.3 修复 SELinux 标签最重要的一步如果你不执行这一步App 会因为 SELinux 拦截报错 permission denied。adb shell restorecon /system/lib64/libxxx.so adb shell restorecon /system/etc/public.libraries.txt adb shell restorecon -R /system/priv-app/xxxApp2.4 重启系统adb reboot3 错误解决3.1 重启后会出现以下错误现在的错误是 React Native 层面的 JS 加载失败java.lang.RuntimeException: Unable to load script. Make sure youre either running Metro (run npx react-native start) or that your bundle index.android.bundle is packaged correctly for release.为什么会出现这个错误当你将 APK 放入 /system/priv-app 时它脱离了开发环境Metro Server。系统应用必须是 Release 模式并且必须在 APK 内部包含离线资源包index.android.bundle。你的日志显示App 尝试连接 localhost:8081Metro 调试服务器失败。App 转向读取 assets/index.android.bundle但在 APK 内没找到这个文件。3.2 解决方案1. 确保构建的是 Release 版本你不能直接把 Debug 版的 APK 放入 /system。请在项目根目录运行# 如果使用 Expo npx expo export:embed --platform android --dev false --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res# 然后通过 Gradle 构建 Release APK cd android ./gradlew assembleRelease构建完成后APK 路径通常在android/app/build/outputs/apk/release/app-release.apk。2. 检查 APK 是否包含 Bundle 文件关键手动检查在推送 APK 到系统之前请在电脑上检查该 APK 内部, 将 app-release.apk 后缀改为 .zip 并打开。确认是否存在 assets/index.android.bundle 文件。如果没有这个文件App 永远无法作为系统应用启动。3. 重新执行以下步骤adb root adb remount # 删除旧的测试包 adb shell rm -rf /system/priv-app/xxxApp # 创建目录并推送正式 Release 包 adb shell mkdir -p /system/priv-app/xxxApp adb push android/app/build/outputs/apk/release/app-release.apk /system/priv-app/xxxApp/xxxApp.apk # 设置权限 adb shell chmod 755 /system/priv-app/xxxApp adb shell chmod 644 /system/priv-app/xxxApp/xxxApp.apk adb shell restorecon -R /system/priv-app/xxxApp # 重启 adb reboot4. APP打包时排除so库步骤 1修改 CMakeLists.txt核心配置JSI 模块的 CMake 配置是关键需要移除本地 SO 的导入仅保留符号链接让编译器知道从系统目录查找 SO。原 JSI 模块 CMakeLists.txt内置 SO 示例cmake_minimum_required(VERSION 3.13) # 导入本地 SO原逻辑 add_library(libtest SHARED IMPORTED) set_target_properties(libtest PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libtest.so ) # JSI 模块编译 add_library( jsi-test-module # JSI 模块名 SHARED ./cpp/JSIExample.cpp # JSI 绑定的 C 代码 ) # 链接本地 SO原逻辑 target_link_libraries( jsi-test-module libtest # 本地 SO reactnativejsi # RN JSI 核心库 log android )修改后的 CMakeLists.txt系统 SO 配置cmake_minimum_required(VERSION 3.13) # 关键1移除本地 SO 的 add_library 和 IMPORTED_LOCATION 配置 # 关键2添加系统库搜索路径指向 Android 系统 SO 目录 link_directories( /system/lib64 # 64位系统 SO 路径32位写 /system/lib /vendor/lib64 # 可选vendor 分区的 SO 路径 ) # JSI 模块编译保留原有 JSI 绑定代码 add_library( jsi-test-module SHARED ./cpp/JSIExample.cpp ) # 关键3链接时直接指定系统 SO 名去掉 lib 前缀不关联本地文件 target_link_libraries( jsi-test-module test # 系统 SO对应 /system/lib64/libtest.so仅写 test系统自动补全 lib 和 .so reactnativejsi # RN JSI 核心库必须保留 log android ) # 关键4设置链接选项强制从系统路径加载 SO避免优先找 APK 内置 target_link_options( jsi-test-module PRIVATE -Wl,-rpath/system/lib64 # 指定运行时 SO 搜索路径 -Wl,--enable-new-dtags # 启用新的动态标签确保 rpath 生效 )步骤 2修改 build.gradle排除 SO 打包确保 Gradle 不会将目标 SO 打包到 APK 中避免与系统 SO 冲突和 JNI 场景一致但必须配置android { // ... 其他配置compileSdk、buildToolsVersion 等 defaultConfig { // ... externalNativeBuild { cmake { arguments -DANDROID_STLc_shared // 保持与系统 SO 一致的 STL abiFilters arm64-v8a // 仅保留系统 SO 对应的架构如 arm64-v8a } } } // 排除目标 SO 打包到 APK packagingOptions { exclude lib/arm64-v8a/libtest.so // 64位 SO exclude lib/armeabi-v7a/libtest.so // 32位 SO如果有 } sourceSets { main { jniLibs.srcDirs [src/main/jniLibs] jniLibs.exclude **/libtest.so // 双重保障排除所有 ABI 的 libtest.so } } externalNativeBuild { cmake { path src/main/cpp/CMakeLists.txt // 指向修改后的 CMake 文件 } } }步骤 3修改 C 代码显式加载系统 SO可选但推荐JSI 模块加载时需确保系统 SO 已被加载避免符号未找到错误。在 JSI 绑定的入口函数前手动加载系统 SOvoid forceLoadSystemRosaSO() { void* handle dlopen(libtest.so, RTLD_NOW); if (!handle) { // 如果失败查看 dlerror() throw std::runtime_error(dlerror()); } }