面向移动终端的操作系统有:Symbian、PalmOS、Windows Phone、Linux、Android和iOS等,其中被广泛使用的是Android和iOS
Symbian
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
2008年12月2日,塞班公司被诺基亚收购。2011年12月21日,诺基亚官方宣布放弃塞班(Symbian)品牌。由于缺乏新技术支持,塞班的市场份额日益萎缩。截止至2012年2月,塞班系统的全球市场占有量仅为3%。2012年5月27日,诺基亚彻底放弃开发塞班系统,但是服务将一直持续到2016年。2013年1月24日晚间,诺基亚宣布,今后将不再发布塞班系统的手机,意味着塞班这个智能手机操作系统,在长达14年的历史之后,终于迎来了谢幕。2014年1月1日,诺基亚正式停止了Nokia Store应用商店内对塞班应用的更新,也禁止开发人员发布新应用。
Palm OS
Palm OS是一种32位的嵌入式操作系统,用于掌上电脑。此系统是3Com公司的Palm Computing 部开发的。(Palm Computing已经独立成一家公司。) Palm OS与同步软件HotSync结合可以使掌上电脑与PC机上的信息实现同步,把台式机的 功能扩展到了手掌上。一些其他的公司也获得了生产基于Palm OS的PDA的许可,如SONY公司,Handspring公司。
在2001年,基于Palm OS的掌上电脑主要是3Com的系列产品,如Palm IIIx,Palm V,Palm VII, IBM WorkPad c3用的也是Palm OS。Sony等公司也获得了Palm Computing的许可,将开发 基于Palm OS的掌上电脑。
由于推出时间早,软件丰富,Palm曾经占据了PDA市场上绝大部分的份额。但随着微软的强势介入,推出了Windows CE操作系统,以及专门针对掌上电脑的Pocket PC Edition 2002,Palm的市场份额急剧下降。但PALM联盟采取了种种应对措施,如加快开发新版本的Palm OS,增加广告宣传等,这些措施使得PALM仍然在现在的PDA市场占据了半壁江山。
根据2012年9月资料显示,最新的版本为Palm OS 5.4,具有手机功能的Palm PDA如Palm公司的Tungsten W。而Handspring公司(已被Palm公司收购)的Treo系列则是专门使用Palm OS的手机。
Windows Phone
Windows Phone(简称WP)是微软为智能手机开发的已停产的[1]移动操作系统系列。Windows Phone将微软旗下的Xbox Live游戏、Xbox Music音乐与独特的视频体验集成到了系统中。微软在该系统中使用了叫做Metro UI(后改名Modern)的新界面,完全改变了应用封装格式,所以Windows Phone 7的应用与Windows Mobile应用完全不兼容。根据官方网页,Windows Phone 7系统的主流支持已经在2014年10月24日结束,而Windows Phone 8.1系统的主流支持已经在2017年7月11日结束[2]。Windows Phone 7.5 和 Windows Phone 8的通知推送服务也在2018年2月20日关闭[3],Windows Phone 7.5 和 Windows Phone 8 将无法收到任何的通知推送,动态磁贴将不再更新,手机上的查找我的手机功能将不再可用。
2017年第一季度中,Windows Phone的市场份额仅有0.1%[4],在2018年部分国家Windows Phone的市场份额更是接近于0[5]。微软首席执行官纳德拉也表示微软的移动战略已失败
Linux
Linux是一种自由和开放源码的类UNIX操作系统。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布[5][6],在加上用户空间的应用程序之后,成为Linux操作系统。Linux也是自由软件和开放源代码软件发展中最著名的例子。只要遵循GNU 通用公共许可证(GPL),任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。大多数Linux系统还包括像提供GUI的X Window之类的程序。除了一部分专家之外,大多数人都是直接使用Linux 发行版,而不是自己选择每一样组件或自行设置。
Linux严格来说是单指操作系统的内核,因操作系统中包含了许多用户图形接口和其他实用工具。如今Linux常用来指基于Linux的完整操作系统,内核则改以Linux内核称之。由于这些支持用户空间的系统工具和库主要由理查德·斯托曼于1983年发起的GNU计划提供,自由软件基金会提议将其组合系统命名为GNU/Linux[7][8],但Linux不属于GNU计划,这个名称并没有得到社群的一致认同。
Linux最初是作为支持英特尔x86架构的个人电脑的一个自由操作系统。目前Linux已经被移植到更多的计算机硬件平台,远远超出其他任何操作系统。Linux可以运行在服务器和其他大型平台之上,如大型计算机和超级计算机。世界上500个最快的超级计算机已100%运行Linux发行版或变种[9]。Linux也广泛应用在嵌入式系统上,如手机(Mobile Phone)、平板电脑(Tablet)、路由器(Router)、电视(TV)和电子游戏机等。在移动设备上广泛使用的Android操作系统就是创建在Linux内核之上。
通常情况下,Linux被打包成供个人计算机和服务器使用的Linux发行版,一些流行的主流Linux发布版,包括Debian(及其派生版本Ubuntu、Linux Mint)、Fedora(及其相关版本Red Hat Enterprise Linux、CentOS)和openSUSE等。Linux发行版包含Linux内核和支撑内核的实用程序和库,通常还带有大量可以满足各类需求的应用程序。个人计算机使用的Linux发行版通常包含X Window和一个相应的桌面环境,如GNOME或KDE。桌面Linux操作系统常用的应用程序,包括Firefox网页浏览器、LibreOffice办公软件、GIMP图像处理工具等。由于Linux是自由软件,任何人都可以创建一个符合自己需求的Linux发行版。
Android
安卓(Android)是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。
iOS
iOS是由苹果公司开发的移动操作系统。 [1] 苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad上。iOS与苹果的macOS操作系统一样,属于类Unix的商业操作系统。原本这个系统名为iPhone OS,因为iPad,iPhone,iPod touch都使用iPhone OS,所以2010年WWDC上宣布改名为iOS(iOS为美国Cisco公司网络设备操作系统注册商标,苹果改名已获得Cisco公司授权)。
2016年1月,随着iOS 9.2.1版本的发布,苹果修复了一个存在了3年的漏洞。 [2] 2018年9月22日,美国苹果公司在最新的操作系统中秘密加入了基于iPhone用户和该公司其他设备使用者的“信任评级”功能。
2021年11月17日消息,据 9to5 Mac 报道,苹果iOS 15.2 Beta泄露全新“SportsKit”框架
2.1 Android 四大组件Androdi APP 主要由JAVA编写,包括四大组件(Activity、Service、Content Provider、Broadcast Receiver)
Activity
一个Activity通常就是一个单独的屏幕(窗口)Activity之间通过Intent进行通信android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity
Service
(1)service用于在后台完成用户指定的操作。service分为两种:
started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态 (2)startService()与bindService()区别:
started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点 开发人员需要在应用程序配置文件中声明全部的service,使用标签Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态
Content Provider
Android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式Content Provider实现数据共享。Content Provider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理
Broadcast Receiver
你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用 0x02 Android APP打包流程
Android APP的打包过程跟一般的JAVA APP,但它们都是用javac 将java 源代码文件编译城class文件的,如下:
.java源码 ———> javac源码 ———> .class文件
PS:此时,需注意Android 系统App并不使用标准的Java 虚拟机运行,而是使用自带的Dalvik虚拟机运行,Dalvik和Java虚拟机的字节码(机器指令集)不同,所以通过javac 编译生成的class文件无法在Dalvik虚拟机上运行,需要使用Android系统的dx(SDK)命令,将class文件和所有jar包转换成符合Dalvik字节码格式的classes.dex文件,虽然classes.dex里面是核心代码,但为了便于安装,Android 将APP打包成类似zip的APK文件,一个APK文件不仅包含了APP的所有代码,还包含非代码资源,如图片、视频、声音等
命令格式
dex --dex --output=classes.dex TestOg.class
PS:APK打包完成后需要对APK签名,签名的有两个用处,一:对APP负责,方便溯源,二:方便操作系统在APP安装时利用签名来校验安装文件的完整性和准确性
APK签名过程:使用私钥对APK文件包里面的所有文件进行校验,并将生成的校验信息作为一个附加的签名文件内置在APK文件包中
2.1 APK 打包工具| 名称 | 功能介绍 | 在操作系统中的路径 | 源码路径 |
|---|---|---|---|
| aapt( Android Asset Package Tool) | Android资源打包工具 | ${ANDROID_SDK_HOME} /build-tools/ANDROID_VERSION/aapt | frameworksbasetoolsaap |
| aidl(android interface definition language) | Android接口描述语言,将aidl转化为.java文件的工具 | ${ANDROID_SDK_HOME}/build-tools/ANDROID_VERSION/aidl | frameworksbasetoolsaidl |
| javac | Java Compiler | ${JDK_HOME}/javac 或/usr/bin/javac | - |
| dex | 转化.class文件为Davik VM能识别的.dex文件 | ${ANDROID_SDK_HOME}/build-tools/ANDROID_VERSION/dx | - |
| apkbuilder | 生成apk包 | ${ANDROID_SDK_HOME}/tools/apkbuilder | sdksdkmanagerlibssdklibsrccomandroidsdklibbuildApkBuilderMain.java |
| jarsigner | .jar文件的签名工具 | ${JDK_HOME}/jarsigner或/usr/bin/jarsigner | - |
| zipalign | 字节码对齐工具 | ${ANDROID_SDK_HOME}/tools/zipalign | - |
Android SDK或Android系统的appt 命令,将classes.dex文件和APP涉及的资源文件打包成APK文件,就是我们所说的APK安装包
流程概述:
打包资源文件,生成R.java文件处理aidl文件,生成相应java 文件编译工程源代码,生成相应class 文件转换所有class文件,生成classes.dex文件打包生成apk对apk文件进行签名对签名后的apk文件进行对其处理
打包资源文件,生成R.java文件
打包资源文件的工具是aapt(The Android Asset Packaing Tool),目录 sdkbuild-tools25.0.0aapt
在这个过程中,项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制。
存放在APP的res目录下的资源,该类资源在APP打包前大多会被编译,变成二进制文件,并会为每个该类文件赋予一个resource id。对于该类资源的访问,应用层代码则是通过resource id进行访问的
Android应用在编译过程中aapt工具会对资源文件进行编译,并生成一个resource.arsc文件,resource.arsc文件相当于一个文件索引表,记录了很多跟资源相关的信息。
处理aidl文件,生成相应的Java文件
处理aidl文件的工具是aidl(Android Interface Definition Language),即Android接口描述语言,目录 sdkbuild-tools25.0.0aidl
aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步
编译项目源代码,生成class文件
编译源代码使用工具是 Java编译器(javac)
项目中所有的Java代码,包括R.java和.aidl文件,都会变Java编译器(javac)编译成.class文件,生成的class文件位于工程中的bin/classes目录下
转换所有的class文件,生成classes.dex文件
使用工具 dx(dex)生成可供Android系统Dalvik虚拟机执行的classes.dex文件,工具目录(sdkbuild-tools25.0.0dx)
任何第三方的libraries和.class文件都会被转换成.dex文件。dx工具的主要工作是将Java字节码转成 Dalvik字节码、压缩常量池、消除冗余信息等
打包生成APK文件
打包的工具apkbuilder,目录 android-sdk/tools,apkbuilder为一个脚本文件,实际调用的是(sdktoolslib)文件中的com.android.sdklib.build.ApkbuilderMain类
所有没有编译的资源,如images、assets目录下资源(该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问)
编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中
对APK文件进行签名
一旦APK文件生成,它必须被签名才能被安装在设备上
在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore
另一种就是用于发布正式版本的relese.keystore,需要开发者自己配置
对签名后的APK文件进行对齐处理
如果你发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign,目录 sdkbuild-tools25.0.0zipalign
对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用
使用AAPT编译生成R.java
aapt的可执行命令,在${ANDROID_SDK_HOME}/build-tools/${build_tool_version}目录下,执行命令:
aapt package -f -m -J .build -S .srcmainres -I C:Android Studiopluginsandroidlibandroid.jar -M .srcmainAndroidManifest.xml aapt 参数的含义 -f 如果编译出来的文件已经存在,强制覆盖。 -m 使生成的包的目录放在-J参数指定的目录。 -J 指定生成的R.java的输出目录 -S res文件夹路径 -A assert文件夹的路径 -M AndroidManifest.xml的路径 -I 某个版本平台的android.jar的路径 -F 具体指定apk文件的输出
使用aidl编译AIDL文件 生成对应的java类文件
aidl的可执行命令,也在sdk的build-tools目录下,和aapt在相同的目录; 如果项目没有aidl文件,可不执行此步骤
编译java文件,生成class文件
使用javac命令,将项目源码R.java和aidl生成的java文件,编译成class文件
javac -encoding UTF-8 -bootclasspath C:Android Studiopluginsandroidlibandroid.jar -d ./build/class .buildcomeebbkbfcbuildtestR.java .srcmainjavacomeebbkbfcbuildtest*.java
将生成的class文件,转成dex文件
dx可执行命令,也在sdk的build-tools目录下
dx --dex --output=.buildclasses.dex .buildclass
使用aapt生成资源包文件
此步骤,会将资源文件打包,会将生成的resources.arsc, Manifest文件, 图片等其他文件打包进apk里面
aapt package -f -A .srcmainassets -S .srcmainres -M .srcmainAndroidManifest.xml -I "C:Android Studiopluginsandroidlibandroid.jar" -F .buildtest.apk
将dex文件打包进apk
由于apkbuilder工具已弃用,我们需要调用sdklib.jar 里面的com.android.sdklib.build.ApkBuilderMain类去调用
java -classpath "C:Android Studiopluginsandroidlibandroid.jar" com.android.sdklib.build.ApkBuilderMain .buildtest.apk -v -u -z . buildtest.apk -f .buildclasses.dex
对apk文件进行签名
jarsigner -verbose -keystore C:UsersAdministrator.androiddebug.keystore -storepass android -keypass android ".buildtest.apk" androiddebugkey
对签名后的apk文件进行对其处理
zipalign -f 4 ".buildtest_unsigned.apk" ".buildtest_signed.apk"
参考链接:
https://www.jianshu.com/p/930dadb7a3cf
https://blog.csdn.net/jason0539/article/details/44917745
https://juejin.cn/post/6844903838894260238
https://blog.csdn.net/g984160547/article/details/120513405
https://blog.csdn.net/DKBDKBDKB/article/details/110404742
https://www.codenong.com/cs109090968/
https://ayesawyer.github.io/2019/08/16/%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8%E6%9C%BA%E5%88%B6%E2%80%94%E2%80%94Android-Linux/
https://my.oschina.net/fhd/blog/350816


![[IOV安全入门] 十八. Android安全之Android 如何生成APP(APK)【细品出甘甜】 [IOV安全入门] 十八. Android安全之Android 如何生成APP(APK)【细品出甘甜】](http://www.mshxw.com/aiimages/31/760296.png)
