编辑
2026-07-03
移动端
00

目录

背景
过程验证及结论
简要图

背景

对安卓底层启动进行验证,得知其链路流转顺序,可以得知:

  1. App.java — 应用级全局初始化, 整个应用进程只初始化一次,与具体界面无关;
  2. MainActivity.java — 主界面 / 业务入口;

总结:App.java 做应用级基础设施初始化;MainActivity.java 做主界面和业务逻辑。先 App 后 MainActivity 是 Android 标准流程

过程验证及结论

已知代码: app/src/main/java/com.xiaob.remotecalibtation/App.java

java
@SuppressLint("RestrictedApi") protected void asyncInit() { Log.i(TAG, "asyncInit"); Xui.setLogLevel(XLogUtils.LOG_I_LEVEL);//日志级别 }

app/src/main/java/com.xiaob.remotecalibtation/ui/MainActivity.java

java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.at_activity_main); Log.i(TAG, "asyncInit"); }

对应用执行启动后,可以发现

sh
2026-07-03 18:23:46.298 13203-15667 remoteCalibration_App com.xiaopeng.remotecalibration I asyncInit 2026-07-03 18:23:46.437 13203-13203 MainActivity com.xiaopeng.remotecalibration I asyncInit

结论为:

js
启动顺序为什么是先 AppMainActivity 这是 Android 的正常生命周期: 进程启动 → Application.onCreate()(App.java) 再启动 Launcher ActivityActivity.onCreate()(MainActivity.java

针对App.java — 应用级全局初始化

java
@Override public void onCreate() { super.onCreate(); sAppInstance = this; isSyncInit = true; init(); } @CallSuper protected void init() { Log.i(TAG, "init"); syncInit(); if (isSyncInit) { ThreadUtils.execute(this::asyncInit); } else { asyncInit(); } }

相关信息

职责:整个应用进程只初始化一次,与具体界面无关。

syncInit()(主线程,同步)

PathManager 路径管理 Xui UI 框架 ApplicationLifecycleCallback 生命周期回调 asyncInit()(后台线程,异步)

BugHunter 崩溃/异常监控 网络模块(NetworkChannelsEntry、HttpsUtils、IHttp) 埋点(DataLogModuleEntry) 环境配置(EnvironmentConfig) 网络变化监听(ConnectionChangeReceiver) 启动 OSSUploadService、初始化 TestReporterSDK 打印版本信息 另外还提供 getInstance()、getHttp() 等全局访问入口,并在 onTerminate() 里清理 Service 和 Receiver。

针对MainActivity.java — 主界面 / 业务入口

相关信息

职责:远程标定测试的主界面,负责 UI 和业务交互。

主要工作包括:

加载布局 at_activity_main,初始化标题栏(VIN、CFC、版本、任务名、诊断状态等) 初始化 DataFileViewModel,从远端或本地加载测试任务 加载 TestCaseListFragment 展示测试用例列表 配置环境切换监听(EnvironmentConfig + RetrofitClient) 标定执行:startExecutor、interruptOperation、recoverXcpData、filterInvalidData 等 关闭前检查是否有任务在执行;onDestroy 时停止长时间 DAQ 读取

简要图

js
flowchart TD A[进程启动] --> B[App.onCreate] B --> C[syncInit: 路径/XUI/生命周期] B --> D[asyncInit 后台: 网络/埋点/Service] B --> E[MainActivity.onCreate] E --> F[UI + ViewModel + 加载任务 + Fragment] D -.->|提供全局能力| F

本文作者:lixf6

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!