Android成长笔记(2)——程序结构分析

我使用的学习书籍是《第一行代码》,加之其它一些资料的整理,对Android的源文件结构进行详细说明

图1是一个名为“HelloWorld”的项目,在eclipse中点击"File"->"New"->"other"->"Android Application Project",系统自动生成的一个框架,可以运行。


                              图1


现对结构中的每个成分进行说明,在理解其成分时我喜欢探究其命名缘由,以便帮助理解其作用。

(1)src

理解为source(源文件)的缩写,意味存放所有Java代码的地方,其暂开图为图2,图中的包名和源文件名均为手动命名


                                       图2

(2)gen

理解为Generated Java Files,即通Android开发需要的通用文件,为系统自动生成,其子文件如图3,包括一个包和两个java文件,我们发现包名和src中的包名相同,我们暂且认为是系统的一种命名规则,把问题留在此,以后探讨。而包下包括两个文件,对其功能做一个简单的说明:


                                     图3

1、BuildConfig.java:

译为构建配置文件,这是系统自动生成的,其源文件有注释说明,如图4所示。此文件为新SDK一点功能,其作用为代码的辅助检查,在整个工程中不断自动检测。而对于其自动检测的实现过程我们暂不深究,以免影响学习进度。


                                                                      图4

2、R.java

此类的功能主要是为项目中的资源提供索引,索引选择了单词resource(资源)的首字母"R"

我们首先看看其源文件中对该文件的解释,如图5

对其简单的翻译为:自动生成的文件,请不要修改。

此类是由aapt工具从其发现的资源数据里自动生成得来的,不应被手动修改。

其中aapt工具的作用为查看、创建、更新zip格式的文档附件(zip/jar/apk),以下为百度百科的解释

http://baike.baidu.com/view/5857547.htm


                                                                           图5

图6为R.java源代码的执行部分

package com.example.helloworld;

public final class R {
    public static final class attr {
    }
    public static final class dimen {
        /**  Default screen margins, per the Android Design guidelines. 

         Example customization of dimensions originally defined in res/values/dimens.xml
         (such as screen margins) for screens with more than 820dp of available width. This
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively).
    
         */
        public static final int activity_horizontal_margin=0x7f040000;
        public static final int activity_vertical_margin=0x7f040001;
    }
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class id {
        public static final int action_settings=0x7f080000;
    }
    public static final class layout {
        public static final int hello_world_layout=0x7f030000;
    }
    public static final class menu {
        public static final int hello_world=0x7f070000;
    }
    public static final class string {
        public static final int action_settings=0x7f050002;
        public static final int app_name=0x7f050000;
        public static final int hello_world=0x7f050001;
    }
    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=0x7f060000;
        /**  Application theme. 
 All customizations that are NOT specific to a particular API-level can go here. 
         */
        public static final int AppTheme=0x7f060001;
    }
}
                                                                                                               图6

关于R.java的介绍这个转载讲得很清楚

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

转载出处:http://blog.sina.com.cn/s/blog_7b83134b01016043.html

R.java文件介绍

HelloWorld工程中的R.java文件

package com.android.hellworld;

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}

    R.java文件中默认有attr、drawable、layout、string等四个静态内部类,每个静态内部类分别对应着一种资源,如layout静态内部类对应layout中的界面文件,其中每个静态内部类中的静态常量分别定义一条资源标识符,如public static final int main=0x7f030000;对应的是layout目录下的main.xml文件。

    由于目前【drawable-*dpi】目录下都只有icon.png一个图片文件,因此此时不同详述的同名的icon.png文件在drawable内部类总只有一个icon属性。如果我们在【drawable-*dpi】目录下再添加一幅图片,则内部类中会自动的添加一个icon属性。

PS:添加资源的命名规则:资源文件只能以小写字母和下划线做首字母,随后的名字中只能出现 [a-z0-9_.] 这些字符,否则R.java文件不会自动更新,并且eclipse会提示错误。

    理解了R.java文件中内容的来源,即当开发者在res/目录中任何一个子目录中添加相应类型的文件之后,ADT会在R.java文件中相应的内部类中自动生成一条静态int类型的常量,对添加的文件进行索引。如果在layout目录下再添加一个新的界面,那么在public static final class layout中也会添加相应的静态int常量。相反当我们在res目录下删除任何一个文件,其在R.java中对应的记录会被ADT自动删除。
    R.java文件按除了有自动标示资源的索引功能之外,还有另外一个主要的功能,如果res目录中的某个资源在应用中没有被使用到,在该应用被编译的时候系统就不会把对应的资源编译到该应用的APK包中,这样可以节省Android手机的资源。


如何通过R.java文件来引用到所需要的资源

1.在java程序中引用资源
按照java的语法来引用即:R.resource_type.resource_name
注意:resource_name不需要文件的后缀名
Android系统本身自带了很多的资源,我们也可以进行引用,只是需要再前面加上“Android.”以声明该资源来自Android系统,即:Android.R.resource_type.resouce_name
例:【drawable-*hpi】下的icon.png
该图片在R.java文件的映射为drawable内部类下icon参数,则如果要获取该资源,则写法为:R.drawble.icon

2.在XML文件中引用资源
格式:@[package:]type/name
在xml文件中,如main.xml以及AndroidMainfest.xml文件中通过“@drawable/icon”的方式获取。其中“@”代表的是R.java类。“drawable”代表的是R.java中的静态内部类“drawable”,“/icon”代表静态内部类“drawable”中的静态属性“icon”,而该属性可以指向res目录下的“drawable-*dpi”中的icon.png资源。其他类型的文件也比较类似。凡是在R文件中定义的资源都可以通过“@Static_inner_classes_name/resource_name”的方式获取。如“@id/button”,“@string/app_name”。
如果访问的是Android系统中自带的文件,则要添加包名“Android:”。例如:android:textColor="@android:color/red"

    在布局文件中当我们需要为一些组件添加Id属性作为标识,可以使用如下的表达式:“@+id/string_name”,其中“+”表示在R.java的名为id的内部类中国添加一条记录。例:“@+id/button”的含义是在R.java文件中的id这个静态内部类添加一条常量名为button,该常量就是该资源的标识符。如果 id这个静态内部类不存在,则会先生成它。


(Eclipse 下Android工程R文件在clean之后消失的问题见下文:

http://blog.sina.com.cn/s/blog_7b83134b0101brvj.html

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(3)Android 4.03、Android Private Libraries、Andriod Dependencies三个包为引用的API,可以暂时不用管它,如图7所示


                                            

                                                         图7

(4)assets

assets的原意为“资产”,本文件夹的功能为存放一些随程序打包的文件,在你的程序运行时可以动态读取到这些文件的内容,如mp3,视频等。另外,如果你的程序中使用到了WebView加载本地网页的功能,所有网页相关的文件也都存放在这个目录下,此目录没有子目录,用得不多。本目录中存放的资源不像src目录那样会在R.java中建立索引(ID),读取其中资源时必须制定文件路径。

(5)bin

bin的目录结构如图8所示,此目录也不需要过多关注,它主要存放一些在编译时自动产生的文件,因此大多为二进制(binary)的,所以取名为bin。特别注意bin有个src的子目录,和之后说明的src目录同名,此src目录暂且不用管,系统自建的。感兴趣以后探究


                                                      图8

(6)libs

由单词库(library)命名而来,如果项目中使用到了第三方Jar包,就需要把这些Jar包都放在libs目录下,放在这个目录下的Jar包都会被自动添加到构建路径中去。可以参考图7,其显示的Jar包都是已经被添加到构建路径里的。暂时没查到“构建路径”的解释,就把它理解为Jar包添加到构建路径才能被使用吧。


                                                图9

网上看了还会有一个叫lib的目录,我的项目中没有,不过可以看看它们的区别

——————————————————————————————————————————————————————————————————————————

文章来源:http://zhidao.baidu.com/link?url=8xA1m87YXmFrHNOPQ56giDdMYBnUe7UrIzmBt3cCyHCLjgSoBnlVoeKZuBCheuxCgQ79jASN2T1AIMY1sM7sqCDslnIED3RiZH86PGNAU8O

lib和libs到底有什么区别

放在lib中的是被reference的,放在libs中的是被include的。
放在libs中的文件会自动被Eclipse所include。所以不要把API放到libs里去。
lib的内容是不会被打包到APK中,libs中的内容是会被打包进APK中

——————————————————————————————————————————————————————————————————————————

(7)res

由单词resource(资源)命名而来,顾名思义,在项目中使用的所有图片、布局、字符串等资源都要存放在这个目录下,前面提到的R.java中的内容也是根据这个目录下的文件自动生成的。如图10


                                图10

子目录drwable存放图片,layout存放布局,emnu存放菜单选项,values放字符串。其中drawable有几个文件夹,用于放不同分辨率的图片,如drawable-hdpi存放高分辨率图片。

(8)AndroidManifest.xml

manifest为清单之意,本文件为整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册(只有注册才能使用)。另外还可以在这个文件中给应用程序添加权限声明,也可以重新制定你创建项目时制定的最低兼容版本和目标版本。这个文件会经常用到。

这篇文字讲解很详细

文章来源:http://www.cnblogs.com/pilang/archive/2011/04/20/2022932.html

(9)project.properties

这个文件非常简单,就是通过一行代码制定了编译程序时所用的SDK版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值