windows 10是如何做到全平台统一的?
1、EXE本身就是个容器,它可以在ARM平台上包含ARM的native code执行,也可以在x86平台上包含x86的native code执行,本质上无差别(所以麻烦那些说EXE不能在ARM平台上运行的同学自删答案可以吗?)。
2、APPX文件里并不包含字节码,而是各种架构的native code的混合物,微软确实想用.net的字节码来统一天下,但现在大部分APPX文件都是native code。
-------------------------正文-------------------------
从原理上说,一个操作系统能同时在不同的平台上运行“相同”(注意引号)的代码,无非有两种形式:
1、学Java那样,做字节码,然后解释执行,只需要在不同平台上做好解释器即可;
2、如果要同时支持x86平台和ARM平台,那么就同时发布两个版本的二进制文件,然后封装到一起就好了;
你们觉得微软会那种方式呢?
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
当然是第二种了!微软自古以来兼容性的包袱都非常,你们以为微软可能会彻底从写一个平台把上万个WindowsAPI用Java或者别的什么语言重新封装一次?别做梦了。
你们以为Windows能在ARM上运行肯定是微软搞了什么黑科技吧?其实只不过是把目标文件设置成ARM格式然后重新把Windows编译一遍而已,arch相关的部分要重新实现一下就OK了。也就是说在ARM上运行的Windows,用的就是ARM的硬件指令,根本没有什么黑科技。N年前就有人试过,把Windows改成Java的话效率会降低到原来的三分之一(不对这句话真实性负责)。
然后有人会举手提问说:唉?不对啊,Windows不是出了一种新的格式叫APPX吗?不是号称这种格式跨平台吗?好吧,让我们来揭开APPX文件格式的神秘面纱:
APPX在维基百科(APPX)上的解释如下:
APPX is the file format used to distribute and install application software and middleware for Windows Store apps applications in Windows 8 and beyond.[1] It also replaces the XAP file format on Windows Phone, from version 8.1, in an attempt to unify the distribution of applications for Windows Phone and Windows 8.[2]
其中侧栏特意标注了一下:
Type of format: Package management system, file archive
明白了吗?APPX本质就是一个打包好的可执行文件的容器,这个容器里你放什么东西都行。还不相信?那我举例来证明,我刚到某手机论坛上下载了一个破解的WP应用,刚下载下来是这样的:
看我用7-zip把它解压:
果然有appx文件:
继续解压APPX:

看看这是什么啊:
APPX里解压开以后有一堆资源文件和一个EXE,还有几个DLL!
打开这个EXE看看真相吧:

居然连Dos Stub头都有。
注意在偏移量0x100的地方有个PE头的东西,0x104位置上是0x01C4,这是什么东西呢?在微软的SDK里是有解释的:
这个位置两个字节表示机器类型,而0x01c4也找到了解释:
0x01c4 - ARMv7 (or higher) Thumb mode only
这里有更多的机器类型的编码:windows - Check if exe is 64-bit
也就是说,其实EXE可执行文件(准确的说应该叫PE)是可以封装任何平台的机器码的,不管是ARM还是x86,根据SDK里的说法,实际上还可以支持MIPS、SH、PPC、alpha等。一个编译成ARM平台的EXE文件,运行在ARM手机上,完全没有问题。
EXE是跟平台无关的,谁说EXE只能在x86上运行?
所谓能在ARM上运行的APPX,就是先用编译器把游戏重新编译一下,生成ARM平台的可执行文件,这个可执行文件再用APPX打包换个名字就OK了,但这个可执行文件根本不能在x86上跨平台运行:

。
。
。
。
。
说好的跨平台呢?
。
。
。
。
其实真正的跨平台是这样的,如果一个APPX想跨平台,开发者要同时编译ARM平台和x86平台两种目标文件,生成两个EXE,一个在ARM上跑,一个在x86上跑,然后把两个EXE同时打包到同一个APPX里。
于是这样就跨平台了。
其实就是发布两个不同的版本嘛。
APPX跨平台的格式:
这样APPX就可以同时在两个平台上使用了。
是不是很机智呢?

所以,大家可以洗洗睡了,根本不存在真正的跨平台。
---------------------补充---------------------
有人说安卓apk里也有native code,不能证明有native code就一定没有别的,问题是:
1、APPX里没别的东西,只有一个EXE文件,那么代码只能是在EXE文件里。
2、EXE的Header里标注的整个EXE是ARMv7的native code,那么请问如果有字节码,那么字节码放到什么地方?
下面还有一个截图,另一个APPX解压的效果:

请问字节码藏在哪里?
当然,我不排除ARM平台EXE里有某些section是字节码,但整体就是一个ARMv7的PE文件。
况且,C#反编译出来是这样的:

APPX里的EXE反编译出来是这样的:

别跟我说这是一种东西,别跟我说后面的那种也是字节码。
------------------一下内容写给不懂跨平台开发的同学------------------
跨平台开发并不是说有两套代码,代码实际上只有一套,编译的时候选择目标文件是多个平台即可。
也就是说,编译的时候费点时间,开发的时候并不怎么区分平台:

全选上就是了。
---------------------再补充---------------------
有人觉得这样会不会安装包变大?实际上大不了多少。
软件占地方的都是各种资源,真正的code部分其实很小,根据我解压的内容可以看到,EXE不是最大的,最大的都是各种资源,APPX做到code和资源分离,这样就够了。一个游戏上GB,大部分都是贴图、声音、视频这些东西。
Win10所谓的统一,更像是统一API,要知道在之前,并非所有API都是完全一样的,如果API不一样,跨平台想用一套代码基本不可能。
references:
http://www.zhihu.com/question/29642139
windows 10是如何做到全平台统一的?的更多相关文章
- 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸
[源码下载] 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸 作者:webabcd 介绍背水一战 Windows 10 之 UI 窗口全屏 窗口尺寸 示例1.窗口全屏UI/F ...
- 【Xamarin 挖墙脚系列:Windows 10 一个包罗万象的系统平台】
build2016 结束后,证实了微软之前的各种传言.当然,都是好消息. Windows10 上基本可以运行主流的任意的操作系统. Windows Linux(在内部版本143216中,支持了bash ...
- 基于Windows 10平台的PM2.5检测器制作
本篇文章详细讲解了如何利用SDS011激光式PM2.5传感器.HC-06蓝牙模块和Windows 10设备完成一个简单的PM2.5检测器及其应用程序的开发.该检测器使用蓝牙完成数据输出,方便设备连接, ...
- XMind ZEN 2020 (10.0.2) 全平台 完美破解版(ubuntu)
XMind ZEN 2020 (10.0.2) 全平台 完美破解版(ubuntu) https://www.ghpym.com/xmindzen.html/comment-page-8?replyto ...
- [深入浅出Windows 10]不同平台设备的适配
2.3 不同平台设备的适配 Windows 10通用应用程序针对特定的平台还会有一个子API的集合,当我们要使用到某个平台的特定API的时候(比如手机相机硬件按钮触发事件),这时候就需要调用特定平台的 ...
- Windows 10 IoT Serials 8 – 如何改变UWP应用的目标平台
Windows Insider计划直接加速了Windows系统的迭代,缩短了系统发布的周期.就Windows 10 IoT Core而言,迭代的速度和Windows 10 for PC.Windows ...
- Windows 10环境安装VIM代码补全插件YouCompleteMe
Windows 10环境安装VIM代码补全插件YouCompleteMe 折腾一周也没搞定Windows下安装VIM代码补全插件YouCompleteMe,今天在家折腾一天总算搞定了.关键问题是在于P ...
- 【“10”力全开 游戏“Ti”厉害】ZX53VE-新飞行堡垒笔记本(Windows 10 Home/新七代标压i7-7700HQ/GTX 1050Ti 4G/8G内存/1TB+128GB)
[“10”力全开 游戏“Ti”厉害]ZX53VE-新飞行堡垒笔记本(Windows 10 Home/新七代标压i7-7700HQ/GTX 1050Ti 4G/8G内存/1TB+128GB) http: ...
- 可能是目前市面上唯一能够支持全平台的RTMP推流组件:Windows、Linux、Android、iOS、ARM
EasyRTMP是什么? EasyRTMP是一套RTMP直播推送功能组件,内部集成了包括:基本RTMP协议.断线重连.异步推送.环形缓冲区.推送网络拥塞自动丢帧.缓冲区关键帧检索.事件回调(断线.音视 ...
随机推荐
- Java程序打包
包名为 com.longneo.data,主程序入口为:com.longneo.data.AppMain 1.到工程目录下 /bin 执行 jar -cvf Demo.jar com 执行完之后会生成 ...
- windows 消息机制的学习
概述 链接1:http://www.cppblog.com/suiaiguo/archive/2009/07/18/90412.html 链接2:http://www.cnblogs.com/find ...
- 微信小程序简易教程
刚接触到微信小程序开发,这里做一个简单的教程: 1. 获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的"设置"-"开 ...
- jquery中prop()方法和attr()方法的区别(转)
jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了pro ...
- 手工释放Linux内存
转载自:http://blog.csdn.net/wyzxg/article/details/7279986/ linux的内存查看: [root@localhost 0.1.0]# free -m ...
- spring05配置文件之间的关系
一:配置文件包含关系 1.创建对应的实体类 public class Student { //学生实体类 private String name; //姓名 private Integer age; ...
- SQL 去除小数点后无效 0 的方法
select convert(float,10.0000) 就是这么简单
- vim 学习笔记
vim介绍:一款编辑器,另外一般linux系统会自带,所以一般linux下日志.配置文件等 纯文本文件的修改编辑等通过vim操作 学会的好处:1 方便操作linux下日志.配置文件等纯文本文件 2 功 ...
- QT 5.1.1 for Android 开发环境搭建与配置【Windows 7】
前言:本人操作系统为Windows7 64位,用的是32位的安装包,32位系统没有验证. 一.首先下载以下安装包,如果提供的链接失效请自行下载: (1) Android SDK (Windows 32 ...
- $this->success('注册成功!');
使用在控制器中,不是使用再模板中的