Google Android源码中的架构和设计思想,Android总体架构

  代码分层、分离,封装。 
  学习源码的执行流程而不纠结于细节。Google是如何在Java的基础上加上Android的特性的,你能够理解Context被叫做“环境”的原因。优秀开源项目的代码风格和设计理念。

  Android使用Linux内核是1991年开发的;Mac OS X、iOS和苹果的其他平台是基于Unix系统的,那是AT&T贝尔实验室在1969年启动的一个项目。Windows计算机则是基于Windows NT内核,其历史可追溯到1993年。
  苹果一贯的封闭和精品策略,决定了苹果仅仅是一个人在战斗,也没有向任何盟友伸出橄榄枝。完全依赖手机一年一部的发行节奏来驱动市场,通过在硬件外观上的创新来撩拨消费者的心弦,这样的封闭策略已注定了 ios 不会主导整个市场份额。

  谷歌在设计Android系统时,将UI界面和逻辑代码分开组 建:界面设计通过XML的形式描述,具体的程序和应用逻辑则通过代码来实现。

-- 深度 | Android 整体设计及背后意义- https://mp.weixin.qq.com/s/weZJHx6jnCtshhZBvUKEOw
  Android设计的现实意义: 架构的工程意义在于:定义并解决一类问题,为需求到实现的平稳过渡提供保障。传统意义的Android架构(图1)已被人熟知,但不同角色的视角不同,例如认为Runtime和框架是其核心、或者将Android看做是一种特异性JVM平台、还有从嵌入式出发将其看做是Linux…… 实际上,Android是极少数几个用设计来解决自身发展问题的系统,其核心在于通过硬件抽象、组件化、接口层三种能力来为发展提供基础,并为诸多变数预留大量可操作、斡旋的空间。

  然而HAL并无固定做法(如图2所示),Android 8.0之前,最初大量采用HAL旧版方式,表现为framework直接加载*.so并依赖,主要集中在网络、蓝牙等模块;旧版方式导致framework与具体驱动接口耦合过紧,后来形成HAL传统方式,即提供一定规范和接口进行改进,从而减少直接耦合,但每次厂商支持新版Android依旧有大量改动和适配;为更有效地解决这一问题,Android 8.0开启Treble项目,从此芯片厂商能通过基于Binder的HIDL提供稳定接口,制造商则可不受芯片厂商影响而直接更新Framework,甚至获得无需重新编译HAL即可OTA的能力。
  HAL为Android设备量的持续增长提供了基础,并促进有实力的厂商向设备上层及基础设施两个领域纵深发展(图3),体现在掌握核心技术的厂商(如高通、华为、MTK),通过不断建设系统能力来强化竞争力(支持5G标准、硬件能力、软硬结合以及系统能力的深度定制等),而具备渠道和资源整合优势的手机制造商(华为、OPPO、小米、VIVO等),则立足OS持续构建更高效的应用来拓展版图(UI、推送、商店、轻应用等),这都体现出Android HAL对整个产业的凝聚和影响,间接弥补Android自身的诸多不足。
  所以选择混合架构对于缺乏完整移动领域产业链支撑的Google既符合其自身技术理念、又胜算最大,于是量身定制的组件化能力便肩负起这一使命,使得各组件得到有机组合、应用之间以及应用和系统的沟通更为明确和有约束,最终帮助整个系统灵活运转,能力被迅速放大。
  观察Android系统的启动运行流程(图4)以及APP对系统能力的使用(图5),可以发现其各类能力已按照组件化标准和粒度进行组织(能力的注册发现、接口和通信的标准化、运行空间的隔离等),让快速迭代的手机硬件和持续升级的系统能力以最小代价透出,将复用的价值在移动设备系统上具体化并最大化,从而具备更高的灵活性和兼容性;其背后软件工程的意义在于为软件需求、设计之间架起一座桥梁,解决了系统结构和研发需求向实现平坦过渡的问题。
  之所以Android敢这么做,还是因为有其设计基础的支撑,根据个人的一点粗鄙了解,从Android API的调用链路(图7)上能发现端倪:无论底层依赖、实现和流程如何变化,上层的使用形式并不会改变。

Android从三个方面来解决其发展的关键问题:
 1.硬件驱动:形成厂商的合作基础,并反过来对整个产业施加影响。
 2.组件化:高效组织各种内部能力,寻求自身的更快发展。
 3.接口层:满足上层对系统和硬件能力的各种使用诉求。

通过Android的启发,结合环境和现状,在满足业务目标的同时我们从三个层面不断演进网络能力(图11)。
 1.首先,通过覆盖线上线下、各类场景、形态各异的设备,不断打造高效私有、支持通用标准的协议,并提供部分其他端侧网络不能或者及其难以提供的特殊能力,来帮助我们构建设备和服务、用户与业务的泛连接基础。
 2.其次,自底向上地抽象,将非阻塞的IO复用、用户态网络栈支持、通道能力扩展以及可支持混合集群的多实例架构进行高效组织,从而保障了数据在不通层面的流转和管理诉求。
 3.最后,基于SDK矩阵和接入能力的建设,我们实现了服务接入到业务、业务透出给用户的目的,并通过提供丰富的数据带来更多价值。

  结合传统的C/S观念,服务端获取的信息来源于各网络终端,网络+协议屏蔽或规范了外界对服务输入的多样性,使得服务端过去关注的是集群和高并发,但现在无论是上云还是利用率,背后都是业务、成本规模和边际效应在驱动,这里面发展的代际主旨鲜明。但回到客户端,由于受到环境和交互等多样性直接影响,即便是动态性的技术也难以代表端侧的全部甚至是主流。所以在某种局部技术比拼武功,成为过去客户端的一种行业“潮流”。
  在局部技术和单点深入的确有其意义,笔者也曾有过一些班门弄斧,如非轮询方式获取手机栈顶Activity、面向阿里特有复杂集群的SDK多实例设计、Sophix热修复及云上产品等。但结合过往经验及Android设计,可以更系统性地看待这一现象:即除了满足业务核心诉求(因为投入大量资源,必须、肯定要成,至少小成),更应该关注技术如何更好地服务业务以及如何持续挖掘能力护城河这两头的问题。所以要打造和发展好一个系统,除构建系统各中坚能力外,还需维护好系统发展的前提、组织好各系统能力的内聚、满足好外部对系统的诉求。

> 研究谷歌的最新Android SDK
如果想及时应用谷歌的最新SDK,通用流程应该是这样的:谷歌推出最新的SDK -> 立即研究学习,这可能会用掉几天,一个星期,甚至更多的时间 ->修改自己的应用。好了,那么问题来了。
  1. 最新的SDK肯定都是英文的。那么你要能够很熟练的阅读外文文档。
  2. 大家都知道程序员加班是个很平常的事情,那么如果想要立即研究最新的SDK,这个程序猿显然要对自己的工作游刃有余,要有时间有精力,还要自律性和执行力非常强。
  3. 迅速修改自己的应用,于是你发现,诶,现在市场上好多人还没升级4.0呢。现在的Android5.0出来到普及要用多久?Android6.0,Android7.0....???

> Android系统架构:
Android Mashup设计的理解
  android中的Mashup,是将应用切分成不同类别的组件,通过统一的定位模型和接口标准将它们整合在一起,来共同完成某项任务。而在Android的Mashup模式下,每个组件的功能都可以被充分地复用。来自不同应用的组件可以有机地结合在一起,共同完成任务。开发者无须耗费精力去重新开发一些附属功能,而是可以全身心地投入到核心功能的开发中。这样不但提高了应用开发的效率,也增强了用户体验。
  Android的组件管理服务,就是通过配置文件中的信息去了解每个组件(Activity Service等)的特征。
  在Mashup的概念下构造Android应用,有三个基本要素:组件(Component)、连接和配置。 

  android的第一层Application和第二层ApplicationFramework都是用Java编写,第三层Libraries和第四层Linux Kernel都是用C/C++编写。
  Android的系统架构采用了分层架构的思想.从上层到底层共包括四层,分别是应用程序程序层、应用框架层、系统库和Android运行时和Linux内核。(Linux Kernel、Android Runtime、Libraries、Application Framework、Applications)
 1.应用程序层
 该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。
 2.应用程序框架层
 该层是Android应用开发的基础,开发人员大部分情况是在和她打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。
 3.系统库和Android运行时
 系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.NET、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。
 4.Linux内核
 Android核心系统服务依赖于Linux2.6(不断提升)内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。
  总结:
  1. Android的系统架构采用分层架构的思想,架构清晰,层次分明,协同工作。
  2. Android的系统架构不仅从宏观上认识了Android系统,同时,也给我们的学习与实践指明了方向。若是从事Android应用开发,那应该研究Android的应用框架层和应用程序层;若是从事Android系统开发,那应该研究Android的系统库和Android运行时;若是从事Android驱动开发,那应该研究Android的Linux内核。总之,找准切入点,实践出真知。

> Android系统架构各层介绍 
Android系统架构的详细解析—http://blog.chinaunix.net/uid-25838286-id-3011173.html
Android的系统架构- http://blog.csdn.net/wangloveall/article/details/8033725
Android 系统构架- https://www.cnblogs.com/iceknp/archive/2011/03/29/1998590.html

 1. 应用层:应用是用Java语言编写的运行在虚拟机上的程序,比如Email客户端,SMS短消息程序,日历等。 
 2. 应用框架层:这一层是编写Google发布的核心应用时所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,这样便简化了程序开发的结构设计,但是必须要遵守其框架的开发原则。 
 3. 系统运行库(C/C++库以及android运行库)层:当使用Android应用框架时,Android系统会通过一些C/C++库来支持我们使用的各个组件,使其更好的为我们服务,比如其中的SQLite(关系数据库),Webkit(Web浏览器引擎)。 
 4. Linux内核层:Android的核心系统服务给予Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核,比如Binder IPC驱动,android的一个特殊驱动程序,具有单独的设备节点,提供进程间通信的功能。 

 a.框架提供的功能 :
  Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则。我们在开发应用时就是在这个框架上进行扩展,下面是Android框架提供给我们可用的功能。 
 1、android.app:提供高层的程序模型和基本的运行环境。 
 2、 android.content:包括各种设备上的数据进行访问和发布。 
 3、 android.database:通过内容提供者浏览和操作数据库。 
 4、 android.graphics:底层的图形库,包括画布、颜色过滤、点、矩阵,可以将他们直接绘制到屏幕上。 
 5、 android.location:定位和相关服务的类。 
 6、 android.media:提供一些类管理多种音频、视频的媒体接口。 
 7、 android.NET:提供帮助网络访问的类,超过通常的java.net.*。 
 8、 android.os:提供了系统服务、消息传输和IPC机制。 
 9、 android.opengl:提供OpenGL的工具。 
 10、 android.provider:提供访问Android内容提供者的类。 
 11、 android.telephony:提供与拨打电话相关的API交互。 
 12、 android.view提供基础的用户界面接口框架。 
 13、 android.util:设计工具性的方法,例如时间日期的操作。 
 14、 android.webkit:默认浏览器操作接口。 
 15、 android.widget:包含各种UI元素(大部分是可见的)在应用程序的布局中使用。 

 b.相关技术说明 :
  关于进程间通信的几种方式 
  1、 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 
  2、 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 
  3、 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 
  4、 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 
  5、 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 
  6、 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 
  7、 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 
  关于linux内核及操作系统加载过程 
  由于在Linux系统的启动过程中会出现非常多的提示系统的启动过程中会出现非常多的提示信息,而且很多启动信息都是在屏幕上一闪而过, 息,而且很多启动信息都是在屏幕上一闪而过,所以对于LINUX系统的初学者来说,可能会觉得Linux的启动过程非常神秘和复杂。其实 系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段。 
  1.BIOS加电自检 
  2.加载主引导加载程序(MBR) 
  3.加载次引导加载程序(GRUB) 
  4.Linux内核映像 
  5.init进程.

 一.应用程序层
 二、Application Framework(应用框架层)
  这一层是编写Google发布的核心应用时所使用的API框架,开发人员可以使用这些框架来开发自己的应用。
  View System:可以用来构建应用程序,它包括列表、网格、文本框、按钮以及可嵌入的Web浏览器。
  Content Providers:它可以让一个应用访问另一个应用的数据,或共享它们自己的数据。
  Resource Manager:提供非代码资源的访问,如本地字符串、图形和布局文件。
  Notification Manager:应用可以在状态栏中显示自定义的提示信息。
  Activity Manager:用来管理应用程序生命周期并提供常用的导航退回功能。
  Window Manager:管理所有的窗口程序。
  Package Manager:Android系统内的程序管理。
    TelephonyManager(电话管理器):管理所有的移动设备功能

 三、Libraries、Android Runtime(系统运行库层)
  当使用Android应用框架时,Android系统会通过一些C/C++库赖支持我们使用的各个组件,使其能更好地为我们服务。
  Bionic系统C库:C语言标准库,系统最底层的的库,C库通过Linux系统来调用。
  多媒体库(MediaFramework):Android系统多媒体库,基于PackerVideo OpenCORE,该库支持多种常见格式的音频、视频的回放和录制,以及图片,比如MPEG4、MP3、AAC、AMR、JPG、PNG等。
  SGL:2D图形引擎库。
  SSL:位于TCP/IP协议与各种应用层协议之间,为数据通信提供支持。
  OpenGL ES 1.0:3D效果的支持。
  SQLite:关系数据库。
  Webkit:Web浏览器引擎。
  FreeType:位图(bitmap)及矢量(vector)。
    Surface Manager:执行多个应用程序时候,负责管理显示与存取操作间的互动,另外也负责2D绘图与3D绘图进行显示合成。
  在Android操作系统中,每个Java程序都运行在Dalvik虚拟机上,其只能执行.dex的可执行文件,当Java程序通过编译后,最后还需要通过SDK中的dx工具转为成.dex格式才能正常在虚拟机上执行,Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式dex(Dalvik Exceutable)的文件。
  Dalvik虚拟机有如下几个主要特征:
  1.专有的dex文件格式。
  2.dex的优化,dex文件的结构是紧凑的。
  3.基于寄存器。
  4.一个应用,一个虚拟机实例,一个进程。每一个Android应用度运行在一个Dalvik虚拟机实例中,每一个虚拟机实例都是一个独立的进程空间。

 四、Linux Kernel(Linux内核层)
  显示驱动(Display Driver):基于Linux的帧缓冲(Frame Buffer)驱动。
  键盘驱动(KeyBoard Driver):作为输入设备的键盘驱动。
  Flash内存驱动(Flase Memory Driver):基于MTD的Flash驱动程序。
   照相机驱动(Camera Driver):常用的基于Linux的v412(Video for Linux)的驱动。
  音频驱动(Audio Driver):常用的基于ALSA的高级Linux声音体系驱动。
  蓝牙驱动(Bluetooth Driver):基于IEEE 802.15.1标准的无线传输技术。
  WiFi驱动:基于IEEE 802.11标准的驱动程序。
  Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能。
  Power Management(电源管理):比如电池电量等。

> Android平台使用Java语言开发的原因
-- Android为什么会选Java作为开发语言?
Java/C++/C#/Go/C是重语言。重语言首先讲究的是运行效率。然后讲究工程化。
Python/Ruby/JavaScript+Html/是轻语言。轻语言讲究开发效率,讲究敏捷性开发。
  我心目中划分语言的标准基本上是属于这样的,只要在代码中体现我们需要讲效率的。那就是重语言。

1.C++重运行效率。但是跨平台性较弱。开发难度较高。库多,用的人多。
2.Python,重开发效率。跨平台性高。开发难度低,库多,用的人多。
3.Java。重开发效率。不及python,重运行效率,不及C++。开发难度低。库多。用的人多。

  Android平台使用Java语言开发,纯粹是Google的商业策略,Google倒是想用自己的(例如Go语言)。一门计算机语言的普及,从编译器、语法、基础库,然后到草根程序员认可,不是短时间能完成得了的。而面对苹果的i系列移动设备在市场上的疯狂程度,Android只有通过捷径展开竞争。Java语言是一个相当成熟的计算机编程语种,除了基础类库完善,各种高效的第三方组件更是不计其数,最最重要的一点是Java虚拟机规范也是开放的,以Google的实力在此规范下做一款虚拟机出来不费吹灰之力(即便是新的硬件架构)。这个策略实在太英明了。市场上,在Android 4.x版本对比iOS就呈现压倒性优势,以致于Oracle都非常嫉妒,以侵犯API版权为名索要好处费。高级开发语言竞争也非常激烈,Java实际上在慢慢失去优势,应该感谢Android为Java语言的兴旺添一把火。

> Android源码中有哪些经典的架构
  Android中最直观的分层架构和微服务架构。我们最常看到的Android体系架构就是一个典 型的分层架构,分为应用层、Framework层、Native层、内核层。上层是下层的调用端,下层则为上层提供服务,每一层都代表了应用的一个功能, 每一层的职责也相对较单一,这样使得系统的模块化程度、可测试性更高。
  另一个明显的架构模式就是微服务架构。微服务架构的体现是System Service与Framework层的设计上。Android系统在启动时会启动ActivityManagerService、 PackageManagerService、WindowManagerService等系统服务,用户在执行操作时,会通过Framework层向对 应的Service发出请求,具体的Service接到指令之后做出反应。这样一来,Framework与这些System Service就构成了一个微服务架构,它们通过Binder进行通信,既解除了耦合,又提升了灵活性、可扩展性。
  像Android这类大型应用中自然还有很多经典架构模式的运用,大家可以根据Android系统的源码中的线索来查找这些优秀运用示例。  

> 精通Application Framework,你就可以真正的理解android的设计和运行机制,也就更能够驾驭整个应用层的开发。
 android的官方建议应用程序的开发采用mvc模式。何谓mvc?mvc是model,view,controller的缩写,Android中界面部分也采用了当前比较流行的MVC框架,在Android中:
  1.M 模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
  2.V 视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
  3.C 控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
  -- android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
 1) 视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。
 2) 控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
 3) 模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。

  android框架魅力的源泉在于ioc,在开发android的过程中你会时刻感受到ioc带来的巨大方便,就拿activity来说,下面的函数是框架调用自动调用的:protected void onCreate(bundlesavedinstancestate);不是程序编写者主动去调用,反而是用户写的代码被框架调用,这也就反转了!

  在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中现实。 

 Android系统按语言来划分的话由两个世界组成,分别是Java世界和Native世界。
Android应用程序开发以及背后的设计思想深度剖析(3)--- http://blog.csdn.net/21cnbao/article/details/7980633

> 在Intent这种超级交互消息之上,Android进一步把应用程序的实现逻辑拆分成多种特殊的实现:
 Þ Activity:带显示与交互能力的部分
 Þ Service:不带显示与交互能力的部分
 Þ Content Provider:在功能交互之外,提供数据交互能力的部分
 Þ Broadcast Receiver:用来处理广播交互的部分
  这四种功能上的拆分,也体现了Android设计者在设计上抽象思绪能力,即便是随着Android迅猛发展,目前已经到了4.1这么功能丰富、用户体验良好的状态,我们编程也还是与这四种功能组件打交道,可以满足我们任何的编程时所需要的任何行为。而这四种基本组件组成部分,使Android应用程序反倒成了一个“空壳子”。静态上看,应用程序只是一种包装这些功能的容器;从运行态来看,所谓的应用程序,也只是承载某些功能的进程。

-- Android的权限系统是基于Linux,但又增加了很多自己的控制模块。总体上来说,其分为以下几部分权限系统:
 1. userid : 继承于linux,对于多个app,通过shareuid的方式可以使用同一个userid,主要承担一些目录访问权限之类的工作,比如私有目录只能由同一uid应用访问
 2. 安装level:system level or app level,这个是根据应用的安装位置决定的,在system/app下安装的应用就是system level,在权限访问中会得到更多的权限,比如静默安装应用的权限等
 3. permission : 这个是最主要的权限控制,一般开发者开发应用主要是接触这个部分,在这部分中,会根据应用在AndroidManifest.xml中声明的use-permission而在访问相应api或资源时判断其是否有访问权限,比如常用的android.permission.INTERNET等
 4. signature: 签名,是Android权限系统中的重要组成部分,对于系统签名的应用,会有一些特殊的功能,而shareuid等特性也是需要同一签名作为基础。此外,permission在设置/自定义其权限时也经常会使用到签名,比如控制只有我自己的应用才可以访问我自己定义的公开api除此以外,其实Android在uid的里面设置了一些预定义有特殊功能的uid,比如system/media等,在配置其system level的services的时候会用到。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值