利其器:Android应用开发的几个概念的区分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利其器: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应用开发的几个概念的区分的主要内容,如果未能解决你的问题,请参考以下文章
工利其器Android Lint篇——为Android量身定做的静态代码审查工具