在了解了Android基础架构以及四大组件之后,本节将正式介绍一些关于Android开发的知识和流程。
在Android开发中,主要使用的是Java语言或者Kotlin语言。其中,Java语言的使用更为普遍,虽然Kotlin语言是由Google官方专为Android设计的语言,但是在Android中App都是以字节码的形式执行的,即便使用Kotlin进行开发,在编译后最终还是以Dalvik字节码的形式存在,所以Kotlin语言和Java语言在逆向开发和分析人员眼中是一样的。Android Studio这一官方Android开发工具还提供了两种语言互转的便捷操作,证明在内存中两者具有相同的表现形式,因此这里仅以Java为例介绍Android开发。
在启动Android Studio后,Android Studio的默认界面如图2-2所示。
下面使用Android Studio开发一个Android版本的Hello World。
图2-2 Android Studio主界面
单击Create New Project选项,选择默认的Empty Activity模板,这个选项会在工程创建完成后生成一个MainActivity的空Activity类。选择模板之后,单击Next按钮进入下一步,如图2-3所示。
图2-3 选择Empty Activity
配置项目名称、包名、保存路径、语言和最低支持的SDK版本。其中,Name为项目的名称,可根据具体需要进行设置,一般会成为App最终在手机界面上的显示名称,例如“设置”;Package name为App的包名,这个包名就会作为App的唯一标志,在单部手机上不可能会安装具有相同包名的两个App;Save location表示这个项目在计算机上的存储路径;Minimum SDK可以理解为手机版本的数字代号,比如图2-4中的API 16,代表App最低运行在Android 4.1版本的手机上。笔者计算机上Android Studio SDK的最高版本为API 30,代表使用笔者的Android Studio最高可支持到Android 11版本。具体SDK版本和Android版本的对应关系可查询官网https://developer.android.com/studio/releases/platforms?hl=zh-cn,这里不再赘述。
图2-4 配置demo01
配置好这些选项后,单击Finish按钮,等待Android Studio完成一些配置和依赖包的同步;在同步完成后还需要使用USB线将手机连接到计算机,等待Android Studio界面右上角显示设备名(比如Nexus 5X),如图2-5所示。
图2-5 将手机连接到计算机
在同步完成后,依次单击Android Studio最上方工具栏中的Run→Run 'App'或者使用快捷键Shift+F10运行App,等待App安装到手机上并运行起来,一个简单的Android的Hello World就完成了,运行界面如图2-6所示。
图2-6 Android版本的Hello World
在Android Studio中从默认的Android视图切换为Project视图,以便查看项目的目录结构。视图结构默认在Android Studio页面的左方,如图2-7所示,先单击Android下三角按钮,再在下拉列表框中选择Project选项,即可切换视图为Project视图。
图2-7 切换为Project视图
此时,展开App目录会发现src/main/目录包含了App的主体部分。这个目录一般是由开发者进行存取的,通常会存储代码文件、界面描述文件、资源文件以及在Android中具有举足轻重作用的AndroidManifest.xml清单文件。AndroidManifest.xml是应用程序的清单文件,描述应用程序的基础特性,定义它的各种组件(Android中的四大组件必须在这个文件中声明,不然无法使用),定义App的启动类以及申请的权限等信息。以这里的Hello World为例,代码文件一般存储在src/main/java/com/roysue/demo01目录下,界面描述文件存储在src/main/res/layout目录下(用于描述界面上的文字和图片等资源排列),AndroidManifest.xml存储在src/main目录下。
MainActivity是一个简单的Activity活动类,具体内容见代码清单2-1。
在这个类中,onCreate()函数是在MainActivity被调用后默认加载的生命周期函数。在代码清单2-1中,onCreate()函数先调用了父类的onCreate()函数,然后调用setContentView()函数加载了在src/main/res/layout目录下定义的activity_main.xml文件作为MainActivity对应的界面(一个Activity就是一个界面)。其中,R.layout.activity_main是activity_main.xml文件的唯一标志id。
接下来,介绍一下在App中常用的点击事件。首先修改activity_main.xml视图文件,这里直接将TextView控件改成Button控件,并给这个控件分配一个id,代号为check。最终的activity_main.xml视图文件内容如代码清单2-2所示。
配置完成后,一个页面呈现为“Hello World!”的Button按钮就完成了。然后为这个控件添加点击事件的响应。首先,将代码与界面元素进行绑定,在onCreate()函数中添加代码(见代码清单2-3)。
这里的R.id是前缀,check是刚才在界面描述文件中定义的id。通过findViewById()函数将这个按钮控件与bt_check变量绑定,之后对这个变量进行的代码操作就代表了对界面上的按钮控件的操作。换言之,当用户在界面上对按钮进行操作时,实际上对事件做出响应的就是接下来对bt_check这个变量进行的代码操作,如果代码中没有实现相应的事件响应,那么用户在界面上做的操作就被无视了。接着为这个按钮添加点击事件,具体内容见代码清单2-4。
这里介绍一个Log类。Log是在Android开发中常用的日志打印类,类中存在一些不同等级的静态日志打印函数(例如,Log.e()函数,通常用于打印报错信息;log.d()函数,用于打印调试信息)。这里调用Log.i()函数打印日志,其中第一个参数为日志标签,第二个参数为日志内容。其中,日志标签tag为r0ysue,日志内容为Hello world from bt_check。在Android开发中,可使用adb logcat命令实时查看Android系统日志,或者直接使用Android Studio自带的Logcat查看(单击Android Studio界面下方的“6: LogCat”按钮查看),如图2-8所示。
图2-8 Android Studio Logcat界面
回到正题,此时重新编译运行App,在每次点击按钮后都会出现一行日志。图2-9是在点击两次按钮后运行的App界面以及点击后产生的日志。
图2-9 Android Studio Logcat界面
这里使用日志的标签tag作为过滤标签(对日志的输出进行过滤),不然会有很多其他系统相关的日志输出干扰结果。
由于本书性质和篇幅所限,基础的Android开发知识就介绍到这,建议读者参考Android开发方面的书籍深入学习一下。