APP-android_arm64启动流程全解:从权限申请、资源安装到NativeActivity加载的10个关键步骤

发布时间:2026/11/3 2:26:19
APP-android_arm64启动流程全解:从权限申请、资源安装到NativeActivity加载的10个关键步骤 【免费下载链接】APP-android_arm64项目地址https://gitcode.com/gh_mirrors/ap/APP-android_arm64点击查看免费下载APP-android_arm64 是开源 3D 建模软件 Blender 移植到 Android 设备的 APP 代码仓库应用名为OBlender。本文面向新手完整拆解它从点击图标到进入建模界面的启动流程权限申请、资源安装、NativeActivity 加载、JNI 回调桥接共 10 个关键步骤并附上核心源码路径帮助你快速理解一个 C 引擎如何跑在手机 Java 壳里。启动流程总览整个启动链路可以概括为一条流水线StartupActivityJava→ 权限申请 → 资源安装 →OBLNativeActivityNativeActivity→libblender.soC→ Blender 引擎初始化 → 事件循环渲染两个模块分工清晰app 模块Java 壳 C Native 层负责启动、权限、窗口和引擎加载OBLFiles 模块打包了 Blender 运行所需的全部资源文件Python 库、脚本、字体、图标等负责把 assets 资源安装到手机存储。下面按启动顺序逐步拆解。10 个关键步骤详解步骤1系统定位启动入口 StartupActivity在 AndroidManifest.xml 中StartupActivity被声明为android.intent.action.MAINLAUNCHER即点击桌面图标后系统启动的第一个 Activity而真正的引擎界面OBLNativeActivity只是普通 Activity由前者跳转打开见 AndroidManifest.xml。这种先过一遍准备逻辑再进主界面的双 Activity 结构是 Android 移植大型 C 引擎的常见做法——把权限、文件这类耗时且可能失败的操作挡在主界面之外。步骤2Splash 启动画面与全屏初始化StartupActivity.java 的onCreate做了两件事调用ScreenUtils.fullScreen()隐藏状态栏和导航栏进入沉浸式全屏加载 activity_startup.xml 布局中央显示splash.png启动图给用户一个正在加载的视觉缓冲。随后通过Handler.postDelayed延迟1500 毫秒才发出第一条权限消息——这个延迟正是 Splash 画面能稳定展示的时间窗口。步骤3存储权限申请Android 11 双策略适配这是新手最容易困惑的一步。Blender 需要读写我的文件来打开/保存.blend工程因此必须申请存储权限且 StartupActivity.java 针对不同系统版本采用了两套策略系统版本权限类型申请方式Android 11API 30R及以上所有文件访问权限Environment.isExternalStorageManager()检查未授权则跳转系统设置页ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONAndroid 10 及以下WRITE_EXTERNAL_STORAGE弹窗 ActivityCompat.requestPermissions运行时申请对应权限声明见 AndroidManifest.xmlMANAGE_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE三者齐备。如果用户拒绝授权APP 会 Toast 提示存储权限获取失败,不能保存文件但仍会继续后续流程只是无法保存文件。步骤4网络权限检查存储权限通过后Handler 收到MSG_ID_INTERNETPERMISSION消息用ContextCompat.checkSelfPermission检查INTERNET权限见 StartupActivity.java。由于INTERNET是安装时即授予的普通权限这里基本只做确认随后立即进入资源安装环节。步骤5资源安装assets → 手机存储增量复制这是启动流程中耗时最长的一步。InstallOBLFiles.java 将 APK 内 assets 中的 Blender 资源复制到两个目标目录Home 目录外部存储/com.epai.oblender/examples、Desktop、Documents、Downloads、Music、Pictures、Videos——模拟桌面系统的用户文件区Blender 的文件浏览器就指向这里Config 目录APP 内部 files 目录pythonPython 3.11 运行时、4.0数据文件/图标/字体、scriptsPython 脚本、usd——引擎运行必需的配置区。两个目录的完整路径由 FileUtils.java 的getExternStorageDir计算外部存储不可用时自动降级到内部存储并自动mkdirs创建目录。增量复制设计copyAssetFolder发现目标文件夹已存在就直接跳过InstallOBLFiles.javacopyAsset用createNewFile的返回值判断文件是否已存在——所以只有首次启动会完整复制几百 MB 资源之后每次启动都是秒过。这就是为什么第二次打开 APP 明显更快的原因。步骤6跳转 OBLNativeActivity 并传递路径参数一切就绪后StartupActivity.java 构造 Intent 把HomePath、ConfigPath两个字符串传给OBLNativeActivity然后finish()关闭 Splash 页面。注意一个细节如果启动来源是Intent.ACTION_SEND从其他 APP 分享文件进来会跳过资源复制直接进建模页避免重复 IO。步骤7加载 libblender.so 并启动 Native 线程OBLNativeActivity继承自系统NativeActivity类头部静态块执行System.loadLibrary(blender)见 OBLNativeActivity.java。这个libblender.so就是由 CMakeLists.txt 以SHARED方式构建、链接了整套 Blender 静态库的巨型动态库。而NativeActivity的精髓在于 AndroidManifest.xml 里这行元数据meta-data android:nameandroid.app.lib_name android:valueblender /系统框架会自动 dlopen 该库并在新开的 Native 线程中调用 C 函数android_main()——Java 与 C 两条世界从此并行运转。步骤8JNI 建立双向回调桥initialNative 线程跑起来之前Java 侧onCreate里调用的initial(strHomePath, strConfigPath)先把两个存储路径传给 C见 OBLNativeActivity.java。JNI 实现 android_native_app_glue.cc 中这个函数做了关键铺垫对 Activity 对象取NewGlobalRef防止被 GC 回收缓存showWindow、GetAsyncKeyState、SetValue、getClipboard、putClipboard等方法 ID——之后 C 引擎需要弹设置面板、呼出软键盘、读写剪贴板时就能通过反向 JNI直接回调这些 Java 方法无需每次查找。这是Java 管 UI、C 管引擎架构的桥梁所在。步骤9窗口创建触发 Blender 全量子系统初始化C 侧android_mainnative-lib.cpp注册了命令回调engine_handle_cmd并进入ALooper_pollAll事件循环。当 Android 窗口就绪、收到APP_CMD_INIT_WINDOW命令时触发engine_init_displaynative-lib.cpp完成三件大事日志落地freopen把 stderr 重定向到 Home 目录的error.log引擎日志写入log.log方便排查问题注入环境变量BLI_setenv设置HOME、BLENDER_SYSTEM_DATAFILES指向4.0/config/datafiles、BLENDER_SYSTEM_SCRIPTS、PYTHONPATH/PYTHONHOME等让引擎找到步骤5安装好的资源引擎初始化以{blender, -d}参数调用 creator.cc 的mainBlenderInitial。mainBlenderInitial就是桌面版 Blender 的main()函数体依次完成日志系统CLG_init、上下文CTX_create、线程 API 初始化、DNA/RNA 系统注册、渲染引擎RE_engines_initCycles/Eevee、窗口管理器WM_init、键位配置最后调用Wm_loop_pre准备进入主循环creator.cc。步骤10Native 事件循环驱动每帧渲染初始化完成后isInitial置为 trueandroid_main的循环从等待事件切换为每帧调用engine_draw_framenative-lib.cppengine_draw_frame → mainBlenderLoop → Wm_loop(事件处理 重绘)渲染窗口则由 Java 侧WindowGLSurfaceView提供Surface 创建/销毁时通过updateSurfaceJNI 更新 C 的ANativeWindowandroid_native_app_glue.cc。C 引擎打开子窗口如左上角设置面板时再反向调用 Java 的showWindowOBLNativeActivity.java至此一个完整可交互的 Blender 建模界面呈现在手机上。核心文件速查表环节文件路径说明启动入口声明AndroidManifest.xml权限声明、LAUNCHER 入口、lib_name 元数据权限与 SplashStartupActivity.java四段式 Handler 状态机资源安装InstallOBLFiles.javaassets 增量复制到 Home/Config路径工具FileUtils.java内外存储选择与目录创建Native 主界面OBLNativeActivity.javaNativeActivity 反向回调 UINative 入口native-lib.cppandroid_main 事件循环与显示初始化JNI 桥接android_native_app_glue.ccinitial/updateSurface 等 JNI 实现引擎初始化creator/creator.ccBlender main() 逻辑移植总结这套启动设计妙在哪✅失败前移权限、资源等可能失败或耗时长的操作全部放在 Splash 阶段主界面只做点亮引擎✅状态机驱动Handler 消息枚举MSG_ID_PERMISSION → INTERNETPERMISSION → COPYFILE → STARTACTIVITY让每一步跳转清晰可追踪✅增量安装首次全量复制、后续秒开兼顾了大体积资源与启动速度✅双向 JNI 桥Java 持有引擎 UI 能力窗口/键盘/剪贴板C 持有事件与渲染能力各司其职。理解这 10 个步骤后你就可以在 Doc/编译流程_cn.txt 的指引下完整编译并运行这个把 Blender 装进口袋的 APP 了。赞分享【免费下载链接】APP-android_arm64项目地址https://gitcode.com/gh_mirrors/ap/APP-android_arm64点击查看免费下载相关推荐dlssg-to-fsr3完全指南从下载到安装的10个关键步骤dlssg to fsr3完全指南从下载到安装的10个关键步骤 dlssg to fsr3是一个革命性的游戏模组能够将Nvidia DLSS G帧生成技术替游戏开发图形学SyncTrayzor完整发布流程指南从源码到安装程序的10个关键步骤SyncTrayzor完整发布流程指南从源码到安装程序的10个关键步骤 SyncTrayzor是Windows平台上一款优秀的Syncthing托盘工具和文件桌面应用Android应用安全加固10个关键步骤保护App数据安全Android应用安全加固10个关键步骤保护App数据安全 在当今移动应用蓬勃发展的时代Android应用安全加固已成为每个开发者必须掌握的技能。随着用户隐文档教程知识库上一篇Everything Claude Code 规则架构详解如何按需安装通用与语言特定规则下一篇不碰 git 历史的撤销魔法:Context Shadow 恢复点系统完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询