Android 分析 Android 应用结构

时间:2023-12-19 14:52:56

本文说明 Android 项目组成,虽然简单,但决不能忽视。

当你从简单 Hello World 程序,到会实现一些常见功能,比如,下拉(上拉)刷新最新(加载更多),消息处理(UI 通知更新),ViewPager 滑动效果,启动动画,访问网络文件,进行一些复杂的界面布局等等,再到调试一些开源项目,最后自己编写 Android 程序。可当调试一些开源项目时,尤其是那些比较大的开源项目,你会发现一些“意想不到”的情况,它们无论从界面,还是从功能,界面够炫,功能强大,也正因为如此,需要更多的资源,比如动画或声音效果,甚至使用三方的库,那就需要了解更多关于 Android 应用结构的问题了。

示例项目 HelloWorld


以 HelloWorld 项目为例:

Android 分析 Android 应用结构Android 分析 Android 应用结构

图 1 项目结构                                        图 2 主程序

环境


  • Windows 2008 R2 64 位
  • Eclipse ADT V22.6.2,Android 4.4.2(API 19)
  • SAMSUNG GT-I9008L,Android OS 2.2.2

Android 应用结构分析


以上面 HelloWorld 项目为例:

文件/文件夹 描述 是否必需

AndroidManifest.xml

整个 Android 应用的全局描述文件,是每个 android 程序所必需的,位于工程根目录下。该清单文件说明了该应用的名称、所使用的图标以及包含的组件等。通常该文件可以包含如下信息:

  • 应用程序的包名,该包名将会作为该应用的唯一标识;
  • 应用程序所包含的组件,如 Activity(即 <activity.../> 元素)、Service、BroadcastReceiver 和 ContentProvider 等;
  • 应用程序兼容的最低版本;
  • 应用程序使用系统所需的权限声明,如 <uses-permission android:name="android.permission.INTERNET" />,允许 Android 访问网络。
  • 其他程序访问该程序所需要的权限声明。

例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <!-- 指定 Android 应用标签、图标 -->
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
 
        <!-- 定义 Android 应用的一个组件:Activity, 该 Activity 的类为 MainActivity,并指定该 Activity 的标签 -->
        <activity
            android:name=".MainActivity"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <intent-filter>
 
                <!-- 指定该 Activity 是程序的入口 -->
                <action android:name="android.intent.action.MAIN" />
                <!-- 指定加载该应用时运行该 Activity -->
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

gen

该目录存放的所有内容都是自动生成的,其中最重要是 R.java 文件。
例如:
/* AUTO-GENERATED FILE.  DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found.  It
 * should not be modified by hand.
 */
 
package com.example.helloworld;
 
public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class id {
        public static final int textView1=0x7f060000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040000;
    }
    public static final class style {
        /** 
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    

            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        

        Base application theme for API 11+. This theme completely replaces
        AppBaseTheme from res/values/styles.xml on API 11+ devices.
    
 API 11 theme customizations can go here. 

        Base application theme for API 14+. This theme completely replaces
        AppBaseTheme from BOTH res/values/styles.xml and
        res/values-v11/styles.xml on API 14+ devices.
    
 API 14 theme customizations can go here. 
         */
        public static final int AppBaseTheme=0x7f050000;
        /**  Application theme. 
 All customizations that are NOT specific to a particular API-level can go here. 
         */
        public static final int AppTheme=0x7f050001;
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

R.java 文件是由 AAPT 工具根据应用中的资源文件自动生成的,因此可以把 R.java 看成 Android 应用的资源字典。

AAPT 生成 R.java 文件的规则主要有两条:

  • 每类资源对应 R 类的一个内部类。其实,内部类基本对应着 res 目录下资源分类的子目录,例如,xml 界面文件中有一个 id 为 textView1 文本框控件,id 为 R.java 中一个内部类,即 android:id="@+id/textView1",那么通过 R.id.textView1 就可以找到这个控件。
  • 每个具体的资源项对应于内部类的一个 Public static final int 类型的 Field。

通过 R.java 可以很快地查找到所需要的资源,同时,编译器也会检查 R.java 列表中的资源是否被使用,没被使用到的资源不会被编译到软件中,这样可以减少在手机占用的空间。

bin

该目录用于存放生成的目标文件,如 Java 的二进制文件、资源打包文件(.ap_后缀)、Dalvik 虚拟机的可执行文件(.dex 后缀)等。
例如:
Android 分析 Android 应用结构

在使用 Eclipse 开发时,可以不用关心 bin 目录。如果在 Eclipse 中看不到,可以到资源管理器下面查看。

src

包含应用程序的所有 Java 源代码。

assets

其他任何资源的文件夹和文件的集合。除了提供 res 目录存放资源文件外,Android 在 assets 目录也可以存放资源文件,assets 目录下的资源文件不会在 R.java 自动生成 id,所以读取 assets 目录下的文件必须指定文件的路径,可以通过 AssetManager 类来访问这些文件。

res

资源目录,它存放 Android 项目的各种资源文件,并将其编译进应用程序中,向此目录添加资源时,会被 R.java 自动记录。

该目录包含 drawable(以及 drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi),anim,layout,values,xml 和 raw 子文件夹。如 layout 存放界面布局文件;values 存放各种 XML 格式的资源文件,例如字符串资源文件 strings.xml,颜色资源文件 colors.xml,尺寸资源文件 dimens.xml。

Android 按照约定,将不同资源放在不同的文件夹内,便于 AAPT 工具来扫描这些资源,并为它们生成对应的资源清单类:R.java。

drawable

包含应用程序使用的图像资源(*.png、*.jpg)。Android 1.5 及以下版本目录是 drawable,Android 1.5 以上版本有 3 个:drawable-ldpi、drawable-mdpi、drawable-hdpi 和 drawable-xhdpi 。
  • drawable-ldpi 存放分辨率图片。
  • drawable-mdpi 存放中分辨率图片。
  • drawable-hdpi 存放高分辨率图片。
  • drawable-xhdpi 存放超高分辨率图片。

虽然是 4 个目录,但在使用 R 文件访问时,与 Android 1.5 及以下版本一样的。

anim

包含用 xml 描述的应用程序使用的动画效果的配置文件。

layout

包含应用程序的布局 xml 文件。你应该创建通过使用 xml 描述界面的布局,而不是通过 Java 编码实现界面布局。

values

包含应用程序的常量资源,包括字符串,样式和颜色。如在 strings.xml 存放各种文字,以及存放不同类型的数据,像 arrays.xml、colors.xml、styles.xml 等。

例如:有一个 main.xml 布局文件,若在其中访问 strings.xml 文件的 hello 常量资源,可以"@+string/hello"方式;而在程序中访问方式为 R.string.hello。一般形式是:R.<资源类型>.<资源名称>

raw

包含附加的数据和非 xml 数据,例如 MP3 文件。使用 Eclipse 创建 Android 工程时,默认情况下不会在 res 目录下面创建这个目录,如果需要,可以自己创建。它可以通过 I/O 流访问,如应用中内置音频文件,就可以放置在这个目录下面。访问方式为 R.raw.xxx 方式。

menu

菜单,主要放置设计的 OptionsMenu 和 ContextMneu 的菜单项。使用 Eclipse 创建 Android 工程时,默认情况下不会在 res 目录下面创建这个目录,如果需要,可以自己创建。

Android 4.4.2

该文件夹下包含 android.jar 文件,这是一个Java 归档文件,其中包含构建应用程序所需的所有的Android SDK 库(如 Views、Controls)和 APIs。通过 android.jar 将自己的应用程序绑定到 Android SDK 和 Android Emulator,这允许你使用所有 Android 的库和包,且使你的应用程序在适当的环境中调试。

project.properties

记录项目中所需要的环境信息,比如 Android 版本等。

例如:关于 Android API 的信息 android-19,表明采用的是 Android 4.4.2。最近调试 oschina 项目,该项目必须是 android-15,即 Android 4.0.3 版本。