snifer

[原创]Android程序分析之认识代码

0
阅读(2252)

今年课业负担非常重,还好要结束了, 自我庆祝一下。

很多同学跟我交流Android程序中的一些基础问题,由于没有机会录播,就在此写一篇博客,简单介绍一下,希望能对大家有所帮助。

以下为一个基本入门程序HelloActivity 的源代码,通过对这个代码的分析能够让大家认识Android程序。

其中tests 是一个独立的项目,可以暂时不考虑。其他部分看作一个Android 的一应用程序的工程。这个工程主要的组成部分如下所示:
AndroidManifest.xml:工程的描述文件,在运行时有用处
Android.mk:整个工程的Makefile
res:放置资源文件的目录
src/com/example/android/helloactivity/HelloActivity.java:这是JAVA 类文件,这个文件的路径
表示在Andorid 的JAVA 包的结构中的位置, 这个包的使用方式为com.example.android.helloactivity

编译的中间结果

这个HelloActivity 工程经过编译后将生成
out/target/common/obj/APPS/He lloActivity_intermediates/ 目录, 这个目录中的内容都是HelloActivity 工程相关的, 更具体地说都与development/samples/HelloActivity/ 中的Android.mk 文件相关。


classes.dex
是一个最重要的文件,它是给Android 的JAVA 虚拟机Dalvik 运行的字节码文件。
classes.jar
是一个JAR 文件,JAR 的含义为Java ARchive,也就是Java 归档,是一种与平台无关的文件格式,可将多个文件合成一个文件。解压缩之后的目录结构:(JAVA 标准编译得到的类)

各个以class 为扩展名的文件,事实上是JAVA 程序经过编译后的各个类的字节码。

目标apk 文件:

目标apk 文件是Android 的JAVA 虚拟机Dalvik 安装和运行的文件,事实上这个apk 文件将由编译的中间结果和原始文件生成。apk 文件的本质是一个zip 包。这个APK 包解压缩后的目录结构如下所示:

需要注意的是,这里的xml 文件经过了处理,和原始的文件不太一样,不能按照文本文件的方式理解。

源代码的各个文件:

Android.mk 是整个工程的“Makefile”,其内容如下所示:
 LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

 #LOCAL_MODULE_TAGS := samples
 # Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_PACKAGE_NAME := HelloActivity
 LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
 # Use the following include to make our test apk.
 include $(call all-makefiles-under,$(LOCAL_PATH))


这个文件在各个Android 的工程中都是类似的,其中LOCAL_PACKAGE_NAME 表示了这个包的名字。LOCAL_MODULE_TAGS 表示了模块的标,在这里使用的是samples,正式的应用程序(packages 目录中的应用)中多使用eng development。

AndroidManifest.xml 是这个HelloActivity 工程的描述文件,其内容如下所示:


其中package 用于说明这个包的名称,android:labeapplication 中的内容是表示这个应用程序在界面上显示的标题,activity 中的android:name 表示这个Android 的活动的名称。

文件src/com/example/android/helloactivity/HelloActivity.java 是程序主要文件,由JAVA 语言写成。

com.example.android.helloactivity 表示的是这个包的名称, 在文件的头部引入了两个包android.app.Activity 是一个Android 活动( Activity)包,每一个Android 活动都需要继承Activity 类。
包android.os.Bundle 用于映射字符串的值。
onCreate()是一个重载的函数,在这个函数中实现应用程序创建的所执行的过程。其中setContentView()设置当前的视图(View)。
设置的方法是使用一个文件,这个文件因此决定了视图中包含的内容。这里使用的是
R.layout.hello_activity,表示从res/layout/目录中使用hello_activity.xml 文件。res/layout/hello_activity.xml 文件的内容如下所示:

其中定义了一个可编辑的文本( EditText),下面的各项其实是它的各种属性, android:text 表示这个文本的内容,string/hello_activity_text_text 表示找到相应的文件, 也就是res/value/string.xml 文件中的hello_activity_text_text 文本。
res/value/string.xml 的内容如下所示:

hello_activity_text_text 文本被res/layout/hello_activity.xml 文件引用,正是应用程序运行时在屏幕显示的文本。

就写这么多吧,其中很多内容在我的视频里用到过,大家结合起来理解就会很轻松,周末了,太阳真好。