应用启动流程 Window创建流程 安卓系统启动流程(待补充)

1.点击app的启动图标时,Launcher进程通过Binder 向System_Server(AMS)发起startActivity请求,

2.System_Server进程(AMS)接受请求后,通过Socket方式向Zygote进程发送创建进程请求,然后Zygote进程通过Socket方式fork创建出一个新的APP进程分配给该应用;(只有和Zygote进程相关的用到了Socket通信)

为什么Zygote通信为什么用Socket,而不是Binder?

先后时序问题

虽然Zygote更晚创建,但是不能保证通过Zygote进程去注册binder的时候,ServiceManager已经初始化好了(参考Binder C/S原理)。注册时间点无法保证,AMS无法获取到Zygote的binder引用,这是原因。

(附上开机到Launcher启动图)

3.APP进程通过Binder向System_Server(AMS)发起attachApplication请求,然后System_Server(AMS)再返回来给App进程发送scheduleLaunchActivity请求,告诉ActivityThread通过反射方式启动main方法,开启消息循环loop;以及告诉ActivityThread##H(Handler) 来反射启动创建Application 实例同时回调onCreate等方法,之后依次创建和初始化Application类,调用performLaunchActivity创建MainActivity类,加载主题样式Theme中背景等属性;然后再inflate布局,当oncreate/onstart/onresume方法都走完了之后,最后才对contentview进行measure/layout/draw显示再界面上,到此,应用的第一次启动才算完成;

4. 同时Laucher进程也会调用onPause暂停

总结上述app启动流程:

Application构造器方法--->Application中attachBaseContext()---> Application中的contentProvider初始化 ---> Application中onCreate()--->Activity构造方法--->onCreate()--->配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。

在onCreate中设置layout布局 创建window,在onResume中关联window测量绘制布局并显示window;

oncreate创建window,onresume显示window;

Window创建流程:

onCreate: 在上面调用了handlerLanchActivity之后,在创建Activity的同时并在里面新建了一个PhoneWindow对象和DecorView对象同时获取到WindowManager,WindowManger负责和WMS进行Binder通信

onResume: 调用了Activity.makeVisible()后会创建一个ViewRootImpl,然后将Decorview传入并被ViewRootImpl管理,同时将Window和WMS关联起来,比如DecorView的添加移除等view逻辑事件操作都是ViewRootImpl管理;ViewRootImpl实现了ViewParent这个接口,接口中常见方法requestLayout(),其实是调用了ViewRootImpl;所以当View的ViewParent都是同一个时,可理解为这些View都在一个View链上,invalidate的时候会将整个viewtree遍历刷新一遍;

优化应用启动时间:

1.在Application类中的构造器/attachBaseContext/onCreate方法中不要进行耗时操作;

2.如果在Activity类中对sp进行初始化,由于sp的特性会把数据全部读出来并放在内存里,所以大文件的sp初始化可以放在异步线程中处理而不放在主线程中;

3.对于Activity类初始化,因为计算启动时间是到获取第一帧截至,所以尽量减少布局层次性,以及onCreate、onStart、onResume方法中避免做耗时操作;

热启动:

上述时冷启动应用的流程,热启动是针对按下back键、home键,仍保留了应用的后台的情况,所以会从已有的进程中来启动应用,所以热启动就不会重新fork进程、创建和初始化Application,而是直接进行MainActivity的初始化

 使用ActivityManager API时调用AMS服务的原理:

Android中Activity Manager相关类继承层次关系

       看一下类结构图如下:    

  IActivityManager作为ActivityManagerProxy和ActivityManagerNative的公共接口,所以两个类具有部分相同的接口,可以实现合理的代理模式;ActivityManagerProxy代理类是ActivityManagerNative的内部类;ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService(系统Service组件)

这里涉及两个过程

  代理对象建立:ActivityManagerProxy代理对象的创建;

  程序执行过程:如何通过代理对象来执行真正对象请求;

  从图中可以看出代理类:使用ActivityManagerProxy代理类,来代理ActivityManagerNative类的子类ActivityManagerService;ActivityManagerService是系统统一的Service,运行在独立的进程中;通过系统ServiceManger获取;

  ActivityManager运行在一个进程里面,ActivityManagerService运行在另一个进程内,

对象在不同的进程里面,其地址是相互独立的;实现跨进程的对象访问,需要对应进程间通信的规则,此处是采用Binder机制实现跨进程通信;所以此处的Proxy模式的运用属于:远程代理(RemoteProxy)

代理实现过程

1 代理对象建立

       是在ActivityManager的getRunningServices执行时就需要代理类来执行;

  public List<RunningServiceInfo> getRunningServices(int maxNum)

    return ActivityManagerNative.getDefault()

      getServices(maxNum, 0);

  }

  继续看看ActivityManagerNative.getDefault()到底干了什么事:

  实际上是关乎到Singleton<IActivityManager>类型的gDefault对象创建;

private static final Singleton<IActivityManager> gDefault = new
       Singleton<IActivityManager>() {
      protected IActivityManager create() {
      IBinder b = ServiceManager.getService("activity");
      IActivityManager am = asInterface(b);
      return am;
  }
};

ServiceManager.getService("activity");获取系统的“activity”的Service, 

所有的Service都是注册到ServiceManager进行统一管理。

  这样就创建了一个对ActivityManagerService实例的本地代理对象ActivityManagerProxy实例。Singleton是通用的单例模板类。

       ActivityManagerNative.getDefault就返回一个此代理对象的公共接口IActivityManager类型,就可以在本地调用远程对象的操作方法。

2 执行过程

       这个执行过程就设计到ActivityManager框架的执行流程;简单看一下这个getServices的执行过程。

  此图表明整个Client对Service的访问是通过Service的代理对象Proxy进行访问的。

Android中对Service访问的模式都是以Client/Server模式进行;Client实际上访问Service是通过对Service的建立代理的Proxy对象进行访问的——代理模式。

<think>嗯,用户之前问过关于.NET Core开发Windows窗体应用的问题,现在又转向Avalonia开发macOS应用,可能他们现在需要跨平台的支持,或者有扩展应用场景的需求。用户可能是开发者,可能在考虑将现有的Windows应用迁移到macOS,或者开发新的跨平台桌面应用。我需要先确认Avalonia的基本情况,以及它在macOS上的开发流程。 首先,Avalonia是一个跨平台的UI框架,支持.NET,可以在macOS、Linux、Windows上运行。用户之前使用的是WinForms,但WinForms只能在Windows上使用,所以他们可能需要跨平台解决方案。这时候推荐Avalonia是合理的。 接下来,用户需要具体的步骤,比如环境准备、项目创建、核心代码示例等,类似之前回答的结构。需要注意macOS特有的配置,比如安装.NET SDK、Avalonia模板,以及可能的依赖项,比如Cocoa或XQuartz。同时,部署发布部分需要说明如何打包为macOS应用,比如dmg或pkg文件。 可能用户还会关心与WPF的对比,或者与之前提到的WinForms的区别,所以在技术对比部分需要更新表格,突出Avalonia的跨平台能力。另外,集成ASP.NET Core的部分是否适用,可能需要补充在macOS环境下调用Web API的注意事项。 还要注意用户是否了解XAML,因为Avalonia使用XAML,而WinForms不用,可能需要简要说明。另外,MVVM模式的支持,是否有学习曲线的问题,是否需要推荐相关资源或文档。 最后,需要检查是否有最新信息,比如.NET版本推荐,是否Avalonia支持.NET 8,以及部署时的自包含选项,确保回答的准确性和及时性。可能还需要提到调试和测试在macOS上的工具,比如Visual Studio for Mac或Rider的支持情况。</think>以下是为您整理的Avalonia开发macOS应用的完整指南(2023年最新实践): --- ### 一、Avalonia核心优势 $$ \text{Avalonia} = \text{跨平台UI框架} \times \text{.NET支持} \times \text{XAML语法} $$ - 真正跨平台:支持Windows/macOS/Linux/iOS/Android - 类WPF开发体验:相似度≈85%(对比WPF) - 成熟生态:支持MVVM、依赖注入、热重载等 --- ### 二、开发环境搭建 1. **macOS必备组件** ```bash # 安装.NET SDK(推荐7.0+) brew install --cask dotnet-sdk # 安装Avalonia模板 dotnet new install Avalonia.Templates ``` 2. **IDE选择** - Visual Studio for Mac(即将退役,不推荐) - JetBrains Rider(商业版,推荐) - VS Code + Avalonia扩展(免费方案) 3. **依赖项检查** - 确保Xcode命令行工具已安装 ```bash xcode-select --install ``` --- ### 三、创建首个macOS应用 1. **项目初始化** ```bash dotnet new avalonia.mvu -o MyMacApp cd MyMacApp dotnet restore ``` 2. **项目结构解析** ```text Views/ # XAML界面文件 ViewModels/ # MVVM模式视图模型 Services/ # 业务逻辑层 Assets/ # 资源文件(图标/图片等) ``` 3. **跨平台XAML示例** ```xml <Window xmlns="https://github.com/avaloniaui"> <StackPanel> <TextBlock Text="欢迎使用Avalonia macOS版" FontSize="20"/> <Button Content="点击获取系统信息" Command="{Binding GetInfoCommand}"/> <Image Source="/Assets/mac_icon.png" Width="100"/> </StackPanel> </Window> ``` --- ### 四、macOS专属功能实现 1. **调用原生API** ```csharp // 使用P/Invoke访问macOS API [DllImport("/usr/lib/libSystem.dylib")] private static extern int sysctlbyname(string name, IntPtr oldp, IntPtr oldlenp, IntPtr newp, uint newlen); public static string GetMacModel() { var size = IntPtr.Zero; sysctlbyname("hw.model", IntPtr.Zero, ref size, IntPtr.Zero, 0); // 后续处理... } ``` 2. **菜单栏定制** ```xml <NativeMenuBar.Menu> <NativeMenu Title="应用"> <NativeMenuItem Header="关于" Command="{Binding ShowAboutCommand}"/> <NativeMenuItemSeparator/> <NativeMenuItem Header="退出" Command="{Binding ExitCommand}"/> </NativeMenu> </NativeMenuBar.Menu> ``` --- ### 五、调试与部署 1. **开发模式运行** ```bash dotnet run --framework net7.0-maccatalyst ``` 2. **发布独立应用** ```bash dotnet publish -c Release -r osx-x64 / osx-arm64 ``` - 生成`.app`包(支持Apple Silicon) 3. **打包为安装包** ```bash # 使用create-dmg制作macOS安装镜像 brew install create-dmg create-dmg MyApp.app ``` --- ### 六、关键技术对比 | 特性 | Avalonia | Xamarin.Mac | Electron | |---------------------|---------------|---------------|---------------| | 安装包大小 | 30-50MB | 80-120MB | 150MB+ | | 内存占用 | 低 | 中 | 高 | | 原生API调用能力 | ★★★★☆ | ★★★★★ | ★★☆☆☆ | | 跨平台代码复用率 | 95%+ | 60% | 100% | --- ### 七、最佳实践建议 1. **架构选择** $$ \text{MVVM模式} + \text{ReactiveUI} = \text{高维护性架构} $$ 2. **性能优化技巧** - 使用`Virtualization`处理长列表 - 避免在UI线程执行耗时操作 - 启用AOT编译减小体积 ```xml <PublishAot>true</PublishAot> ``` 3. **推荐工具链** - 界面设计:Avalonia Designer(预览版) - 图标生成:Image Asset Studio - 崩溃分析:Sentry for .NET --- **最新趋势**(2023年): - Avalonia 11 支持Metal渲染引擎 - .NET 8 显著提升macOS应用启动速度 - 推荐使用MAUI+Avalonia混合方案实现跨移动/桌面端
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值