首页 理论教育 HelloAndroid项目结构剖析

HelloAndroid项目结构剖析

时间:2023-06-15 理论教育 版权反馈
【摘要】:但要彻底掌握开发规律,快速编写出属于自己的Android项目,首先要了解Android的项目结构。单击HelloAndroid项目左边的“+”,展开第一层项目结构,如图1-36所示。下面详细讲解HelloAndroid项目下每一个文件夹的作用。打开HelloAndroid.java文件,可以看到相应的代码块。Android 2.2包之所以在HelloAndroid项目中会生成Android 2.2包资源文件,那是因为之前选择的是Android 2.2 API,该包下存放的是与项目开发有关的底层包。

HelloAndroid项目结构剖析

看到第一个Android程序运行成功,相信读者也想赶快来开发属于自己的Android项目。但要彻底掌握开发规律,快速编写出属于自己的Android项目,首先要了解Android的项目结构。单击HelloAndroid项目左边的“+”,展开第一层项目结构,如图1-36所示。下面详细讲解HelloAndroid项目下每一个文件夹的作用。

(1)src文件夹

Android项目遵循了现今普遍使用的三层架构模式(MVC模式),在src文件夹下存放的就是“C(业务逻辑)”代码,它是以“.java”后缀名结尾的文件,如图1-37所示。打开HelloAndroid.java文件,可以看到相应的代码块。

978-7-111-37968-3-Chapter01-38.jpg

图1-36 HelloAndroid第一层结构

978-7-111-37968-3-Chapter01-39.jpg

图1-37 src文件夹内容

下面我们重点分析HelloAndroid项目的主程序文件HelloAndroid.java,如代码清单1-1所示。

代码清单1-1 第1章HelloAndroid项目中的HelloAndroid.java文件

978-7-111-37968-3-Chapter01-40.jpg

在代码清单1-1中,主程序HelloAndroid类继承了Activity类,重写了void on Create(Bundle savedInstanceState)方法。在onCreate方法中通过设置setContentView(R.layout.main)来显示画面,R.layout.main表示界面布局,该布局在res下的layout中创建(res\layout\main.xml)。

(2)gen文件夹

gen文件夹如图1-38所示。存放的是系统自动生成的项目索引文件,如在res\layout\main.xml中定义一个文本框(TextView)id为“@+id/TextView1”则会在R.java中生成对应的代码:“public static final int TextView1=0x7f050000;”,具体代码如代码清单1-2所示。

978-7-111-37968-3-Chapter01-41.jpg

图1-38 gen文件夹内容

代码清单1-2 第1章HelloAndroid项目中的R.java文件内容

978-7-111-37968-3-Chapter01-42.jpg

需要注意的是,R.java是自动生成的索引文件,这个文件是只读模式,不能更改,它是Android项目文件夹下各个对象的索引。如:public static final class drawable方法下存在的是res/drawable文件的索引,public static final class id方法下存在的是所有取了id名称的文件的索引。

(3)Android 2.2包

之所以在HelloAndroid项目中会生成Android 2.2包资源文件,那是因为之前选择的是Android 2.2 API,该包下存放的是与项目开发有关的底层包。可以说所有Android应用程序开发都是基于这个包进行的,我们可以调用包里面的方法与属性,实现更多的功能,如图1-39所示。

978-7-111-37968-3-Chapter01-43.jpg

图1-39 Android 2.2包内容

(4)assets文件夹

assets文件夹存放的是不进行编译加工的原生文件,即表示该文件夹里面的文件不会像xml文件一样被预编译,主要存放的是一些图片及html、js、css等文件。在后面的章节中会介绍如何读取assets文件夹下的资源。

(5)res文件夹

res文件夹下存放的也是资源文件,这些资源文件与assets文件夹下存放的资源文件的不同之处在于:res下存放的是需要进行编译加工的原生文件,而assets下存放的是不需要进行编译加工的原生文件。在res文件夹下默认有

drawable-hdpi、drawable-mdpi、drawable-ldpi、

layout及values等文件夹,如图1-40所示。下面将一一介绍各个部分的功能。

978-7-111-37968-3-Chapter01-44.jpg

图1-40 res文件夹内容

drawable-hdpi、drawable-mdpi、drawable-ldpi一般用来存放图片,Android操作系统的手机可能采用不同的手机分辨率,因此在开发过程中会要求使用具有不同分辨率的图片。drawable-hdpi中存储的是高分辨率的图片,drawable-mdpi中存储的是中等分辨率的图片,而drawable-ldpi中存储的是低分辨率的图片,所以,开发者需要把相同的图片用图片处理软件处理成不同分辨率的图片,然后保存在对应的文件夹中。当然,如果属于学习阶段,也可以在三个目录下保存相同的图片。

在layout文件夹下存放的是外观文件,相当于三层架构模式(MVC)中的“V层代码。刚才我们所说的main.xml文件就是放在该层下,如代码清单1-3所示。从代码清单中可以看出:该文件是一个xml文件,在程序的开头需要加入<?xmlversion="1.0"encoding="utf-8"?>xml文件标志,接下来的代码片段才是xml布局的正文代码,主要定义了相应的控件及布局,这一部分的代码内容将在接下来的章节中使用与讲解。

代码清单1-3第1章HelloAndroid项目中的main.xml文件(www.xing528.com)

978-7-111-37968-3-Chapter01-45.jpg

在values文件夹下自动生成一个“strings.xml”文件,在该文件中常常定义一些常量,如程序的标题等,如代码清单1-4所示。看到resources节点下的两行代码是不是感觉似曾见过?这就是模拟器上显示的文字,“Hello World,HelloAndroid!”。需要注意的是,所有的常量都必须写在resources节点下。

代码清单1-4 第1章HelloAndroid项目中的strings.xml

978-7-111-37968-3-Chapter01-46.jpg

(6)AndroidManifest.xml

AndroidManifest.xml配置文件,它是每个Android程序中必需的文件,如代码清单1-5所示。它位于application的根目录下,描述了package中的全局数据,除了包括该项目中常使用的activity、services、receiver,providers及intentreceivers,还可以指定permissions、instrumentation等成员。表1-3和表1-4列出了所有成员的具体含义功能。

代码清单1-5 第1章HelloAndroid项目中的AndroidManifest.xml

978-7-111-37968-3-Chapter01-47.jpg

978-7-111-37968-3-Chapter01-48.jpg

AndroidManifest.xml是一个xml文件,因此在文件的第一行包含了xml文件的声明。第一个节点<manifest>,几乎所有的AndroidManifest.xml(以及许多其他Android的xml的文件)在第一个元素中包含了命名空间的声明xmlns:android=http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

在<manifest>节点下默认包含<application>和<uses-sdk>节点,可以声明其他节点,以实现更多的功能。大部分<manifest>包含了单个<application>的元素,它定义了所有的application级别组件和属性,并能在package中使用。<application>节点下一个很重要的功能就是它包含<activity>节点,任何被用户看做顶层应用程序,并能被程序启动器所用的package,需要包含至少一个Activity组件来支持MAIN操作和LAUNCHER种类,且在该节点下定义了那些在src中定义的java文件。如在src中使用到了一个HelloAndroid.java,它继承了Activity,并设置了它要显示的布局是layout下的main.xml,那就必须在<application>节点下定义一个<activity>,其中android:name=".HelloAndroid",就是指HelloAndroid.java的名称。因此,若要在界面上运行继承了Activity的文件对象,都必须在配置文件中声明一个<activity>节点,如果没有,则应在AndroidManifest.xml中声明一个<activity>节点,否则该activity文件将不能运行。

在<activity>节点下使用<intent-filter>,就是让应用程序组件告诉Android底层系统,它们能为其他程序组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。为了注册一个应用程序组件为Intent处理者,在组件的manifest节点添加一个<intent-filter>标签。在该节点里使用下面的标签(关联属性)就能指定组件支持的动作、种类和数据。可以说,一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中的某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。<intent-filter>节点下还包含<category>,指定应用程序默认启动的Activity。<uses-sdk>则定义了应用程序所使用的SDK版本,也就是前面讲的API Level的值。AndroidManifest.xml配置文件的默认详细功能如表1-3、表1-4所示。

表1-3 AndroidManifest.xml默认配置文件详情

978-7-111-37968-3-Chapter01-49.jpg

表1-4 AndroidManifest.xml其他可配置的选项

978-7-111-37968-3-Chapter01-50.jpg

(7)default.properties

default.properties文件记录项目中所需要的环境信息,比如Android的版本类型等。一般default.properties文件代码中的注释已经把default.properties解释得很清楚。如果某个项目没有default.properties这个文件,可以直接从其他项目中复制过来使用。“target=android-8”表示使用android2.2平台开发。下面为HelloAndroid项目中default.properties的代码清单1-6

代码清单1-6 HelloAndroid项目中default.properties

978-7-111-37968-3-Chapter01-51.jpg

978-7-111-37968-3-Chapter01-52.jpg

(8)proguard.cfg文件

在讲述proguard.cfg文件内容之前,先介绍proguard.cfg的功能,它具有实现Android Java混淆器的功能。Java的字节码一般是非常容易反编译的,为了保护Java源代码,往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆,它是一个Source Forge上非常知名的开源项目,网站地址是:http://proguard.sourceforge.net/。当然它还有对字节码进行缩减体积、优化等功能。

在Android 2.3以前,Android代码只能手动添加ProGuard来实现代码混淆,非常不方便。而Android 2.3以后,Google已经将这个工具加入到了SDK的工具集里。具体路径:SDK\tools\proguard。当创建一个新的Android工程时,在工程目录的根路径下,会出现一个ProGuard的配置文件proguard.cfg。也就是说,我们可以通过简单的配置,在eclipse工程中直接使用ProGuard混淆Android工程。具体混淆的步骤也非常简单,只需要在工程描述文件default.properties中添加一句话,启用ProGuard,如代码清单1-7所示。

代码清单1-7 在HelloAndroid项目的default.properties中增加混淆功能

978-7-111-37968-3-Chapter01-53.jpg

这样,ProGuard就可以使用了。当我们正常通过Android Tools导出Application Package时,ProGuard就会自动启用,从而达到混淆所编写的代码的功能。

关于proguard.cfg配置,进一步思考混淆后的结果就会发现:如果那些提供给外部的类、方法、变量等名字被改变,那么程序本身的功能就无法正常实现。而ProGuard如何知道哪些是可以改名,哪些是不能改变的呢?这主要是靠proguard.cfg文件来进行配置。在Android工程中,默认自动生成的proguard.cfg已经针对Android的一般情况进行了配置,下面我们打开这个配置文件,具体内容如代码清单1-8所示。

代码清单1-8 HelloAndroid项目中proguard.cfg配置文件的内容

978-7-111-37968-3-Chapter01-54.jpg

978-7-111-37968-3-Chapter01-55.jpg

它主要保留了继承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类。之所以保留这些子类,是因为这些子类都可能被外部调用。另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类。在实际的工程项目中,可能Google自动生成的配置不能胜任我们的混淆工作。所以,往往需要自己编写一些ProGuard配置,这方面更详细的资料可以在Google官网上的Manual→Usage里找到。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈