首页 > 代码库 > 利其器:Android应用开发的几个概念的区分

利其器:Android应用开发的几个概念的区分

前言:

学习Android应用开发的时候,经常在eclipse里面看到很多名词,让人很迷惑,问别人也是说的不知所云。所以还是自己上网查找比较靠谱,参考链接都在最后。

??

涉案名单:

Intel x86 Atom System Image

Google APIs Intel x86 Atom System Image

Android API Levels

Android Platform Version

Android SDK Version

Google APIs

Android version names

??

学习途径:

网上博客和问答论坛搜了一堆,最后发现还是官网文档说的最全,本来搜博客就是为了逃避看官网文档,最后却发现官网文档是最能解决疑惑的地方,也确实是讽刺。

所以编程类最好查资料时先查官方文档,然后查离官方文档最近的社区,最后再查书和博客。

对官方文档往往容易有误解,第一感觉就是官方文档大而全缺少趣味,加上又是全英文大大降低了阅读动机。实则不然,官方文档最大的优势在于信息充足,概念明确,非二次博客所能取代,能节省大量时间。

??

------------------------------以下为自己的理解,可能有不对的地方

Android Platform Version升级意味着什么?

Android归根到底是一个软件,一个操作系统,它依赖于硬件,同时硬件也依赖于它,二者相依为命。

我们知道Android的图标是一个机器人,那么就把Android设备(比如手机、平板、手表以及各种嵌入式设备)比作一个机器人,而机器人的大脑或者机器人的软件系统就是Android了,我这种软硬结合称作Android Platform

技术分享

??

Platform Version的每一次增加无非意味着软件升级或者硬件升级,这两者是混合在一起的。

在官方文档uses-sdk-element中的一个对应表格中,点击查看Android 5.0平台版本相对于之前版本所带来的改变:

技术分享

进入Platform Highlight查看,这个页面描述了这个版本(Lollipop: 棒棒糖)的最大特色:

技术分享

浏览网页后可以发现,系统更多地体现在算法提升和架构稳定性的改进上,另外为外设提供更多的支持。可见Android更多地是为人们的各种应用需求服务的,大大超出了内核所能提供的基础功能。而且还包含了用户体验方面的内容,比如页面设计规范的提出。

而所有这些新功能引入导致Android Platform的升级,必然带来API Level的升级,那么API Level升级意味着什么?打开Android源码目录查看一下或者在网上也可以:

为了保持向下兼容,理论上说API(也就是函数调用的名字、参数、返回值)应该只增加或者只修改实现,而没有删除,但实际是有删除的,毕竟Android其实也类似一个大的应用程序(因为OS的基本功能已经被内核实现了),很难保证接口始终不变,而内核相对而言对接口要求要稳定许多:

下面是Android 5.0源码目录:

技术分享

点击进去查看当前API版本和上一个API版本的差异报表:

技术分享

??

Android Platform Version和API Level的关系?

如果把Android Platform比作一个变形金刚(肉身)的话,那么API Level可以理解为变形金刚的技能等级,随着变形金刚这个实体的不断升级,它的技能等级也越来越高。变形金刚实体版本可以理解为对外发行版本,就好比豪车的发行版本,对外发行往往考虑到一些商业的或人方面的因素,版本号也不是那么连续而且还起了特殊的花名(就好比你给家里的每只小宠物狗(假设你确实养了好多只)都起一个堆数字名字一样,总不能是1号狗,2号狗...吧),但是API Levels则是连续递增的整数,其实也不奇怪,毕竟API是给开发人员用的(明确区分最重要)。

技术分享

??

Android SDK、Android APIs、Android API什么关系?

首先想想什么是API?

API (Application Programming Interface)就是应用程序接口的意思,不要误以为只有操作系统可以提高API,其实任何程序都可以提供API,如果A程序调用了B程序提供的功能接口,那么B程序的这个功能函数接口就是A程序的API。

FB上有人提出一个比方,如果把皮卡丘比作一个程序,那么他就为呢提供了两个API功能,一个是钢铁尾巴,一个是雷电,虽然你不知道皮卡丘是个什么鬼,更不要说他居然会使用雷电了==!反正你只要说:"上吧皮卡丘,使用雷电吧!"

??

技术分享

??

这几个概念前面的Android都可以换成其他的系统,比如windows,比如ARM,比如XXOO等等,也就是Android是个修饰词而已。

为什么APIs比API多个s呢?正如Dogs和Dog的区别一样,s表示复数,但是这里多了一层含义:API是互相联系的,为了实现复杂功能也为了更好地分层和分模块管理功能,调用一个API往往需要同时调用

许多基础的API来实现某些功能,所以干脆打包成APIs来提供给开发者。所以有时你会发现你调用的API本身并没有实现你要的功能,而是调用了一组其他的API,也就是这个原因。

打个比方吧,李刚儿子和李刚就好比两个API,他们组合成APIs,如果你是李刚儿子的同学,你调用李刚API的时候,必然要调用李刚儿子的爸爸李刚API,否则谁鸟你,李刚儿子只有配合了李刚才能发挥作用。

SDK是什么呢?

SDK就是软件开发工具,是前面修饰词厂商提供的,比如Android SDK就是Google提供的。没有SDK你能不能开发呢?当然能,你自己把SDK帮你完成的工作手工做一遍就行了,但几乎是不现实的,所以要有SDK来辅助你开发,而且需要对应平台的提供商来提供,当然了其他提供商也是可以的如果他们有能力的话,这个JDK的功能是类似的。

Android SDK开发工具提供了

技术分享

??

Android SDK Manager界面:

??

技术分享

??

如何为应用程序选择合适的API Levels呢?

官方文档总结的很好。这里简单说下。加入你有一个小米手机,上面装的系统是5.0的,对应的API版本是21,这意味着你编写的程序安装在上面时可以无障碍和API 21包含的函数接口通信。随着API版本的升级,比如你把手机刷机到6.0了,对应的API版本也升级到了23,那么API 23相对API21就新增了许多功能接口,显然你为API 23编写的APP如果用到了这些新功能就无法在旧机上使用了,除非你额外把用到的库打包到程序里。

那么如何选择最低运行platform version呢?如果你想让更多的人使用你的程序,显然把版本设置的越低越好,但是如果太低你的程序就能调用那些高阶的功能接口,而这会影响你程序的质量。所以不能太低。折中的方法就是少数服从多数,我们选择市场占有率最大的版本作为我们的开发版本。

Android API levels大概分类,摘自Stackoverflow:

  • Android 1.5 - 2.3 (API levels 3-10) - Android made specifically for smartphones.
  • Android 3.0 - 3.2 (API levels 11-13) - Honeycomb, Android made for tablets.
  • Android 4.0 - 4.4 (API levels 14-19) - A big merge with tons of additional functionality, totally revamped Android version, for both phone and tablets.
  • Android 5.0 - 5.1 (API levels 21-22) - Material Design introduced.
  • Android 6.0 - 6.… (API levels 23-…) - Runtime Permissions,Apache HTTP Client Removed

??

tools/build-tools/platform-tools目录下部分工具介绍及其他工具,详见参考链接13:

aapt

全称Android Asset Packaging Tool,主要用有三个:

a. 生成R.java文件

b. 配置AndroidManifest.xml

c. 编译资源

aapt的参数很多,功能强大,很多自定义的打包流程都可以通过调整aapt的参数来实现,比如Q立方的

分包打包,为了避免修改代码中R.java的import路径,可以指定aapt生成R.java的包名。更多的参数可查看aapt的帮助,打包过程有特殊需求的,应该第一时间先看看aapt支不支持。

adb

使用频率最高的工具,常用的什么install,uninstall,push,pull等就不多介绍了,这里列举一些其他情况常用的命令:

"adb forward":映射手机上的端口到本地端口,调试网络应用的时候很有用

"adb shell pm clear":清除包的所有数据,SD卡自定义路径的数据除外

"adb shell pm enable/disable":启用或者禁用Android Component或者Android应用,如果想强制停止一个应用程序,杀死所有该应用的进程,并且防止自动启动的话,disable很好使,这个是不会清除数据的

"adb shell am start":启动一个Activity,可以通过包名类名,也可以通过Action

"adb shell am startservice":启动一个Service

"adb shell am broadcast":发送一个广播

"adb shell am force-stop":杀死一个应用程序及其进程

"adb shell dumpsys":dump当前系统的状态,十分有用,包含cpuinfo、meminfo、activity stack等等,调试利器,支持的状态如下,每个状态的子命令可以用"adb shell dumpsys xxx -h"查询,例如"adb shell dumpsys activity -h"

"adb shell bugreport":有时候出了问题,但是没有抓到日志的话,可以用这个命令把日志dump出来,Android会保存一段时间的crash日志

"adb shell screenrecord":4.4开始支持使用这个命令录制屏幕操作的视频,比普通软件的效果好很多,用来做演示等很有用

fastboot bootloader模式下使用的命令,刷机、解锁必备

jobb.bat 用于创建APK Expansion Files的工具,因为有的Android应用很大,比如游戏,一搞就1、2G,会导致APK文件过大,所以Android提出了APK Expansion Files的概念,就是把大的数据文件和程序本身分开,这样用户可以安装了应用之后再去下载数据文件

etc1tool 用来把png图像转换成ETC1格式的工具,ETC1格式用于OpenGL的材质贴图

Virtuous Ten Studio 逆向工程集成环境,我一直在用

dex2jar Dex字节码转换成class文件

AVD Manager:Android虚拟机管理界面

SDK Manager:SDK管理工具,用于更新SDK

Android NDK:NDK支持开发Android Native Library,以及使用C/C++来开发Android应用,目录结构跟SDK大体上是差不多的,需要一些Linux开发知识来理解

?

最后一个问题:为什么Android框架搞这么复杂?

我觉得所有的复杂都是为了简单,人脑够复杂了,但是功能似乎很简单-想东西。

同理Android框架复杂即使为了最大化地简化编程,尽可能地想出一种机制来使应用层完成想要的任何策略,想出这么一种机制是复杂的,用机制的复杂来换却策略的独立。

至于怎么想出这么一种机制的,则是另外一回事了。

??

grep "name" * ./* -nR

??

参考链接:

  • Android Developer 最好每个月都看看这个上面的更新
  • Android Source
  • <uses-sdk> 详细的官方文档
  • Understanding Android API Levels 对于eclipse里的那些混乱的版本配置解释了下
  • What does API level mean?
  • API ? SDK? 傻傻分清楚
  • 问下大神们Android SDK的每个版本有什么区别呢?
  • 详解Android SDK 目录和作用
  • Android SDK目录结构及作用
  • What are the Android SDK build-tools, platform-tools and tools? And which version should be used?
  • More Info on Android Build tools and commands
  • eLinux.org?是 Linux 基金会下属?Consumer Electronics Linux Forum?维护的一个 Embedded Linux Wiki。该 Wiki 全面系统地梳理了嵌入式 Linux 方方面面的知识。
  • Android入门-工欲善其事必先利其器 介绍了SDK 目录下的部分工具

    ??

    ??

利其器:Android应用开发的几个概念的区分