热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

解剖一个AndroidApp

Edit解剖一个AndroidApp前言此刻,夕阳沾染上了西方的雾气。最后的光线像守着古塔老人,被雾压碎镶
Edit

解剖一个Android App

前言

此刻,夕阳沾染上了西方的雾气。最后的光线像守着古塔老人,被雾压碎镶嵌在时间河里,终于放出最后活力。夕阳与雾如此迷离,是不是一个指针?让我引用过去。

作为一个android开发者(学习者),相信你对于Activity,Service,intent,drawable,shape等等名词一定是很熟悉的。在日常的开发中,我们用这些特有的东西去构建我们的app。感谢开源的理念,网上,书上关于如何使用activity,service,view,intent的教程十分充足,介绍原理的文章书籍足够多,足够优秀。这边文章不涉及到这些细节。

这篇文章的主题是:如果我们一起跑到屋顶上往下看,那么写一个App到底写了些什么?

能力有限,疏漏之处,烦请指正。

一. 从Android System说起

1.Android是什么系统?

一个特殊的Linux系统

相信大家都知道android系统的内核是Linux的内核,这意味着android具有了Linux的特性。由于不会讨论Android系统特有的实现,所以姑且就将Android系统当作一个Linux系统。

解决了上面那个问题,再看下面这个问题:
“Android系统是一个特殊的Linux系统”,这意味着什么呢?

  1. 多用户
  2. 权限机制

2.“多用户”意味着什么?

多用户操作系统允许多个用户在同一时间内使用计算机。–维基百科

如上,不管在window还是在Linux都是存在同时有多个用户登录使用的。Window由于一般是个人电脑所以可能感受不深,而Linux作为服务器允许多个用户是必须的。

ok,继续看下一个问题:
多用户对android系统而言又意味着什么呢?
意味着可以同时有多个app运行,请求资源。
因为:
一个App就是一个用户
一个App就是一个用户
一个App就是一个用户

重要的事情所三遍。

现在来说明一下,“一个App就是一个用户”这句话有什么内涵?
使用过Linux系统的人相信对于“User”这个概念一定不陌生。在Linux中,对于不同的文件往往具有不同的拥有者,也就是用户。当进入系统的时候,必须要有一个身份来做登录。这个身份就代表一个用户,一个“User”。

用户调用操作系统的资源,比如打开视频播放软件放电影就调用了系统关于视频播放的资源,上网就调用了上网的资源。这些资源的调用是通过这个“User”,进行的。

还记得上面,那句话吗?一个App就是一个用户。开发者写App就相当于在Android系统中“创造了一个User”。
通过这个“User”,也就是App,可以去调用系统的资源。举个例子,当我们使用“微信”给朋友发语音的时候,“微信”最终做了什么呢?
主要是两件事:1.调用系统的录音资源,录制一段音频数据 2.调用系统的网络资源,把数据发给服务器。

到这里,我们可以得出一个基本结论:App是系统资源的一个调用者。

讨论完了,“多用户”的意义。接下来再看看,权限管理机制。

3. 权限管理机制是什么样的?

By default, the system assigns each app a unique Linux user ID(the ID is used only by the system and is unknown to the app). The system sets permissions for all the files in an app so that only the user ID assigned to that app can access them.

如上,每个app都被分配了一个独一无二的ID,这个ID对app是透明的,系统知道,app自己不知道。一个app中的文件都被设置了权限,只有通过这个app的ID才能访问app的文件。

直观来讲,Android中每一个app一个自己不知道的ID,通过这样的机制,系统让其他app无法访问其文件。

这就是,权限管理机制的底层构想。

但是这样以来有个问题,如果app之间希望分享数据(比如想使用相机简单拍张图片)该怎么办呢?
答案是去向系统请求权限。这一点相信大家都不陌生,就不赘述了。

基于上面app之间分享数据的场景,还牵扯了app之间(实质上是进程之间)的问题,比如AIDL和ContentProvider。

二. App本质上在做什么?

开门见山,亮出观点:

一个app本质上就是android系统和用户之间的中间人。或者说app就是Android系统暴露的功能接口。

现在请暂时把开发android app划分为三部分(可能你并不认可):

  1. Android系统。提供各种底层的服务,这些服务可以被SDK框架调用。
  2. App。app是开发者通过调用SDK提供的各种类java语言的能力完成的软件。
  3. 用户。

叙述我的观点前,先来看看一个App是由哪几部分组成的?

1.App是由哪几步分构成的?

我的观点是:

App = Application Component + User Interface + UseCase

Application Component指的是Android的四大组件,User Interface是用户界面,UseCase是具体一个App的业务逻辑。

1.1 Application Components

首先来看四大组件。不知道大家有没有想过四大组件对于app来讲到底是个什么东西?

从Android系统角度来看,四大组件是其资源有组织形式的暴露。Activity是其暴露自己的屏幕资源,让App利用起来给用户图形体验的工具;Service是系统隐式暴露自己各种资源的工具;ContentProvider是协调系统协调App数据分享的工具;BroadCast Reciver是和App直接“交流”的工具,告诉App自己发生了什么。

简而言之,四大组件就是系统排到App的四个“外交官”,通过“外交官”,app可以很方便的和系统进行交流。

从App的角度来看,四大组件是一个App的骨架,一切app具体功能的实现都是在这个骨架上“生长”出东西。

1.2 User Interface

User Interface,这个翻译是“用户界面”。不过我觉得这样表述出来,真的是把其韵味完全给抹杀掉了。为什么呢?首先,这个Interface就是接口(这里不是取Java那个interface关键字的意思,也是类中接口方法那个意思,简单来讲就是一个事物暴露出来的,用于外界跟自己交流的部分。)

User Interface是app提供给用户,让用户和自己交流(交互)的规范。

那么具体是什么呢?相信你也猜到了,最典型的就是各种View。比如用户在使用一个新闻App浏览新闻,存放信息的是一个RecyclerView,每一个Item是一个新闻标题,有很多条新闻,屏幕无法完全放下。

那么你会怎么做?
做什么做,只要使用RecyclerView,用户自己用手指滑不就是了。

对,用户用手指滑就是一种和app的交流,User Interface(如这里的RecylerView)就是规定了一种用户交流的规范(往上滑代表想看更多)。这样app就知道用户的行为是在表达什么需求。

这种app和用户的交流可能是双向的也可能是单向的。比如一个view的背景色就是单方面告诉用户这个view张什么样子,而button就是双向的,点击某个button开启一个功能,同时button要改变颜色来反馈用户我已经做了你要我做的事了。由此,就有了各种各样的View。但是其本质就是用户和app交流的规范。规范有好有差,差的就是不站在小白用户角度思考问题。

ps:电脑上普通用户如果浏览新闻就是滑鼠标,嗯,程序员的话,就是terminal

1.3 UseCase

UseCase就是业务逻辑。现代建筑都是钢筋,水泥,玻璃等建筑材料组成的,但是现代建筑从功能到外观可以千差万别。App也是一样,其组成的材料都来自SDK,但是最后得到的产品却完全不一样。

这些不一样,来自组成“材料”的不同,对“材料”的运用方式不同,这些就是UseCase。这也是最终一个App的根本。

1.4 main()

PS:main()就是取main的含义,这里把涉及到的东西串一下。

Android系统,Application Component,User Interface,用户之间的关系:

1.用户通过和app中的User Interface交互表达了自己的行为,app通过User Interface的交互规范可以从用户的行为中知道用户的需求.

2.接着,App通过compoents去调用系统的资源来完成用户的需求.

3.最后需求的结果会通过app的User Interface(各种View)在呈现给用户。

4.用户具体的需求内容与实现就是UseCase。

通过app component让app可以和系统进行交流,具体就是调用各种系统的资源,与用户打交道主要通过user interface来感受到用户的命令,这种interface从某个层面来讲就是规范了用户需求的表达。比如用户看新闻的时候向下拉就是刷新信息,这种动作让用户需求的表达得到了一个规范化的表达。UserInface通过各种Event事件来得到了这种表达,并将这种需求的表达转换为了可以用来编程的信息。app的component通过得到的这种信息从而有了调用系统资源的目标。于是app就可以这样来调用系统的资源了,通过各种资源获取到用户想要的信息,在把这种信息通过user interface表现出来,用户就收到信息。
总结下的话就是:用户<——>user interface<——>app component<——>android system,这么一个链条。user interface,app component,合起来就是开发者写的app。

android中还有些重要的部分,比如Intent,主要就是四大组件中除了ContentProvder之外的信使,manifest就是一个app中的compoents的户口登记表,而各种xml都是服务User Interface的后勤人员,URI就是ContentProvider…..嗯,时间关系,有机会下次在讨论了。

enjoy hacking!!


推荐阅读
  • 本文探讨了天才与疯子之间的微妙界限,介绍了如何利用巨人的工具提升自我,以及如何通过科学决策、数据洞察和智慧的尺度来指导我们的生活和工作。 ... [详细]
  • 深入理解小程序中的Picker组件
    Picker组件是一种从屏幕底部弹出的滚动选择器,支持多种选择模式,包括普通选择器、多列选择器、时间选择器、日期选择器和省市区选择器。本文将详细介绍Picker的各种属性及其应用场景。 ... [详细]
  • 深入理解动态链接库及其应用
    本文将探讨动态链接库的基本概念,包括Windows下的动态链接库(DLL)和Linux下的共享库(Shared Library),并详细介绍如何在Linux环境中创建和使用这些库。 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
  • CentOS 7.2 配置防火墙端口开放
    本文介绍如何在 CentOS 7.2 系统上配置防火墙以开放特定的服务端口,包括 FTP 服务的临时与永久开放方法,以及如何验证配置是否生效。 ... [详细]
  • 本文介绍了如何利用Java中的URLConnection类来实现基本的网络爬虫功能,包括向目标网站发送请求、接收HTML响应、解析HTML以提取所需信息,并处理可能存在的递归爬取需求。 ... [详细]
  • 优化Input Checkbox与Label文本对齐的方法
    本文探讨了在网页设计中,如何有效解决input checkbox与label文字不对齐的问题。通过具体的代码实例和解决方案,帮助开发者实现更加美观的用户界面。 ... [详细]
  • 在使用高德地图内置导航功能时遇到AMapNavi组件出现空指针异常,经过多次排查发现问题是由于so库的兼容性引起的。本文将详细介绍如何通过调整项目配置来解决这一问题。 ... [详细]
  • 深入解析IGMP各版本特性及其演进
    本文详细探讨了Internet组管理协议(IGMP)的不同版本,包括IGMPv1的基础功能、IGMPv2的增强特性和IGMPv3的重要改进。特别分析了IGMPv3如何支持特定源组播(SSM)模型,并介绍了各版本之间的主要差异。 ... [详细]
  • 初探SoloPi:一款强大的Android自动化测试工具
    SoloPi是一款由支付宝开发的无线化、非侵入式且无需Root的Android自动化测试工具。它提供了录制回放、性能测试和一机多控三大核心功能,极大地提高了测试开发人员的工作效率。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • Java与JSON互转:实现JSON到Java对象及Java对象到JSON的转换
    本文详细介绍了如何在Java中实现JSON数据与Java对象之间的相互转换,包括代码示例和常见问题解决方法。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
author-avatar
拍友2602923913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有