详解Android 目录结构

工欲善其事,必先利其器.在开发Android项目之前,让我们先对Android的目录结构有一个清楚的认识.

在Eclipse中新建一个Android Project,名称为“AndroidTest”,则项目结构如图:

Android sdk根目录 androidsdk目录结构_layout

1、src目录

文件夹下放置项目的所有包及源文件(.java)。

2、gen目录

文件夹中包含了一个R.java类文件,通过R.java类中的注释可以看出,R.java文件是由aapt工具根据项目中的资源文件来自动生成的。R.java文件是项目的资源字典,里面包含了所有资源文件中的所有资源的唯一ID。不要手工去修改它。每当你修改其他资源文件的时候,该文件都会自动更新。先来看看R.java文件代码:

/* AUTO-GENERATED FILE. DO NOTMODIFY.
*
* This class was automaticallygenerated by the
* aapt tool from the resourcedata it found. It
* should not be modified byhand.
*/
package com.lrjs.AndroidTest;
public final class R {
publicstatic final class attr {
}
publicstatic final class drawable {
publicstatic final int icon=0x7f020000;
}
publicstatic final class layout {
publicstatic final int main=0x7f030000;
}
publicstatic final class string {
publicstatic final int app_name=0x7f040001;
publicstatic final int hello=0x7f040000;
}
}

  可以看到这里定义了很多常量,这些常量的名字都与res文件夹中的文件夹名相同,这也说明了R.java是项目中的资源字典。利用这个文件我们可以很快地找到要使用的资源。  可以看出R.java里面的定义的所有类和变量都是静态的,也就是说,我们在程序中使用时,不需要实例化就可以直接使用,这就为我们减轻了很多工作。     如:SetContentView(R.layout.main)

3、Android 2.2目录

是项目中要用到的包,这个文件夹在项目建立时自动生成。你自己的Android可能不是2.2版本。

4、assets目录

Android 系统为每个新设计的程序提供了/assets目录,这个目录保存的文件可以打包在程序里。/res 和/assets的不同点是,android不为/assets下的文件在R.java中生成ID。如果使用/assets下的文件,需要指定文件的路径和文件名。

5、res目录

接下来的res文件夹中包含了项目的所有资源,比如高低中分辨率程序图标文件(drawable-hdpi、drawable-ldpi、drawable-mdpi)、布局文件(layout)、常量(values)等。

Android按照约定,将不同的资源放在不同的文件夹内,这样可以方便地让aapt工具来扫描这些资源,并为它们生成对应的资源字典类R.java。

1)我们先来看看布局文件main.xml:

<?xml version="1.0"encoding="utf-8"?>
//线性版面配置
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android//
android:orientation="vertical"//代表从上到下垂直布局
android:layout_width="fill_parent"//当前视图填充整个屏幕
android:layout_height="fill_parent"
<TextView 
android:layout_width="fill_parent"
android:layout_height="wrap_content"//根据文本来改变高度
android:text="@string/hello"//表示引用String.xml文件中的hello所代表的字符串
/>
</TextView >
</LinearLayout>

 2)下面来看常量的定义(String.xml文件):

<?xmlversion="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">HelloWorld, AndroidTest!</string>
    <string name="app_name"> AndroidTest</string>
</resources>

  这个文件很简单,就定义了两个字符串资源,R.java中的:

public static final classstring {
publicstatic final int app_name=0x7f040001;
publicstatic final int hello=0x7f040000;
}
  这里的app_name和hello即指向String.xml文件中的两个字符串资源

6、AndroidManifest.xm

AndroidManifest.xml是应用程序清单文件,包含了该项目中所有使用的Activity、Service、Receiver,该文件中代码如下:

<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lrjs.AndroidTest"   //声明应用程序包
android:versionCode="1"//该应用程序版本代号
android:versionName="1.0">//该应用程序版本名称
 
<uses-sdkandroid:minSdkVersion="15" /> //该应用程序所使用的SDK版本
 
<application
   android:icon="@drawable/ic_launcher"  //应用程序图标
   android:label="@string/app_name">  //应用程序名
   <activity
        android:name=".AndroidTest "//活动名称,和package一起定义了命名空间
        android:label="@string/app_name">
    <intent-filter> //设置为应用程序默认启动的activity
        <actionandroid:name="android.intent.action.MAIN" />
        <categoryandroid:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
</application>
</manifest>

7、proguard.cfg文件

这个文件是混淆代码的脚本配置文件。

8、AndroidTest.java

package com.lrjs.AndroidTest;
import android.app.Activity;
import android.os.Bundle;
public class AndroidTestextends Activity {
/**Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

  主程序AndroidTest类继承自Activity类,重写了voidonCreate(Bundle savedInstanceState)方法。在onCreate方法中通过setContentView(R.layout.main)调用布局文件layout/main.xml来显示。一个Activity对应一个xml布局文件。