Android Application基础

系统启动过程

APK文件介绍

APK是Android Package的缩写,即android安装包。APK 文件其实是zip 格式,但后缀名被修改为apk ,可以通过解压程序直接解压查看。apk 解压后,一般的可看到的目录结构如下:

文件或目录 作用
AndroidManifest.xml文件 程序全局配置文件,它描述了应用的名字、版本、权限、引用的库文件等等信息。在apk中的AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工具解开,具体命令为:java -jar AXMLPrinter2.jar AndroidManifest.xml 
META-INF目录 存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
res目录  存放资源文件。包括图片,字符串等等。
lib目录  子目录armeabi存放的是一些so文件。这个地方多讲几句,都是在开发过程中摸索出来的。eclipse在打包的时候会根据文件名的命名规则(lib****.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”,否则是不会打包到apk文件中的。其他非eclipse开发环境没有测试过。如果你是用SDK和NDK开发的话,这部分很重要,甚至可以通过把一些不是so文件的文件通过改名打包到apk中,具体能干些什么那就看你想干什么了。
assets目录 存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。
classes.dex文件  DEX(DalvikVM executes的简称)是Android Dalvik执行程序文件,是Dalvik的字节码而非Java的字节码(首先是java文件通过jdk编译成字节码文件然后经过dex编译成classes.dex)
resources.arsc文件  编译后的二进制资源文件的索引(apk文件的资源表)

Android在运行程序时首先需要解压apk文件,然后获取编译后的AndroidManifest.xml文件中配置信息,执行dex程序。

系统基础

每个Android应用程序的都运行在它自己的安全沙箱中:

  • 而Android操作系统是一个多用户Linux系统中,每个应用程序是一个不同的用户。
  • 默认情况下,每个应用程序的系统分配一个唯一的Linux用户ID(该ID仅用于系统,对应用程序来说是未知)。系统为每一个app的所有文件都设置权限,以便只有分配了该用户ID的应用程序可以访问它们。
  • 每个进程都有它自己的虚拟机(VM),因此应用程序的代码和其他应用程序是隔离运行的。
  • 默认情况下,每个应用程序运行在它自己的Linux进程。当应用程序的任何组件需要被执行时,Android会启动一个进程。当该进程不再需要或者系统需要为其它程序恢复内存时,都会关闭该进程。

以这种方式,Android就实现了最小特权原则:每个app之间只能通过访问组件达到工作目的;app不能访问系统未给与权限的部分。

然而,还是有方法使app之间能分享数据和访问系统服务:

  • 当两个app共享一个Linux用户ID时,它们就能互相访问文件。为了节约系统资源,拥有相同用户ID的app还可以被安排运行在相同的Linux进程中并且共享相同的VM(app必须有相同的签名)。
  • app能请求权限去访问设备数据,比如联系人、短信、SD卡……所有的app权限必须在安装时被授予。

Zygote

Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会fork出一个子进程来执行该应用程序。这样做的好处显而易见:

  1. Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作。
  2. 而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,快速的提供一个执行进程。
  3. 另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

Zygote工作流程如下图:

App组件

app组件是Android程序最重要的构造模块。每一个组件都是系统进入app的不同入口。app组件有四种不同的类型,分别为Activities、Services、Content providers和Broadcast receivers,它们都有自己的用途和生命周期。

当系统启动一个组件之后,如果这个组件所在的程序之前没有运行的话,系统会自动开始这个程序的进程,并初始化这个组件所需要的相关类。比如,你的程序开启了一个拍照功能程序的Activity,这时系统会启动这个Activity所在的程序,所以这个Activity运行在拍照功能的程序当中,而不是在你的程序中。所以,不像其他操作系统的中的程序一样,Android程序没有一个单独的入口点(比如没有我们常见的main()函数)。

因为系统中的程序运行在自己的独立进程中,并且程序中的文件都有自己的限制其他程序访问的权限,所以,你的程序不能直接激活其他程序中的组件。但是Android系统就可以。为了激活其他程序中的组件,你必须向系统发送一个消息来详细说明你要启动其他组件的意图,这样系统才会为你激活这个组件。

四大组件中的三个组件——activities、services和broadcast receiver——是由一种叫intent的异步消息来激活的。这些intents在运行时(runtime)将特定的组件绑定在一起(bind),你可以把这些intents看作来自其他组件请求活动的messengers。最后一种组件类型content provider并不是由intent来激活的(activate)。而是由接收到ContentResolver的请求时激活的。

Manifest

在Android系统可以启动一个应用程序组件之前,Android系统必须通过读取这个程序的AndroidManifest.xml(即manifest文件)文件来确定要启动的组件存在。你的程序必须在这个manifest文件声明用到的所有的组件,并且这个manifest文件必须在项目的根目录下。

另外,这个manifest文件还声明一些其他的东西,比如:

  • 确定这个程序需要的所有权限,比如Internet访问权限或者读取用户联系人权限。
  • 声明这个运行这个程序所需要的最低API版本,这个可以根据开发该程序所使用的API版本。
  • 声明该程序所需要的硬件或软件特征(features),比如照相机、蓝牙服务或者多点触屏。
  • 声明该程序需要链接(link against)的API库(不是Andorid的framework APIs),比如Google Maps library。
  • 等等。

App Resources

一个应用程序不仅仅由代码组成——它需要与代码分隔的资源。使用应用程序资源文件,可以更容易地更新你的应用程序的特性而无需修改代码,并且 — 通过提供多套备选资源文件 — 使您能够针对各种设备配置优化你的应用程序(比如不同语言或屏幕大小)。

对于你的安卓工程里面包含的每一项资源, SDK 构建工具定义一个唯一的正整数 ID 标识符,你可以使用该标识符从你的应用程序代码中或者从XML文件中定义的其他资源中特指该资源。

将资源提供工作同你的源代码分隔开来最重要的原因之一是能够使你为不同的设备配置提供可替换的资源文件。 对于备选资源,Android 支持许多不同的限定符(qualifiers)。限定符是包含在你的资源文件夹名称中的一个短字符串,以便界定哪些设备配置可使用这些资源(比如drawable-hdpi)。

Android——app基础的更多相关文章

  1. Android基础新手教程——1.2.1 使用Eclipse + ADT + SDK开发Android APP

    Android基础新手教程--1.2.1 使用Eclipse + ADT + SDK开发Android APP 标签(空格分隔): Android基础新手教程 1.前言 这里我们有两条路能够选,直接使 ...

  2. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  3. fir.im Weekly - 如何进行 Android App 性能优化

    关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...

  4. [转]Android App整体架构设计的思考

    1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...

  5. 深入浅出Android App耗电量统计

    前言 在Android统计App耗电量比较麻烦,直至Android 4.4,它仍没公开“电量统计”API或文档……额,是的,仅没有公开,并不是没有.平时在手机“设置- 电量”看到的数据 就是系统调用内 ...

  6. 原生Android App项目调用Untiy导出的Android项目

    背景:采用Google VR SDK for Unity 开发3D场景功能,然后导出Android项目,合并到一个Android App里面,供其它Activity调用. 用Google VR for ...

  7. 【Bugly安卓开发干货分享】Android APP 快速 Pad 化实现

    项目背景 采用最新版本手机 APP(之后称为 MyApp)代码,实现其 Pad 化,为平板和大屏手机用户提供更好的体验.为实现 MyApp 的 Pad 化工作,需要我们首先来了解一下 MyApp 项目 ...

  8. android app自动化测试之UIAutomator

    一.UIAutomator Android自动化测试工具有很多,但是要免费.易上手,本人觉得就直接使用Eclipse自带的UIAutomator就不错.测试人员无需跟开发要代码信息,只要手机上有安装之 ...

  9. Android App 开发技能图谱

    操作系统 Windows/MacOSX/Linux 编程语言 Java HTML/JS (Hybrid/Web App) C/C++ (NDK) SQL (DB) Kotlin 开发工具 IDE An ...

随机推荐

  1. SDOI2019 R2退役记

    还是退役了呀 Day -1 早上loli发了套题结果啥都不会 之后胡爷爷就秒了道数据结构 不过也没什么人做,于是全机房都在愉快的划水 下午来机房打了场luogu的\(rated\)赛,还是啥都不会 之 ...

  2. Lint found fatal errors while assembling a release target问题的解决方案

    此问题发生在编译为 release 版本时,出现错误提示如下: Lint found fatal errors while assembling a release target. To procee ...

  3. js日期格式化Date

    使用Date类进行日期格式化. 1 输入“yyyy-MM-dd hh:mm:ss”格式的String字符串,返回字符串 做一个简单判定,在当日显示为几点几分,同年为月日,不同年显示年月 functio ...

  4. 更新CM版本

    照着这个文章搭建的 https://blog.csdn.net/sinat_32176947/article/details/79597073 需要注意问题有 离线需要自己配置yum 地址base地址 ...

  5. JZOJ5965【NOIP2018提高组D2T2】填数游戏

    题目 作为NOIP2018的题目,我觉得不需要把题目贴出来了. 大意就是,在一个n∗mn*mn∗m的010101矩阵中,从左上角到右下角的路径中,对于任意的两条,上面的那条小于下面的那条.问满足这样的 ...

  6. Mysql8+mybatisGenerator (mysql 8的逆向工程)

    最近试了一下mysql8的逆向工程工具 1.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOC ...

  7. PHP获取网站中各文章的第一张图片的代码示例

    调取文章中的第一张图作为列表页缩略图是很流行的做法,WordPress中一般主题默认也是如此,那我们接下来就一起来看看PHP获取网站中各文章的第一张图片的代码示例 ? 1 2 3 4 5 6 7 8 ...

  8. 【JSOI2018】绝地反击

    题面 50pts 首先当然是二分答案\(mid\), 对于每一个点,以它为圆心的圆,交上攻击轨道: 那么这个点到攻击轨迹的可达范围就是一段圆弧. 怎么求这段圆弧呢? 我们知道圆弧可以用其两端点对于圆心 ...

  9. oracle创建新的连接(表空间?数据库?)

    一.创建用户名密码 create user username identified by password    --username 是用户名:password 是密码 二.给用户附权.撤权 gra ...

  10. Jquery选择器总结二

    简单选择器 1.:firstè选出匹配的元素中的第一个 2.:lastè选出匹配的元素中的最后一个 3.:eq(index)è选出匹配的元素中的指定索引位置的jquery对象(注:index从0开始) ...