既然对外号称全栈,算法,后端,大数据,AI,网页,数据库都要懂。自然,移动端也绝不例外。IOS太贵,作为穷鬼,只好学习安卓。
安卓和Linux的恩怨与区别
Android系统层面的底层是Linux,并且在中间加上了一个叫做Dalvik的Java虚拟机,从表面层看是Android运行库。每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一设备上高效运行,dalvik被改写过。Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex)-该格式经过优化,以将内存好用降到最低。
这是一个很最大程度利用现有软件的做法,但是毫无疑问和linux基金会还有甲骨文产生了过节。
关于开源协议的一些问题记载在了这里。
https://blog.csdn.net/define_us/article/details/84775031
安卓和linux的正式分手是在2010年,Linux2.6.33发布并且删除了Android内核代码。
安卓内核虽然是在linux内核基础上改的,但是也有很大差别
- Android Binder
Android Binder是基于Openbinder框架的一个驱动,用于提供Android平台的进程间的通信(IPC)。原来的Linux系统上层应用的进程间通信主要是D-bus,采用消息总线的方式来进行IPC。其源代码位于drivers/staging/android/binder.c
- Android电源管理(PM)
Android电源管理是一个基于标准Linux电源管理系统的轻量级Andorid电源管理驱动,针对嵌入式设备做了很多优化。利用锁和定时器来切换系统状态,控制设备在不同状态下的功耗,以达到节能的目的。其源码位于kernel/power/earlysuspend.c kernel/power/consoleearlysuspend.c kernel/power/fbearysuspend.c kernel/power/wakelock.c kernel/power/userwakelock.c
- 低内存管理器(Low memory Killer)
Android中低内存管理器和linux标准的OOM相比,机制更加灵活,可以根据需要杀死进程来释放需要的内存。Low memory Killer的代码非常简单,里面关键是函数Lowmem_shrinker().作为一个模块在初始化时调用register_shrike注册一个Lowmen_shriker,它会被vm在内存紧张的情况下调用。源码位于drivers/staging/android/lowmemorykiller.c
PS. OOM(Out Of Memory)机制为Linux内核中一种自我保护机制,当系统分配不出内存时(触发条件)会触发这个机制,由系统在已有进程中挑选一个占用内存较多,回收内存收益最大的进程杀掉来释放内存。
- 匿名共享内存(Ashmem)
匿名共享内存为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会受到一个错误提示,然后重新分配内存并重载数据。其源码位于mm/ashmem.c
- Android PMEM(Phsical)
PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。驱动中提供了mmap、open/release和ioctl等接口。
- Android Logger
Android Logger是一个轻量级的日志设备,用于抓取Android系统的各种日志,是Linux所没有的
- Android Alarm
Android Alarm提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠是也会运行的时钟基准。其源码位于
driver/rtc/alarm.c drivers/rtc/alarm-dev.c
- USB Gadget驱动
此驱动是一个具有标准Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gadget框架的。其源码位于如下文件:
drivers/usb/gadget/android.c drivers/usb/gadget/f_adb.c drivers/usb/gadget/f_mass_storage.c
- Android Ram Console
为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer其源码位于
drviers/staging/android/ram_console.c
- Android timed device
Android timed device提供了对设备进行定时控制功能,目前仅仅支持vibrator和LED设备。其源码为drviers/staging/adnroid/timed_output.c
- Yaffs2文件系统
在Android系统中,采用Yaffs2作为MTD NAND FLASH文件系统。Yaffs2是一个快速稳定的应用于NAND和NOR FLash的跨平台的嵌入式设备文件性,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存运行状态,因此它占用内存小;Yaffs2的垃圾回收非常简单而且快速,因此能够达到更好的性能;其源代码位于fs/yaffs2目录。
一句题外话,为什么linux会决定将这些特性删掉从而把安卓排除在linux之外呢?主要责任还是在谷歌。谷歌在linux的代码库里维护属于自己的分支,这个分支和主分支的代码完全不兼容。这样,所有安卓周边公司都只能向该分支贡献代码,主分支什么也无法利用。这样的话,双方只能好聚好散。
安卓的架构
-
Linux Kernel:我们知道Android其实就是一个操作系统,其底层是基于Linux Kernel的,这一层主要完成的是操作系统所具有的功能,比如这一层有许多的驱动程序,正是通过这些驱动程序来驱动我们设备上的硬件设备的。
-
Android Runtime:Android的运行环境,我们学过java的都知道,java程序的运行需要java的核心包的支持,然后通过JVM虚拟机来运行我们的应用程序,这里Android Runtime里的Core Libraries就相当于java的JDK,是运行android应用程序所需要的核心库,Dalvik Virtual Machine就相当于JVM,这时Google专为Android开发的运行android应用程序所需的虚拟机。
-
Liberaries:这里面都是Android的库文件,例如我们访问SQLite数据库的库文件等等。
-
Application Framework:应用程序的框架,这个是非常的重要的,相信Framework这个词大家都应该非常的熟悉了,我们学习Android也主要学的就是这一层,我们通过这些各种各样的框架来实现我们的Application。
-
Application:这个就是我们开发的Application了。
安卓的程序架构和HelloWorld
安卓有四大组件
Activity
应用程序中,一个Activity就相当于手机屏幕,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序可以包含许多活动,比如事件的点击,一般都会触发一个新的Activity。
Activity相当于servlet。也有自己的完整的生命周期。
BroadcastReceiver广播接收器
应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或sevice 来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
ContentProvider内容提供者
内容提供者主要用于在不同应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。只有需要在多个应用程序间共享数据时才需要内容提供者。例如:通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处:统一数据访问方式。
当一个应用程序需要把自己的数据暴露给其他应用程序使用时,该应用程序可以通过提供ContentProvider来实现;而其他应用程序需要使用这些数据时,不管提供数据的应用程序是否启动,可以通过ContentResolver来操作ContentProvider暴露的数据。
Service服务
是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要长期运行的任务(一边打电话,后台挂着QQ)。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,服务扔然能够保持正常运行,不过服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉后,所有依赖于该进程的服务也会停止运行(正在听音乐,然后把音乐程序退出)。
intent
Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。
Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。
Android通过Intent启动Activity有两种方式,分别为显示启动和隐式启动。当然也可以通过隐式方式启动Service和BroadcastReceiver,不过Android5.0以上系统禁止使用隐式方式启动Service。
下面是一个简单的例子通过隐式的intent启动APP的例子。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="com.sun.action.test"/>
<category android:name="com.sun.category"/>
<data
android:host="sunHost"
android:mimeType="sun/mimeType"
android:path="/sunPath"
android:port="8888"
android:scheme="sunScheme"/>
</intent-filter>
</activity>
发出intent的代码如下
Intent intent = new Intent("com.sun.action.test");
intent.addCategory("com.sun.category.test");
intent.setDataAndType(Uri.parse("sunScheme://sunHost:8888/sunPath"), "sun/mimeType");
被上面的intent-filter捕获,就可以拉起Activity。
界面
HelloWorld
我们使用的是Android Studio 是基于 IntelliJ IDEA 的官方 Android 应用开发集成开发环境 (IDE)。
安卓程序的设计理念
照例,我们有,MVC/MVP/MVVM
首先视图接受用户输入请求,然后将请求传递给控制器,控制器再调用某个模型来处理用户的请求,在控制器的控制下,再将处理后的结果交给某个视图进行格式化输出给用户。另外,View是可以直接访问Model来进行数据的处理的
M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。 V层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。 C层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。
来源:CSDN
作者:define_us
链接:https://blog.csdn.net/define_us/article/details/86603805