1.å¦ä½è®¾ç½®ç³»ç»å¯ä¸ç launcher
2.yarn源码分析(四)AppMaster启动
3.KubeVirt网络源码分析
4.3D月光宝盒游戏机模拟器方案源码项目解析(1)
å¦ä½è®¾ç½®ç³»ç»å¯ä¸ç launcher
ããå®ä¹ä¸ä¸ªç§æçfilteré项ï¼ç¶åç¨è¿ä¸ªé项æ¥è¿æ»¤HOME.
ããä¸è¬æ åµä¸æ们使ç¨Manifestä¸å®ä¹ç<category android:name="android.intent.category.HOME"æ¥è¿æ»¤çï¼
ããæ们ç°å¨å¢å ä¸ä¸ªç§æçHOME_FIRSTè¿æ»¤ã
ããå¨Intent.java(frameworks/base/core/java/android/content/Intent.java)ä¸æ·»å 两è¡ä»£ç
ãã//lixinso:æ·»å CATEGORY_HOME_FIRST
ãã@SdkConstant(SdkConstantType.INTENT_CATEGORY)
ããpublic static final String CATEGORY_HOME_FIRST = "android.intent.category.HOME_FIRST";
ãã3ï¼ä¿®æ¹åCATEGORY_HOMEç¸å ³çææçå°æ¹ï¼é½æ¹æHOME_FIRSTï¼ä¸»è¦æ¯frameworkä¸çè¿å 个å°æ¹ï¼
ããframeworks/base/services/java/com/android/server/am/ActivityManagerService.javaä¸
ãã//intent.addCategory(Intent.CATEGORY_HOME);
ããæ¹æintent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso:
ãã//if (r.intent.hasCategory(Intent.CATEGORY_HOME)) {
ããæ¹æif (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST
ããframeworks/base/services/java/com/android/server/am/HistoryRecorder.javaä¸
ãã// _intent.hasCategory(Intent.CATEGORY_HOME) &&
ããæ¹æ _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST
ããframeworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.javaä¸
ãã//mHomeIntent.addCategory(Intent.CATEGORY_HOME);
ããæ¹æ mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso
ããframeworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.javaä¸
ãã//new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),码解0);
ããæ¹æ new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso
ããframeworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.javaä¸
ãã//mHomeIntent.addCategory(Intent.CATEGORY_HOME);
ããæ¹æ mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso
ããframeworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.javaä¸
ãã//ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
ããæ¹æ ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso
ãã4) åä¸ä¸ªèªå·±çLauncher.
ããå¯ä»¥åèandroid sampleä¸çLauncherï¼æè androidæºä»£ç ä¸ç /packages/apps/Launcher æ¥åã
ããå¨Launcherä¸æ è®°å ¶æ¯ä¸æ¯Launcherçæå ³é®ç代ç æ¶Manifestä¸çfilter:android:name="android.intent.category.HOME"
ããç°å¨æ们å®ä¹äºèªå·±çfilter,é£ä¹ï¼æ们å¨æ们èªå·±åçLauncherä¸å°Manifestæ¹ä¸ºï¼
ãã<application android:process="android.process.acore3" android:icon="@drawable/icon" android:label="@string/app_name">
ãã<activity android:name=".FirstAppActivity"
ããandroid:label="@string/app_name">
ãã<intent-filter>
ãã<action android:name="android.intent.action.MAIN" />
ãã<category android:name="android.intent.category.HOME_FIRST" />
ãã<category android:name="android.intent.category.DEFAULT" />
ãã<category android:name="android.intent.category.MONKEY" />
ãã</intent-filter>
ãã</activity>
ãã</application>
ããç¶åå°ç¼è¯å¥½çapkæ¾å°/out/target/product/generic/system/appç®å½ä¸ã
ãã5)å°Androidèªå¸¦çLauncherå é¤æï¼å æ¬æºä»£ç (packages/apps/Launcher)åapk(/out/target/product/generic/system/app/Launcher.apk)ã
ãã6)
ããåå®è¿äºå·¥ä½ï¼å°±å¯ä»¥éæ°ç¼è¯Androidäºï¼æ们å¯ä»¥ç¼è¯ä¿®æ¹è¿çå 个ç¸å ³çå ã
ããå¦æä¹åç¼è¯è¿äºAndroidæºç ï¼å¯ä»¥ç¨mmmå½ä»¤æ¥ç¼è¯é¨åçæ¹å¨ã
ããè¿ééè¦è¿æ ·ç¼è¯ï¼
ãã$ . build/envsetup.sh
ãã$ mmm frameworks/base
ãã$ mmm frameworks/base/services/java
ãã$ mmm frameworks/policies/base/mid
ãã$ mmm frameworks/policies/base/phone
ãã7)
ããç¼è¯å®æåéæ°çæimgæ件ã
ãã$ make snod
ãã8) ç°å¨å¯ä»¥å¯å¨Android模æå¨æ¥çææäºã
ããé¦å 设置ç¯å¢åéï¼
ãã$ export ANDROID_PRODUCT_OUT= ./out/target/product/generic
ããç¶ååæ¢å°
ãã$ cd ./out/host/linux-x/bin
ããè¿è¡
ãã$ ./emulator
ããè¿æ ·æ们å¯å¨ç模æå¨éé¢ç¨çimageå°±æ¯æ们åæç¼è¯å¥½çèªå·±å®å¶çä¸è¥¿äºã
ããä»æ¨¡æå¨ä¸å¯ä»¥çå°å¯å¨çLauncheræ¯æ们èªå·±çLauncherï¼ä¸ä¼åºç°é»è®¤çLauncheräºï¼ä¹ä¸ä¼åºç°éæ©çé¢ã
yarn源码分析(四)AppMaster启动
在容器分配完成之后,启动容器的码解代码主要在ContainerImpl.java中进行。通过状态机转换,码解container从NEW状态向其他状态转移时,码解会调用RequestResourceTransition对象。码解RequestResourceTransition负责将所需的码解无源码hook资源进行本地化,或者避免资源本地化。码解若需本地化,码解还需过渡到LOCALIZING状态。码解为简化理解,码解此处仅关注是码解否进行资源本地化的情况。
为了将LAUNCH_CONTAINER事件加入事件处理队列,码解调用了sendLaunchEvent方法。码解该事件由ContainersLauncher负责处理。码解网页滚动字源码ContainersLauncher的码解handle方法中,使用一个ExecutorService(线程池)容器Launcher。ContainerLaunch实现了Callable接口,其call方法生成并执行launch_container脚本。以MapReduce框架为例,该脚本在hadoop.tmp.dir/application name/container name目录下生成,其主要作用是启动MRAppMaster进程,即MapReduce的ApplicationMaster。
KubeVirt网络源码分析
在KubeVirt的网络架构中,virt-launcher与虚拟机之间建立了一对一的对应关系,即在每个pod中运行一台虚拟机。本文将聚焦于网络组件的分析。
下图展示了KubeVirt的安装源码包nginx网络体系,三个实线框表示从外到里依次为:Kubernetes工作节点、工作节点上的POD、以及POD中运行的虚拟机。三个虚线框从下到上分别为:Kubernetes网络(Kubernetes CNI负责配置)、libvirt网络,以及虚拟机网络。本文仅关注libvirt网络与虚拟机网络。
在kubevirt中,LibvirtDomainManager类的preStartHook方法在虚拟机启动前执行,通过调用SetupPodNetwork方法为虚拟机准备网络环境。
SetupPodNetwork方法执行三个关键步骤,分别对应discoverPodNetworkInterface、preparePodNetworkInterfaces和StartDHCP方法。从源码分析pcbdiscoverPodNetworkInterface方法收集pod的网络接口信息,包括IP和MAC地址。这些信息将通过DHCP协议传递给虚拟机。为确保虚拟机能接收这些信息,preparePodNetworkInterfaces方法对容器网络进行相应调整。
此方法会启动一个只提供一个DHCP客户端的DHCP服务器(SingleClientDHCPServer)。DHCP服务提供给虚拟机的不仅仅是IP地址,还包括网关信息和路由信息。此过程确保虚拟机在KubeVirt环境中能够正常访问网络。
本文以KubeVirt 0.4.1版本的源码为例分析网络部分,后续将对更最新版本的KubeVirt virt-lancher网络功能进行深入探索。
3D月光宝盒游戏机模拟器方案源码项目解析(1)
月光宝盒游戏机项目历史悠久,源起于广州的商城直播网站源码硬件方案,市场反响极佳,吸引了众多开发者加入。经典的“小霸王”游戏机品牌也在此项目中出现了踪影。在京东等电商平台上,月光宝盒游戏机的销售情况表明,其成本相对较低,利润率高,显示出项目的良好前景。
解析月光宝盒项目的技术构成主要包括硬件与软件两个方面。硬件部分通常采用成熟方案,如HDMI输出设备,并配备手柄,实现游戏设备的基本功能。软件部分则涉及更为复杂的定制与集成。硬件方案通常提供基于Android的操作系统,开发者需要在此基础上构建独特的月光宝盒界面,以此作为用户启动游戏的交互平台。桌面launcher设计即是游戏菜单主界面,负责用户界面的呈现与交互。简化版的月光宝盒界面通常采用极简与metro风格,提供直观且简洁的视觉体验。
界面的直观性与美观性是设计中的关键要素,通过精心的设计,能够提升用户体验,促进项目的成功。线上项目支持在ricegame.cn等网站上下载,用户可以便捷地获取相关资源。
对于软件部分,开发团队需要聚焦于游戏模拟器的核心功能,以实现广泛的游戏支持。米饭模拟器方案是一个较为全面的选择,能涵盖街机、GBA、NES(FC)、SNES(SFC)、PS1/PSP、NDS、N、3DS、MD等多个游戏格式。这使得项目能够支持数量巨大的游戏库,提供丰富的游戏体验。如经典的游戏如“三国战记”等,支持数万游戏的模拟器成为用户游戏体验的基石。
自制模拟器或尝试不同的开源方案虽能带来一定的自定义能力,但往往需要较高的时间投入与资源成本。米饭模拟器方案则提供了一站式的解决方案,提前预见风险与成本,确保项目的稳定性和高可用性。此外,米饭模拟器还提供了全面的技术支持,从产品开发到维护阶段都能得到充分的保障。使用此类方案可以有效降低软件开发的风险与成本,同时确保项目在硬件成本方面也能达到优化。
硬件选择也是项目成本控制的重要环节。Firefly RK是一种性能与成本兼优的硬件方案,其性价比极高,支持大多数模拟器功能。使用性能优秀的硬件,能够进一步提升用户体验,但成本投入也会相应增加。
综上所述,月光宝盒游戏机项目通过集硬件与软件设计的创新,实现了成本效益的优化与用户体验的提升。无论是面向经典游戏的重现,还是追求更广泛的游戏平台支持,都能在米饭模拟器方案的加持下,实现项目的全面发展。项目团队可依据自身资源与市场需求,选择合适的硬件与软件解决方案,为用户提供丰富且优质的娱乐体验。