找回密码
 注册
搜索
查看: 5181|回复: 13

[讨论] Android的应用程序结构分析:HelloActivity (转)

[复制链接]
发表于 2009-5-6 22:17:10 | 显示全部楼层 |阅读模式
(hanchao3c Android开发者论坛原创,转载请注明)
本例以一个简单的HelloActivity程序为例,简单介绍Android应用程序的源代码结构。事实上,Android应用程序虽然不是很复杂,但是通常涉及了JAVA程序,XML文件,Makefile多方面的内容。HelloActivity虽然简单,但是麻雀虽小,五脏俱全,是学习 Android应用程序的最好示例。

第一部分:HelloActivity的源代码
HelloActivity工程的源代码在Android目录的development/samples/HelloActivity/中,代码的结构如下所示:
development/samples/HelloActivity/
|-- Android.mk
|-- AndroidManifest.xml
|-- res
|   |-- layout
|   |   `-- hello_activity.xml
|   `-- values
|       `-- strings.xml
|-- src
|   `-- com
|       `-- example
|           `-- android
|               `-- helloactivity
|                   `-- HelloActivity.java
`-- tests
    |-- Android.mk
    |-- AndroidManifest.xml
    `-- src
        `-- com
            `-- android
                `-- helloactivity
                    `-- HelloActivityTest.java
其中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 /HelloActivity_intermediates/目录,这个目录中的内容都是HelloActivity工程相关的,更具体地说都与 development/samples/HelloActivity/中的Android.mk文件相关。
out/target/common/obj/APPS/HelloActivity_intermediates/
|-- classes.dex                       (字节码)
|-- classes.jar                       (JAR文件)
|-- public_resources.xml              (根据resources结构生成的xml)
`-- src
    |-- R.stamp
    `-- com
        `-- example
            `-- android
                `-- helloactivity
                    `-- R.java        (resources生成的文件)
classes.dex  是一个最重要的文件,它是给Android的JAVA虚拟机Dalvik运行的字节码文件。
classes.jar是一个JAR文件,JAR的含义为Java ARchive,也就是Java 归档,是一种与平台无关的文件格式,可将多个文件合成一个文件。解压缩之后的目录结构:(JAVA标准编译得到的类)
classes
|-- META-INF
|   `-- MANIFEST.MF
`-- com
    `-- example
        `-- android
            `-- helloactivity
                |-- HelloActivity.class
                |-- R$attr.class
                |-- R$id.class
                |-- R$layout.class
                |-- R$string.class
                `-- R.class
各个以class为扩展名的文件,事实上是JAVA程序经过编译后的各个类的字节码。
第三部分: 目标apk文件

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

out/target/product/generic/obj/APPS/HelloActivity_intermediates/package.apk_FILES/
|-- AndroidManifest.xml
|-- META-INF
|   |-- CERT.RSA
|   |-- CERT.SF
|   `-- MANIFEST.MF
|-- classes.dex
|-- res
|   `-- layout
|       `-- hello_activity.xml
`-- resources.arsc
值得注意的是,这里的xml文件经过了处理,和原始的文件不太一样,不能按照文本文件的方式阅读。  













2 回复:[转贴]Android的应用程序结构分析:HelloActivity  

Android的应用程序结构分析:HelloActivity(续)
(hanchao3c Android开发者论坛原创,转载请注明)

第四部分: 源代码的各个文件
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工程的描述文件,其内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.helloactivity">
<application android:label="Hello, Activity!">
<activity android:name="HelloActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
其中package用于说明这个包的名称,android:labeapplication中的内容是表示这个应用程序在界面上显示的标题,activity中的android:name表示这个Android的活动的名称。

文件src/com/example/android/helloactivity/HelloActivity.java是程序主要文件,由JAVA语言写成
package com.example.android.helloactivity;
import android.app.Activity;  
import android.os.Bundle;  
public class HelloActivity extends Activity {
public HelloActivity() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_activity);
}
}
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文件的内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textSize="18sp"
android:autoText="true"
android:capitalize="sentences"
android:text="@string/hello_activity_text_text" />
其中定义了一个可编辑的文本(EditText),下面的各项其实是它的各种属性,android:text表示这个文本的内容,string/hello_activity_text_text表示找到相应的文件,也就是res/value/string.xml文件中的 hello_activity_text_text文本。
res/value/string.xml的内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello_activity_text_text">Hello, World!</string>
</resources>
hello_activity_text_text文本被res/layout/hello_activity.xml文件引用,正是应用程序运行时在屏幕显示的文本。
发表于 2009-5-7 09:45:24 | 显示全部楼层
好!@@@@@@
点评回复

使用道具 举报

发表于 2009-5-12 17:01:00 | 显示全部楼层
good[em02]
点评回复

使用道具 举报

发表于 2009-6-30 20:26:08 | 显示全部楼层
欧克
阿娇金额
点评回复

使用道具 举报

发表于 2009-6-30 21:55:00 | 显示全部楼层
怎么还说我没有钱呢
点评回复

使用道具 举报

发表于 2009-9-15 14:54:10 | 显示全部楼层
够详细的   支持
点评回复

使用道具 举报

发表于 2009-9-16 14:54:34 | 显示全部楼层
[em01][em01]
点评回复

使用道具 举报

发表于 2009-12-3 15:30:18 | 显示全部楼层
支持一下
点评回复

使用道具 举报

发表于 2010-6-7 15:22:55 | 显示全部楼层
谢谢分享。学习了
点评回复

使用道具 举报

发表于 2010-6-10 16:31:07 | 显示全部楼层
非常感谢![em05]
点评回复

使用道具 举报

发表于 2010-8-19 13:34:57 | 显示全部楼层
好资料,[em14]
点评回复

使用道具 举报

发表于 2010-9-4 12:23:53 | 显示全部楼层
蛮不错的东西
点评回复

使用道具 举报

发表于 2015-8-17 13:15:07 | 显示全部楼层
不错的东西
点评回复

使用道具 举报

发表于 2016-2-18 09:09:18 | 显示全部楼层
顶起,雄起
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-23 09:09 , Processed in 0.046761 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表