Android开发环境使用工具Eclipse IDE工程目录结构
Android开发环境使用工具Eclipse IDE工程目录结构
一、Eclipse IDE新建Android工程项目后的界面(Android 2.3.3版本)
1、src目录:存放工程项目的源代码(逻辑编程程序),包含即将创建的Java源代码(逻辑编程程序)文件,根据package结构管理的,与普通java项目中的/src目录很相似。
2、gen目录:自动生成的文件目录。该目录下的所有文件都是ADT(Android Development Tools,即安卓开发工具,为Android开发提供开发工具的升级和变更。)自动生成的,一般并不需要去修改,实际上该目录下只定义了一个R.java文件,该文件相当于工程项目的字典,为工程项目中用户界面、字符串、图片尺寸等资源都会在该类中创建其惟一的ID,当工程项目中使用这些资源时,会通过该ID来引用这些资源。
3、Android版本目录:该目录包含了工程项目需要的库文件(Jar文件),这和普通Java项目中的/lib目录很相似。同时其中还包含工程项目打包时所需的META-INF目录。
4、AndroidDependencies目录下的assets目录:资源路径目录,不会在R文件注册。该目录用于存放工程项目相关的资源文件,这个目录和res目录包含的xml文件差不多,也是应用程序中要引用到的一些外部资源。但主要区别在于这些资源是以原始格式保存,且只能用编程方式读取。例如文本文件,视频文件,MP3音频等媒体文件。区别于res目录包含图片、布局文件以及参数描述文件等。
5、res目录:该目录用于存放应用程序中经常使用的资源文件,其中包括图片、布局文件以及参数描述文件等。区别于AndroidDependencies目录下的assets目录包含文本文件,视频文件,MP3音频等媒体文件。
6、AndroidManifest.xml文件:应用程序应用功能清单文件。该文件包含了Android应用程序应用功能信息,是每个Android项目工程中的重要文件,在软件安装的时候被读取。Android中的四大组件(Activity、ContentProvider、BroadcastReceiver、Service)都需要在该文件中,以及运行这个Android应用程序所需的用户权限列表,例如:电话、短信、互联网、访问SD卡,同时也详细描述了Android应用的项目结构。
7、proguard-project.txt文件:用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆,从而让破解者难以阅读。
8、project.properties文件:工程项目属性的配置文件,配置编译的版本等。ADT14 以后, project.properties和default.properties合并成了project.propert ies。供Eclipse使用,用来读取该工程项目中所使用的Android版本号。
二、src目录:存放工程项目的源代码(逻辑编程程序),包含即将创建的Java源代码(逻辑编程程序)文件,根据package结构管理的,与普通java项目中的/src目录很相似。其中cn.com.qiang.helloworld 是包名,MainActivity.java 是默认的源代码文件。如下图所示。
打开src目录下MainActivity.java文件后的源代码(逻辑编程程序)如下所示。
package cn.com.qiang.helloworld; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity
{ @Override protected void onCreate(Bundle savedInstanceState)
{ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu)
{ // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }
三、gen目录:自动生成的文件目录。该目录下的所有文件都是ADT(Android Development Tools,即安卓开发工具,为Android开发提供开发工具的升级和变更。)自动生成的,一般并不需要去修改,实际上该目录下只定义了一个R.java文件,该文件相当于工程项目的字典,为工程项目中用户界面、字符串、图片尺寸等资源都会在该类中创建其惟一的标识号,当工程项目中需要使用这些资源时,会通过调用R.java文件下该标识号来索引相应标识号所对应的资源文件。如下图所示。
打开gen目录下R.java文件后的源代码(R程序)如下所示(其中一部分)。
public final class R { public static final class attr { } public static final class drawable//对应res目录下的drawble文件 { public static final int ic_launcher=0x7f020000; public static final int p0015=0x7f020001; public static final int p0022=0x7f020002; } public static final class id { public static final int action_settings=0x7f080000; } public static final class layout//对应res目录下的layout文件 { public static final int activity_main=0x7f030000; } public static final class menu//对应res目录下的menu文件 { public static final int main=0x7f070000; } public static final class string//对应res目录下的string文件 { public static final int action_settings=0x7f050001; public static final int app_name=0x7f050000; public static final int hello_world=0x7f050002; } }
由以上可知:R.java文件中默认有 attr、drawable、id、layout、string 等四个静态内部类,每个静态内部类分别对应一种资源。在xml文件中 , 比如main .xml或AndroidMainfest.xml文件中通过“@drawable/icon”的方式来调用R.java文件下静态内部类"drawable"下静态属性"icon"(标识号)来索引含有该静态属性"icon"(标识号)的“drawable-hdpi”资源文件来获取drawable-hdpi”资源文件下的图片资源。其中“@”代表的是 R.java 类,“drawable”代表 R.java中的静态内部类“drawable”,“/icon”代表静态内部类“drawable”中的静态属性“icon”,即标识号。而该属性可以指向res目录下的“drawable-hdpi”中的 icon.png 图标。还有一种情况:在用户界面布局文件中,当我们需要为一些组件(控件)添加、id属性作为标示,可以使用如下的表达式"@+id/string_name"。其中“@”代表的是R.java类,“+”表示在R.java的名为id的内部类中添加一条记录,"id"表示R.java 类下的id静态内部类。如 "@+id/button"的含义是在 R.java 文件中的id这个静态内部类添加一条常量名为button,该常量就是该资源的标识号。如果id这个静态内部类不存在,则会先生成它。通过该方式生成的资源标识号,仍然可通过"@id/string_name"方式来调用R.java文件下静态内部类"id"下静态属性"string_name"(标识号)来索引含有该静态属性"string_name"的某资源文件来获取某资源文件下的资源。另外在逻辑编程文件(即java文件)中可以通过 Button btn = (Button) findViewById(R.id.button)来引用button。再如layout静态内部类对应layout中的用户界面布局文件,其中每个静态内部类中的静态常量分别定义一条资源标识号,如“ public static final int main=0x7f030000;”中的main,对应的是layout目录下的main.xml 文件。具体的对应关系,如下图所示。
由以上可知:当开发者在 res目录中任何一个子目录中添加相应类型的文件之后,ADT会在 R.java 文件中相应的匿名内部类当中自动生成一条静态int 类型的常量,对添加的文件进行索引。如果在layout目录下在添加一个新的界面,那么在public static final class layout 中也会添加相应的静态int常量。相反的,当我们在res目录下删除任何一个文件,其在R.java中对应的记录会被ADT自动删除。 再比如说我们在strings.xml添加一条记录,在R.java的string内部类中也会自动增加一条记录。
四、Android版本目录:该目录包含了工程项目需要的库文件(Jar文件),这和普通Java项目中的/lib目录很相似。同时其中还包含工程项目打包时所需的META-INF目录。
五、AndroidDependencies目录下的assets目录:资源路径目录,不会在R文件注册。该目录用于存放工程项目相关的资源文件,这个目录和res目录包含的xml文件差不多,也是应用程序中要引用到的一些外部资源。但主要区别在于这些资源是以原始格式保存,且只能用编程方式读取。例如文本文件,视频文件,MP3音频等媒体文件。区别于res目录包含图片、布局文件以及参数描述文件等。
六、bin目录:编译生成目录。属于二进制文件,包括class、资源文件、dex、apk等。
七、res目录:该目录用于存放应用程序中经常使用的资源文件,其中包括图片、布局文件以及参数描述文件等。区别于AndroidDependencies目录下的assets目录包含文本文件,视频文件,MP3音频等媒体文件。
(1)、drawable-*dpi文件夹:有四个文件夹,用于存储.png、.9.png、.jpg等图片资源(.9.png是Android特有的图片格式,可以根据情况进行拉伸,达到不变形的效果。),区别只是将图标按分辨率高低来放入不同的目录。drawable-hdpi:用来存放高分辨率的图标。drawable-mdpi:用来存放中等分辨率的图标。drawable-ldpi:用来存放低分辨率的图标。程序运行时可以根据手机分辨率的高低选取相应目录下的图标。不过,如果不想准备过多图片,那么也可以只准备一张图标将其放入三个目录的任何一个中去。
(2)、layout文件夹:存放应用程序的布局文件,这些layout是以xml形式保存的,关于layout的进一步信息,可以参考android文档中的UI layout。
打开layout文件夹下的activity_main.xml文件后源代码如图所示。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </LinearLayout>
(3)、menu文件夹:设置菜单文件夹。
(4)、values文件夹:这个目录包含了一些xml文件,主要是应用程序中要引用的key-value对。这些xml文件声明了数组(array)、颜色(color)、度量(dimension)、字符串(strings)等。之所以把这些东西分别放在单独的xml文件中,原因有二。拿strings.xml文件来说。原因一:主要是考虑到这些值能够在不更改源代码的情况下,可用于多语言环境。原因二:减少应用程序的体积,降低数据冗余。假设在应用程序中要使用“我们一直在努力”这段文字 10000 次,如果我们不将“我们一直在努力”定义在 strings.xml 文件中,而是在每次使用时直接写上这几个字,这样下来程序中将有 70000个字,这 70000 个字占 136KB 的空间。由于手机的资源有限,其 CPU 的处理能力及内存是非常有限的,136KB 对手机程序来说是个不小的空间,在做手机应用程序一定要记住“能省内存就省内存”。如果将这几个字定义在 strings.xml 中,在每次使用到的地方通过调用Resources 类的getResources()方法来引用该文字,就只占用了 14B,因此对降低应用体积效果是非常有效地。当然我们可能在开发时可能并不会用到这么多的文字信息,但是“不以善小而不为,不以恶小而为之”,作为手机应用开发人员,我们一定要养成良好的编程习惯。
分别打开value文件夹下的strings.xml文件、dimens.xml文件、styles.xml、colors.xml、arrays.xml文件后源代码如图所示。
1、strings.xml文件:源代码如下所示,用来定义字符串数据,在 Activity 中使用 getResources().getStrings(resourceId)或getResources().getText(resourc) eId)来取得这些资源,在layout.xml中使用android:text="@string/hello_world"来取得这些资源。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">QQ</string> <string name="action_settings">Settings</string> <string name="hello_world">你好啊!!哈哈!!</string> </resources>
2、dimens.xml文件:源代码如下所示,dp表示宽度,sp表示字体大小。用来定义尺寸数据,在 Activity 中使用 getResources().getDimension(resourceId)来取得这些资源。
<?xml version="1.0" encoding="UTF-8"?> <resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> </resources>
3、styles.xml文件:源代码如下所示。用来定义样式。
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="sharpText"> <item name="android:textSize">18px</item> <item name="android:textColor">#008</item> </style> </resources>
4、colors.xml文件:源代码如下所示。用来定义颜色,在 Activity 中使用getResources().getDrawable(resourceId) 与getResources().getColor(resourceId)来取得这些资源。
<?xml version="1.0" encoding="UTF-8"?> <resources> <color name="contents_text">#ff000000</color> </resources>
5、arrays.xml文件:源代码如下所示。用来定义数组,在 Activity 中使用getResources().getStringArray(resourceId)来取得String 数组资源。
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球</item> <item>篮球</item> <item>太极</item> <item>乒乓球</item> </string-array>
</resources>
八、AndroidManifest.xml文件:应用程序应用功能清单文件。该文件包含了Android应用程序应用功能信息,是每个Android项目工程中的重要文件,在软件安装的时候被读取。Android中的四大组件(Activity、ContentProvider、BroadcastReceiver、Service)都需要在该文件中,以及运行这个Android应用程序所需的用户权限列表,例如:电话、短信、互联网、访问SD卡,同时也详细描述了Android应用的项目结构。主要包含以下功能。
1、命名应用程序的 Java 应用包,这个包名用来唯一标识应用程序。
2、描述应用程序的组件——活动、服务、广播接收者、内容提供者,对实现每个组件和公布其功能(比如,能处理哪些意图消息)的类进行命名。这些声明使得 Android 系统了解这些组件以及它们在什么条件下可以被启动。
3、决定应用程序组件运行在哪个进程里面。
4、声明应用程序所必须具备的权限,用以访问受保护的部分 API,以及和其它应用程序交互。
5、声明应用程序其他的必备权限,用以组件之间的交互。
6、列举测试设备 Instrumentation 类,用来提供应用程序运行时所需的环境配置及其他信息,这些声明只在程序开发和测试阶段存在,发布前将被删除。
7、声明应用程序所要求的 Android API 的最低版本级别。
8、列举 application 所需要链接的库。
打开AndroidManifest.xml文件后的源代码如图所示。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.com.qiang.helloworld" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <application android:allowBackup="true" android:icon="@drawable/p0015" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="cn.com.qiang.helloworld.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
(1)、<manifest>元素语句
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.com.qiang.helloworld" android:versionCode="1" android:versionName="1.0">
该元素是 AndroidManifest.xml 文件的根元素。其中根据 xml 文件的语法 ,“ xmlns:android ”指定该文件的命名空间 。 功能清单文件会使用“http://schemas.android.com/apk/res/android”所指向的一个文件。“package”属性是指定 Android 应用所在的应用程序包,以后会经常说到“应用程序包”,“应用程序包”就是指该属性的内容。“android:versionCode”指定应用程序的版本号,如果应用程序需要不断升级,在升级的时候应该修改该值。“android:versionName”是版本名称,名称的取定可根据爱好而定。
(2)、<application>元素语句
<application android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="cn.com.qiang.helloworld.MainActivity"//或写成android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
1、<application>的“icon”属性用来设定应用程序的图标,表达式icon="@drawable/icon" 表示通过调用R.java文件下静态内部类"drawable"下"icon"(标识号)来索引"icon"(标识号)所对应“drawable-hdpi”资源文件来获取图片资源。指向的是"drawable"文件 下的icon.png 图片,与R.java中元素的对应关系,如下图所示。
2、<application>的“label”属性用来设定应用程序的名称。表达式 “@string/app_name”含义与上面的表达式“@drawable/icon”一样,同样是指向 R.java 文件中的string静态内部类中的 app_name 属性所指向的资源。在这里它指向的是“strings.xml”文件中的一条记录“app_name”,其值为“QQ”,因此,这种表达方式等价于 android:label= " QQ"。
3、<application>的“theme”属性用来设定应用程序的主题样式。表达式 “@style/AppTheme”含义与上面的表达式“@drawable/icon”一样,同样是指向 R.java 文件中的style静态内部类中的AppTheme属性所指向的资源。在这里它指向的是“style.xml”文件中的一条记录“AppTheme”。
4、<activity>元素的作用是注册一个Activity信息,当我们在创建“01_项目名”这个工程项目时,指定Create Activity属性为“MainActivity”,之后 ADT在生成工程项目时自动创建了一个 Activity名称,就是“MainActivity.java”,Activity在Android中属于组件,它需要在功能清单文件中进行配置。<activity>元素的“name”属性指定的是该Activity的类名。可以看到这个属性值“.MainActivity”中的“.”,“.”代表的是在上面<manifest>元素“package”属性中指定的当前包。因而“.MainActivity”的含义等价于“cn.com.qiang.helloworld.MainActivity.java”。
5、<intent-filter>元素中intent的中文可以理解为“意图、目的”之类的意思。首先简单介绍什么是Intent。应用程序的核心组件(活动、服务和广播接收器)通过Intent被激活,Intent代表的是你要做的一件事情,代表你的目的,Android寻找一个合适的组件来响应这个Intent,如果需要会启动这个组件一个新的实例,并传递给这个Intent对象。组件通过Intent 过滤器通告它们所具备的功能——能响应的Intent类型。
6、 <intent-filter>元素语句
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
(1)、android.intent.action.MAIN:决定应用程序入口Activity,也就是我们启动应用时首先显示的Activity。
(2)、android.intent.category.LAUNCHER:表示Activity被列入系统的启动器(launcher),允许用户启动它。launcher是安卓系统中的桌面启动器,是桌面UI的统称。
(3)、如果创建了多个Activity,在AndroidManifest.xml 文件下会相应生成以顺序来命名的Activity,如:<activity android:name=".SecondActivity"></activity>、<activity android:name=".ThreeActivity"></activity>等。
九、proguard-project.txt文件:用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆,从而让破解者难以阅读。
十、project.properties文件:工程属性的配置文件,配置编译的版本等。ADT14 以后, project.properties和default.properties合并成了project.properties 。供Eclipse使用,用来读取该工程项目中所使用的Android版本号。
十一、Eclipse IDE新建Android工程项目后的界面(Android 6.0版本)