作为移动端操作系统,目前最新的Android 11.0已经发展的比较完善了,现在也到了系统的整理一番的时间,接下来的系列文章将以Android开发者为中心,争取用归纳总结的态度对初级入门者所应掌握的基础知识聊以标记。
应用环境
Android系统是Google基于Linux系统开发的一套移动系统,不仅应用于手机,还有穿戴设备,TV大屏设备等多种移动场景,其优势是使得硬件具有人性化的界面(Activity),并行的服务(Service),高效的数据存储(ContentProvider),实时的通知调度(BroadcastReceiver)。然而这十多年也累积了很多弊端,像是颇为诟病的碎片化问题,被攻击的安全隐私问题等。好在官方也在深度维护着Android,基于Android系统的软件开发开发人员只能尽量规避劣势,充分发挥优势。这也是该系列文章的主旨。
在Android系统中,每个应用程序都运行在一个单独的沙箱环境中,不同应用程序之间的交互受到的限制也越来越多,这一点在Android10及以上的版本中尤为明显。(Android系统版本适配)
我们所看到的系统主界面,也是一个名为Launcher的应用程序,每个应用程序都会有一个主进程,主进程主要负责与用户的交互,包括界面显示,用户操作等。(Android系统进程及线程)
为了防止不同应用程序之间的越级操作产生安全问题,Android系统将应用程序分为了系统应用和第三方应用,不同级别的应用程序能使用的AndroidSDK接口及Android权限被严格区分。有一种简单区分系统应用和第三方应用的方法,在没有root的系统上,如果是第三方应用,允许正常用户卸载,反之就是系统应用。而这里所说的root系统,就是将Android系统上的用户权限升级为管理员权限,此行为类似于Linux系统中的su root指令。
上面的描述比较随意,如果对Android系统的底层调用感兴趣,可参考菜鸟教程-Android系统架构及其他相关文章,不再过多赘述。
通常意义上,初级的Android应用程序编程,是负责应用程序内部与AndroidSDK接口之间的交流,或涉及到应用程序与系统应用之间的交互,从而生成后缀为apk的应用安装包,以确保应用程序在Android系统上安装、运行。这也是该系列文章所涉及的范围。
本质上后缀为apk的安装包是Android系统可识别的zip压缩包,所以在电脑上可以直接将安装包的后缀改为zip,之后用压缩软件解压打开,就可以一窥究竟。下图是通过开发软件创建模板项目,以Kotlin语言开发的HelloWord安装包的解压效果。
打开这个安装包后,Android系统首先会使用META-INF文件夹下的一系列签名信息,用以校验该apk是由合法签名者发布的,而且也可以校验apk中的文件都是没有被篡改的。
之后系统会根据AndroidManifest.xml清单文件中记录的一些基本信息,供系统安装及开始运行前检查加载,当然这样解压出来的内容是计算机识别的二进制内容。
而程序最主要的逻辑代码,在classes.dex中,如果代码过多,还会有classes1.dex,classes2.dex, ...无限增加,而每个dex文件最多只能有65535个方法。
在逻辑代码中会加载使用一些图标或全局配置变量,而这些都会以xml格式的形式分类保存在res资源目录下,该目录下的子目录名包括子文件名都是Android系统规定的固定名称,其填写内容也必须符合固定格式。如果想在存放自定义的文件,可以新建assets目录使用。
在classes.dex文件和res目录之间并不是可以直接对应查找的。通常编程在res中使用的变量大多是String字符串,而且繁琐的变量名在逻辑代码中会占据大量存储空间。为了缩减classes.dex文件大小,在应用程序编译阶段,编译器会将res中的繁长变量名转换为int类型的十六进制数字表示,形成一一映射的关系,并将该关系保存在resources.arsc中,这样在逻辑代码classes.dex中使用res目录下的资源时,只需要用一个int变量表示,之后到resources.arsc中找到对应的资源变量,再去res中查找该资源变量的内容。
另外,如果开发的应用程序有使用到Kotlin语言,该压缩包中还会有kotlin目录,该目录下保存了使用的Kotlin语言中的一些定义,从而将编程阶段使用的Kotlin直接转换为dex文件。
开发环境
在Android系统4.0时代,Eclipse和AndroidStudio在Android应用开发软件市场中还是双足鼎立的状态,但是随着后来的市场发展,AndroidStudio越来越占据主导地位。至少目前看来AndroidStudio还是官方主推的Android应用编程开发软件,安装下载流程可参考AndroidStudio官方链接。
AndroidStudio是基于JetBrain Idea开发的一款软件,所以延续了JetBrain系列的风格。还是以上边HelloWord应用程序的代码为例,在AndroidStudio中以Android视图查看截图如下
这里可以看到该项目下主要有两个目录
第一个app目录是与应用开发相关的,为了实现分包管理开发的目的,AndroidStudio引入module模块的概念,而这个app目录就是一个module。在应用的模块开发策略中,经常见到多个模块的组装依赖,而项目的根目录下就会产生对应模块的目录结构。
下边的GradleScripts目录与gradle插件有关,说到gradle,主要是AndroidStudio用它来执行编译app的相关指令,在正常开发中尽量保持AndroidStudio版本与gradle插件版本一一对应的关系,不然很可能出现各种棘手的麻烦。
app目录
该目录下的内容大概能与上文对apk的解压包中各文件对应上。
manifests目录下的AndroidManifest.xml对应apk中的二进制AndroidManifest.xml。
java目录下分别三个,都是相同的包名路径,其中后缀(androidTest)路径下是可以在Android系统模拟器上运行的测试程序代码,后缀(test)路径下是单纯Kotlin环境下运行的测试程序代码,没有后缀的则是正常应用程序的逻辑代码。
java(generate)目录下则是AndroidStudio在编译上边java目录中的源代码时所产生的编译文件,一般开发者不需要手动修改。
res目录下与apk中的res文件夹对应一致,存放应用程序中所用到的资源文件。
res(generate)目录同样是AndroidStudio在编译上边res目录中的资源文件时所产生的二进制文件,包括上文apk中的resources.arsc等信息都是在该目录下生成的。
GradleScript目录
gradle插件的语法规则可以参考gradle官网教程,一般开发中使用AndroidStudio创建项目后固定的模板内容也足够了。该目录下主要有两种类型的文件,.gradle 文件是gradle插件在编译项目时用到的配置信息,.pro/.prperties 是AndroidStudio加载gradle插件或其他sdk的配置文件。注意:该目录下的任何文件编辑修改后,在AndroidStudio中都要Sync一次,才能继续后面的代码编辑。
build.gradle(Project)文件配置了项目中使用的外部第三方包仓库,包括google(),maven(),jcenter()等,另外全局脚本指令或使用的自定义gradle配置文件也可以在该文件中声明。
build.gradle(Module)文件是属于上边名为app的module下的,该文件可以配置app内部需要用到的参数信息,包括module的版本信息等。所以该文件也是开发过程中改动比较频繁的配置文件。
setting.gradle文件主要保存该项目中用到的各module名称及项目自身名称信息。
gradle-wrapper.properties文件配置了当前AndroidStudio所使用的gradle插件版本等信息。
proguard-rules.pro文件用来配置项目编译时的混淆规则。说到混淆,是在源码编译生成apk安装包时,将源码中的类名、变量名、方法名、参数名等易懂长字符串,简化为26个英文字母和数字表示。这样一方面缩减了apk中class.dex文件的大小,另一方面增加apk逆向的难度。而指定哪些类可以混淆,哪些变量不可以混淆,这些规则就是在该文件中配置的。当然该文件配置之后,需要在上边对应的module模块配置文件build.gradle(Module)中配置引用,指向该文件。
gradle.properties文件是配置AndroidStudio中使用gradle插件的配置信息,比如优化gradle的编译速度,设置编译过程使用的内存限制等信息。
local.properties文件则是配置AndroidStudio使用的AndroidSdk路径,或者JNI项目的话也会配置AndroidNdk路径。
至此,Android应用程序开发中需要用到的基本总结完毕,下一篇开始将介绍应用程序界面相关内容。