Android 项目的目录结构
idea写安卓项目的项目结构
idea写安卓项目的项目结构Android项目的项目结构是一个具有层次结构的组织方式,它有助于开发团队更好地管理代码,使代码更具可读性和可维护性。
在本文中,我将一步一步地回答如何构建一个完整的Android项目结构,以解决中括号内所述的主题。
第一步:创建项目目录结构在开始编写代码之前,首先要创建一个适当的项目目录结构。
Android项目的标准目录结构如下所示:- app- src- main- java- res- AndroidManifest.xml- build.gradle- gradle- wrapper- gradle-wrapper.jar- gradle-wrapper.properties- build.gradle在这个结构中,项目的核心代码位于`app/src/main/java`目录中,资源文件(例如布局文件、字符串资源等)位于`app/src/main/res`目录中。
`app/AndroidManifest.xml`文件包含了应用程序的元数据和组件声明。
`gradle/`目录和`build.gradle`文件用于管理项目的构建和依赖项。
第二步:按功能模块组织代码为了使代码更具可读性和可维护性,将代码按照功能模块进行组织是一个良好的实践。
在`app/src/main/java`目录下,可以创建不同的包来组织不同的功能模块。
例如,可以创建以下包:- app- src- main- java- com.example.myapp- data- ui- util在`data`包中,可以放置处理数据逻辑的类,例如数据库操作类或网络请求类。
在`ui`包中,可以放置处理用户界面逻辑的类,例如活动(Activity)或片段(Fragment)。
在`util`包中,可以放置一些通用的工具类,例如日期处理类或字符串处理类。
第三步:使用MVC、MVP或MVVM等模式模式(MVC、MVP或MVVM)有助于解耦代码,提高可维护性。
安卓
对于每个Android开发者而言, Android提供的官方文档是必看的。 在Android SDK安装目录下找到docs子目录,打开docs子目录 index.html页面,并单击该页面上方的Dev Guide标签面,这就是 Android 官方提供的开发指南文档。接着单击下图中的Reference标 签页,看到的就是Android的API文档了。
Android项目目录结构
Android Android 平台开发与应用
Android应用结构分析
Android Android 平台开发与应用
Android应用结构分析
1、src文件夹:包括了项目的所有包及源文件(.java)。
打开其目录下的HelloAndroid.java文件,它就是Android 项目的Java文件,程序清单如下:
Android Android 平台开发与应用
1、界面编程与视图View
1.3 控制UI界面的几种方式
Android控制组件行为的方式有以下三种:
在XML布局文件中通过XML属性进行控制 在Java程序代码中通过调用方法进行控制 XML布局文件和Java代码混合控制
Android Android 平台开发与应用
Android Android 平台开发与应用
Android应用结构分析
2、gen文件夹:该目录用于保存Android自动生成的
的一个R.java文件。 R.java是在建立项目时自动生成的, 这个文件是只读模式,不能更改,定义该项目所有资源的 索引文件。
Android Android 平台开发与应用
Android Android 平台开发与应用
Android应用的基本组件介绍
MMS 源码目录结构(android)
MMS 源码目录结构首先应该从AndroidManifest.xml 文件开始,该文件是Android应用(APK)的打包清单,其中提供了关于这个应用程序的基本信息,如名称(application/@label),图标( application/@icon ),等常量信息,但该文件最重要的功能仍然是:向Android系统声明应用程序所包含的组件,包括Activity、Service、Receiver和ContentProvider,另外还会请求系统授予相关权限。
<application>是重要的标记,通常我们都是在此设置应用程序的名称和图标,而在Messaging这个应用中,它扩展了默认的android.app.Application类,在com.android.mms.MmsApp类中覆写了onCreate()方法进行系统初始化、覆写onTerminate() 方法做相关清理工作。
最重要的是<application>标记设置了(任务吸引力) taskAffinity =“android.task.mms”、allowTaskReparenting ="true" 这是两个与Task有关的属性,那么何为任务(Task)呢?A pplication就是一个.apk文件,由若干个组件(可能会包括Activity、Service、Receiver 或者ContentProvider )构成,它是一个物理上的独立存在。
而Task则是指用户借助Application提供的功能完成某件事情,例如:发送一条信息给老朋友。
通常一个Task操作所涉及的内容不会超过A pplication 边界,但在Android中却不是这样,Android允许一个T ask操作横跨多个Apllication。
还以向老朋友发送信息为例,在该任务中,至少需要一个用来输入目标电话号码和消息内容的用户界面——即Android中的Activity组件(这是Messaging应用中的内容),如果进一步要求目标号码是从联系人列表(或通话列表)中选择,而非手工输入,那么就涉及到跨Apllication调用‘联系人应用’中的列表组件了(也是一个Activity )。
黑马程序员android开发笔记及源码
01、什么是3G02、android系统简介03、android背景介绍04、android的framewor简介05、两种虚拟机的比较06、sdk的下载以及简介07、创建android模拟器08、ddms简介09、platform-tools的简介及常见adb指令10、android项目的目录结构11、android下apk安装的过程12、常见的adb指令介绍13、创建模拟器遇到的常见错误14、电话拨号器15、点击事件的四种写法16、短信发送器17、相对布局&单位介绍18、现形布局&布局的组合19、表格布局&绝对布局20、帧布局21、测试相关概念22、android下junit测试框架配置23、logcat简介24、保存文件到手机内存25、android下文件访问的权限26、保存文件到SD卡中27、分析setting源代码获取SD卡大小28、_sharePreference入门29、xml文件的序列化30、采用pull解析xml文件31、采用断电调试的方法观察pull解析的的流程32、android下创建一个sqllite数据库33、sql语句实现数据库的增删改查34、系统api实现数据库的增删改查&Sqlite3工具的使用35、数据库的事物36、listView入门37、采用layoutInflater打气筒创建一个view对象38、采用数据适配器ArryAdapter39、常用数据适配器simpleAdapter40、数据适配器总结41、内容提供者简介42、内容提供者的实现43、短信的备份44、插入一条记录到系统短信应用45、内容观察者46、获取系统的联系人信息47、保存联系人到系统通讯录48、读取联系人的一个小细节49、网络图片查看器50、anr产生的原理&如何避免51、android消息机制入门52、网络html查看器53、字符乱码问题的处理54、采用get方式提交数据到服务器55、采用post方式提交数据到服务器56、提交数据到服务器中文乱码问题的处理57、采用httpclient提交数据到服务器58、异步http框架简介&实现原理59、异步http框架提交数据到服务器60、上传文件到服务器61、smartimageview&常见开源代码62、多线程下载的原理63、多线程断点下载的原理64、多线程java代码移植到android65、多线程下载文本页面的更新66、显示意图激活另一个activity67、隐式意图激活另一个activity68、隐式意图的配置69、隐式意图和显示意图的使用场景70、在不同activity之间数据传递71、activity的声明周期72、activity的启动模式73、activity横竖屏切换的声明周期74、开启新的activity获取他的返回值75、请求码和结果码的作用76、利用广播实现ip拨号77、短信窃听器78、自定义广播时间&发送自定义广播&广播接受者优先级79、采用服务执行长期后台操作80、采用服务窃听电话&服务的声明周期81、android进程优先级&为什么使用服务82、绑定方式开启服务&调用服务的方法83、服务的声明周期(混合开启84、采用aidl绑定远程服务85、代码注册广播接受者&利用广播调用服务的办法86、加载大图片到内存87、获取图片exif信息88、从gallery获取图片89、图片画画板90、扒开美女衣服91、图片的缩放92、图片的旋转93、图片的平移&镜面&倒影效果94、图片的合成95、图片的颜色处理96、多媒体播放api简介97、人脸识别98、mediaplayer的生命周期99、soundpoo简介100、sufaceview的生命周期101、播放在线视频102、视频播放器进度的处理103、调用系统照相机拍照和录像104、采用camera拍照105、常见对话框106、notification入门107、菜单108、android下的样式109、android下的主题110、代码编写ui111、html创建ui112、帧动画113、代码创建创建的tween动画114、xml文件定义动画115、传感器简介116、117、杀死进程118、apk的安装119、应用程序的反编译120、动态创建fragment121、用fragment创建一个选项卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之间的通讯125、应用程序国际化04、android的framewor简介Wap:wait and playWireless Makeup Language(WML)精简的html语言Applications:android自带的基本上层应用Aplication framework:应用程序框架Librarics:Linux lernel:05、两种虚拟机的比较编译后文件格式:jvm:.java->.class->.jardalvik vm:.java->.dex->.odex基于的架构:jvm:基于栈的架构dalvik vm:基于寄存器的架构Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高06、sdk的下载以及简介->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容Android->SDK Plateform:开发时使用到的jar包->Samples for sdk:->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API ->source for android SDK:SDK全部的源代码Extrals:->tools:开发的工具->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息->gongle play service:收费服务->google USB Driver:真实的设备驱动开发时:基于4.0,兼容2.2、2.3.307、创建android模拟器avd:android virture developerVGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)08、ddms简介ddms:模拟器不支持中文,因此发送中文会显示不出来09、platform-tools的简介及常见adb指令Android调试桥:内部实现就是socket让两个系统之间实现数据交互->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥dx.bat:将.class文件打包10、android项目的目录结构一:SDK的目录结构->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见相应的代码->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容->mark project as a library:一般不选择,意思是将这个项目提供一个jar包供别人使用三:文件夹目录.setting:设置目录assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的apk中bin:gen:自动生成的目录->builderConfig.java:生成的配置信息->R.java:Android 4.1.2->android.jar开发环境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安装过程一、Android安装过程分析:->setContentView:甚至view的对象,把里面的xml文件加载到->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件->apk压缩文件解压内部内容->META-INF:应用程序的签名eclipse的调试签名文件->res:资源文件->classes.dex:class文件->resources.arsc:资源ID映射->android软件安装的过程:->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名012、常见adb指令前提:->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;->设备上打开USB调试;指令:->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb -s emulator-5554 install c:\\users\\administrator\\hello.apk如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端ls:显示文件夹ps:显示正在运行的程序ping:网络连通性013、创建模拟器遇到的常见错误->路径最好不要有中文:->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。
Android项目工程目录详解
Android项目工程目录详解1. Src:该目录中存放的是该项目的源代码,这个目录包含了你即将创建的Java源代码文件,这个目录里的文件是根据package结构管理的,它与普通java项目中的/src目录很相似。
2.Gen:自动生成的文件目录。
该目录下的文件全部都是ADT自动生成的,一般并不需要去修改,该目录下定义了一个R.java文件,该文件相当于项目的字典,为项目中用户界面、字符串、图片等资源都会在该类中创建其惟一的ID,当项目中使用这些资源时,会通过该ID得到资源的引用。
R.java是在建立项目时自动生成的,这个文件是只读模式的,不能更改。
R.java文件中定义了一个类——R,R类中包含很多静态类,且静态类的名字都与res文件夹中的一个名字对应,即R类定义该项目所有资源的索引。
通过R.java我们可以很快地查找我们需要的资源,另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
R.java很重要,不能修改不能删除。
3.Android{版本号}:这个目录包含了项目需要的库文件(Jar文件),这和普通Java项目中的/lib目录很相似。
同时其中还包含项目打包时需要的META-INF目录.4.Android Private Libraries:所有的第三方JAR包引入都被放入了Android Private Libraries中5.Android Dependencies:新版本的ADT修改了第三方jar的导入方式,之前可以在工程里面做关联,会在工程上自动添加ReferenceLibrary。
在新版本的ADT环境下,只需要在工程目录下新建libs文件夹,注意是libs不是lib,然后将第三方的jar复制进去,eclipse会自动将这个jar添加到Android Dependencies文件夹下,不必在通过BuildPath自己去修改了,也不需要ReferenceLibrary了。
android开发目录结构说明
src目录是放源码的地方。
gen目录是自生成文件,程序员不应该改此目录下的文件。
下面两个Android目录是android自带的支持文件及低版本支持文件。
assets目录是资源文件,放置音频图片等,此文件夹下面的文件不会自动生成对应的ID。
bin目录是生成二进制文件的文件夹。
libs目录是放置第三方文件的目录。
res目录是放置资源文件,此目录下的文件会自动的生成对应的ID,通过ID可以在java 代码中访问文件。
res > drawable - 文件夹是放置不同分辨率图片的文件夹,高分辨率,低分辨率,中等分辨率,超高分辨率。
res > layout文件夹是放置布局文件。
res > menu文件夹放置菜单文件。
res > values文件夹放置各种值,例如字符串,参数变量等。
针对不同的设备可以使用不同的文件夹。
AndroidManifest.xml项目的总配置项,记录应用中使用到各种全局的配置
ic_launcher-web.png这个是为了google Play市场使用展示的图标,它需要的是512×512的高分辨率的图标。
proguard-project.txt是为了保护Android项目而做的代码混淆使用的。
project.properties是设置sdk配置等信息文件。
Android工程各文件夹结构的含义及全代码使用与全解
Android工程各文件夹结构的含义及全代码使用与全解对Android这些东西一开始听迷惑的,不知道什么东西该放在上面地方,把网上的资源整合一下,放在这里。
1.总述我们建立一个android工程,其结构如下:1.1、src文件夹顾名思义(src, source code)该文件夹是放项目的源代码的。
A. android.app.Activity类:Activity类关注创建窗口与交互,它使用方法setContentView(View)将自己的UI放到里面。
重要的方法:onCreate(Bundle):初始化活动(Activity)。
(1)通过调用setContentView(int)方法加载布局资源(layoutresource)从而实现对UI的定义;(2)另一方面,可以用findViewById(int)在UI中检索到需要编程交互的小部件(widgets)。
主要的思想:setContentView指定由哪个文件指定布局(main.xml),可以将这个界面显示出来,然后我们进行相关操作,我们的操作会被包装成为一个意图(Intent),然后这个意图对应有相关的activity进行处理。
B. android.os.Bundle类:从字符串值映射各种可打包的(Parcelable)类型(Bundle单词就是捆绑的意思,所有这个类很好理解和记忆)。
如该类提供了公有方法——public boolean containKey(String key),如果给定的key包含在Bundle的映射中返回true,否则返回false。
该类实现了Parceable和Cloneable接口,所以它具有这两者的特性。
1.2、gen文件夹该文件夹下面有个R.java文件,R.java是在建立项目时自动生成的,这个文件是只读模式的,不能更改。
R.java文件中定义了一个类——R,R类中包含很多静态类,且静态类的名字都与res中的一个名字对应,即R类定义该项目所有资源的索引。
AndroidStudio开发环境搭建
三、安装过程中遇到的问题
解决方法
如 果 想 跳 过 这一 步 , 可 以 进行 如 下 操 作 :在 Android Studio 安 装 目录下 的 bin 目 录 下 , 找 到 idea.properties 文 件 , 在 文 件 最 后 追 加 disable.android.first.run=true 。
相比Eclipse,Android Studio IDE有自己的特点:
对UI界面设计和编写代码有更好地支持,可以方便地调整设备上的多种分辨率。 同样支持ProGuard工具和应用签名。 不过,目前版本的Android Studio不能在同一窗口中管理多个项目。每个项目都会打
开一个新窗口。我猜这是借鉴了Intellij IDEA的行为,而且Google近期不会对此做出 调整。 支持Gradle自动化构建工具,这真是极好的,但对于刚从Eclipse平台转移过来的开发 者来说还需要一段时间去学习和适应。
筹办航空事宜
处
三、从驿传到邮政 1.邮政 (1)初办邮政: 1896年成立“大清邮政局”,此后又设 , 邮传邮正传式部脱离海关。 (2)进一步发展:1913年,北洋政府宣布裁撤全部驿站; 1920年,中国首次参加 万国。邮联大会
2.电讯 (1)开端:1877年,福建巡抚在 架台设湾第一条电报线,成为中国自 办电报的开端。
JDK是Java的核心,包含了Java的运行环境(Java Runtime Environment),一堆Java 工具和给开发者开发应用程序时调用的Java类库。
我们可以打开jdk的安装目录下的Bin目录,里面有许多后缀名为exe的可执行程序, 如下图所示:
二、下载和安装相关的软件
这些都是JDK包含的工具,通过配置JDK的变量环境,我们可以方便地调用这些工具及 它们的命令。
【0004】Androidstudio使用
【0004】Androidstudio使⽤【1】/?view=theme&id=563a1a7680b4acf11273ae94【2】⾸先第⼀步就是在你的module所在的⽬录复制⼀份,并粘贴然后重命名成为你需要的名字,⽐如我根据我的需要,我把我的testservice改成了testservice_interface了第⼆步,打开你的Android Studio -> Project,你就会看到你刚刚复制的module第三步,找到在Project下的setting.gradle,打开,加上你的刚刚复制好的⽂件名第四步,sync now,同步你的gradle,然后你刚复制的module名字字体就变⿊体了第五步,切换⾄Android视图,修改包名最后,修改你的应⽤名称,你想改什么就什么呗,在manifest下label那,你会找得到的。
最最最后⼀步,也是⾮常重要⼀步,修改你的应⽤id,不然你这个app会覆盖掉你原来的app哦你还会发现,其实应⽤的唯⼀标识是id,只要id不同,就是两个不同的app,也就是说你可以拥有两个名称⼀模⼀样的app安装在⼿机上,如果你喜欢的话----------------------------------------------------------------------------------------------------------------------【3】Android Studio中的同⼀个⼯程下复制⼀份module⽽不改变原来的demo?⾸先第⼀步就是在你的module所在的⽬录复制⼀份,并粘贴然后重命名成为你需要的名字,⽐如我根据我的需要,我把我的testservice改成了testservice_interface了第⼆步,打开你的 Studio -> Project,你就会看到你刚刚复制的module第三步,修改包名第四部,修改应⽤程序ID,在app⽬录下的build.gradle中,如果应⽤ID相同的话,怎么安装都是同⼀个应⽤程序最后,修改你的应⽤名称,进⼊strings.xml下修改app name,这样AndroidManifest.xml⾥引⽤的appname就⾃动更改了。
Android平台简单介绍
Android平台简单介绍1. 起源和发展Android是由Android公司的创始⼈Andy Rubin创造的,⽽后被Google收购,Google的⽬标是将Android打造成⼀个标准化、开放式的移动操作系统平台。
Android是开放源代码的移动操作系统软件,提供了丰富的功能和酷炫的⽤户界⾯。
Google不断优化和改进Android系统,并开放原⽣的安卓系统源代码允许各个软件⼚商或者⼿机⼚商进⾏定制化的修改。
同时Google也提供了丰富的Android API和强⼤的开发环境,使得在Android平台上开发Android App变得⼗分便捷。
Android是⽬前移动端市场占有率最⾼的⼿机操作系统,事实上,Android已经不仅仅⽤在⼿机端,还⼴泛⽤于TV、⼿表等各种可穿戴设备以及各种智能硬件。
2. Android平台架构Android平台是基于Linux内核构建起来的,从上到下主要包含四个层次:应⽤程序层,这⼀层主要包含各种应⽤程序软件,包括最基本的通话、短信、联系⼈、浏览器等App,还包括⼤量开发者开发的各种App;应⽤程序框架层,所有的App都是基于应⽤框架层开发的,应⽤框架层提供了⼤量的API供开发者使⽤,开发者也可以提交⾃⼰开发的功能模块;系统环境层,这⼀层包含了⽀持上层功能所需要的⼤量C/C++函数库,还包括Android运⾏时环境,Android运⾏时环境包括Java核⼼库以及Android虚拟机;Linux内核层,Android内核建⽴在Linux 2.6之上,这⼀层提供最基础的诸如内存管理、进程管理、⽹络协议栈等操作系统级服务;关于Android虚拟机,在5.0版本之前使⽤的是Dalvik虚拟机,⽽⾃5.0版本之后使⽤的是ART。
Dalvik虚拟机是⼀种解释执⾏的虚拟机,由于其在运⾏App时进⾏动态编译,使得运⾏App的速度⽐较慢。
ART采⽤AOT(Ahead of Time)的技术在安装App时就进⾏编译,使得运⾏App的效率得到较⼤提升。
idea下Android各目录所代表的含义介绍
idea下Android各⽬录所代表的含义介绍1.Project模式结构模式1、.gradle和.idea这两个⽬录下都是AndroidStudio⾃动⽣成的⽂件。
2、app项⽬中的代码、资源等内容⼏乎都是放置在这个⽬录下3、build这个⽬录包含了⼀些在编译时⾃动⽣成的⽂件。
4、gitignore这个⽂件是⽤来将制定的⽬录或⽂件排除在版本控制之外的。
5、build.gradle这是项⽬全局的gradle构造脚本6、gradle.properties这是项⽬全局的gradle配置⽂件7、gradlew和gradlew.bat这两个⽂件是⽤来在命令⾏界⾯中执⾏gradle命令的,gralew(Linux或Mac),gradlew.bat(Windows)2.App⽬录下的结构模式1、Build这个⽬录包含了⼀些在编译时⾃动⽣成的⽂件2、libs如果项⽬中使⽤到第三⽅的Jar包,就需要把这些jar包放在libs⽬录下3、androidText项⽬⾃动化测试4、java放置JAVA5、res图⽚、布局、字符串等资源6、androidManifest.xmlAndroid的配置⽂件7、test⾃动化测试的另⼀种⽅式3.res⽬录下的结构模式1、drawabledrawable⽂件夹⼀般不放置图⽚资源,存放⼀些动画⽂件、选择器⽂件、图形配置⽂件,drawable-mdip/hdip/xhdip⽂件夹放置图⽚资源2、drawable-v24当我们放⼊图⽚在drawable-v24⽂件夹时,在该⽂件夹引⽤该图⽚时会导致模拟器⽆法运⾏。
图⽚资源放到drawable-v24⾥⾯,导致7.0以下不能找到图⽚。
不同的drawable⽂件夹⽤于为设备兼容性和不同的Android版本提供不同的屏幕密度。
同理mipmap-anydpi-v26 API 26(安卓8.0)也是⼀样的道理,注意不同的⽂件对应的不同的版本。
3、layout存放所有的布局⽂件,主要是⽤于排列不同的显⽰组件,在Android程序中要读取此配置。
AndroidStudio下的APP目录结构详解
AndroidStudio下的APP⽬录结构详解Project Name:⼯程项⽬名称Application Name:当前应⽤发布以后的名字,例如QQ图标下⾯的名字是“QQ”,就是Application Name.Android Studio⼯程⽬录1、.gradle和.idea这两个⽬录下放置的都是Android Studio⾃动⽣成的⼀些⽂件,我们⽆须关⼼,也不要去⼿动编辑。
2、app项⽬中的代码、资源等内容⼏乎都是放置在这个⽬录下的,我们后⾯的开发⼯作也基本都是在这个⽬录下进⾏的,待会⼉还会对这个⽬录单独展开进⾏讲解。
3、build这个⽬录你也不需要过多关⼼,它主要包含了⼀些在编译时⾃动⽣成的⽂件。
4、gradle这个⽬录下包含了gradle wrapper的配置⽂件,使⽤gradle wrapper的⽅式不需要提前将gradle下载好,⽽是会⾃动根据本地的缓存情况决定是否需要联⽹下载gradle。
Android Studio默认没有启动gradle wrapper的⽅式,如果需要打开,可以点击Android Studio导航栏 –> File –>Settings –> Build,Execution,Deployment –> Gradle,进⾏配置更改。
5、.gitignore这个⽂件是⽤来将指定的⽬录或⽂件排除在版本控制之外的。
6、build.gradle这是项⽬全局的gradle构建脚本,通常这个⽂件的内容是不需要修改的。
下⾯回详细分析gradle构建脚本中的具体内容。
7、gradle.properties这个⽂件是全局的gradle配置⽂件,在这⾥配置的属性将会影响到项⽬中所有的gradle编译脚本。
8、gradlew和gradlew.bat这两个⽂件是⽤来在命令⾏界⾯中执⾏gradle命令的,其中gradlew是在Linux或Mac系统中使⽤的,gradlew.bat是在Windows 系统中使⽤的。
Android的文件系统根目录的结构
经过这几天在网上搜索关于Android文件系统的相关资料,发现已经有很多高手分析了Android的文件系统,这些高手多从不同的方面分析了其文件系统的结构和运行原理。
我这里就写一下自己的理解。
首先是Android的文件系统根目录的结构:# pwd && ls -a -l/drwxrwxrwt root root 2009-06-10 09:53 sqlite_stmt_journalsdrwxrwx--- system cache 2008-09-06 22:51 cached---rwxrwx system system 1970-01-01 08:00 sdcardlrwxrwxrwx root root 2009-06-09 22:11 etc -> /system/etcdrwxr-xr-x root root 2008-09-06 22:45 systemdrwxr-xr-x root root 1970-01-01 08:00 sysdrwxr-x--- root root 1970-01-01 08:00 sbin-rw-r--r-- root root 117 1970-01-01 08:00 runme.shdr-xr-xr-x root root 1970-01-01 08:00 proc-rwxr-x--- root root 1704 1970-01-01 08:00 init.trout.rc-rwxr-x--- root root 9329 1970-01-01 08:00 init.rc-rwxr-x--- root root 1677 1970-01-01 08:00 init.goldfish.rc-rwxr-x--- root root 106636 1970-01-01 08:00 init-rw-r--r-- root root 118 1970-01-01 08:00 default.propdrwxrwx--x system system 2008-09-06 22:51 datadrwx------ root root 2009-06-07 16:29 rootdrwxr-xr-x root root 2009-06-09 22:11 devsqlite_stmt_journals:一个根目录下的tmpfs文件系统,用于存放临时文件数据。
最全的Android源码目录结构详解
最全的Android源码目录结构详解收藏转自/a/android/2010/0622/67.htmlAndroid 2.1|-- Makefile|-- bionic (bionic C库)|-- bootable (启动引导相关代码)|-- build (存放系统编译规则及generic等基础开发包配置)|-- cts (Android兼容性测试套件标准)|-- dalvik (dalvik JAVA虚拟机)|-- development (应用程序开发相关)|-- external (android使用的一些开源的模组)|-- frameworks (核心框架——java及C++语言)|-- hardware (部分厂家开源的硬解适配层HAL代码)|-- out (编译完成后的代码输出与此目录)|-- packages (应用程序包)|-- prebuilt (x86和arm架构下预编译的一些资源)|-- sdk (sdk及模拟器)|-- system (底层文件系统库、应用及组件——C语言)`-- vendor (厂商定制代码)bionic 目录|-- libc (C库)| |-- arch-arm (ARM架构,包含系统调用汇编实现)| |-- arch-x86 (x86架构,包含系统调用汇编实现)| |-- bionic (由C实现的功能,架构无关)| |-- docs (文档)| |-- include (头文件)| |-- inet (?inet相关,具体作用不明)| |-- kernel (Linux内核中的一些头文件)| |-- netbsd (?nesbsd系统相关,具体作用不明)| |-- private (?一些私有的头文件)| |-- stdio (stdio实现)| |-- stdlib (stdlib实现)| |-- string (string函数实现)| |-- tools (几个工具)| |-- tzcode (时区相关代码)| |-- unistd (unistd实现)| `-- zoneinfo (时区信息)|-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,)| |-- alpha (apaha架构)| |-- amd64 (amd64架构)| |-- arm (arm架构)| |-- bsdsrc (?bsd的源码)| |-- i386 (i386架构)| |-- i387 (i387架构?)| |-- ia64 (ia64架构)| |-- include (头文件)| |-- man (数学函数,后缀名为.3,一些为freeBSD的库文件)| |-- powerpc (powerpc架构)| |-- sparc64 (sparc64架构)| `-- src (源代码)|-- libstdc++ (libstdc++ C++实现库)| |-- include (头文件)| `-- src (源码)|-- libthread_db (多线程程序的调试器库)| `-- include (头文件)`-- linker (动态链接器)`-- arch (支持arm和x86两种架构)bootable 目录.|-- bootloader (适合各种bootloader的通用代码)| `-- legacy (估计不能直接使用,可以参考)| |-- arch_armv6 (V6架构,几个简单的汇编文件)| |-- arch_msm7k (高通7k处理器架构的几个基本驱动)| |-- include (通用头文件和高通7k架构头文件)| |-- libboot (启动库,都写得很简单)| |-- libc (一些常用的c函数)| |-- nandwrite (nandwirte函数实现)| `-- usbloader (usbloader实现)|-- diskinstaller (android镜像打包器,x86可生产iso)`-- recovery (系统恢复相关)|-- edify (升级脚本使用的edify脚本语言)|-- etc (init.rc恢复脚本)|-- minui (一个简单的UI)|-- minzip (一个简单的压缩工具)|-- mtdutils (mtd工具)|-- res (资源)| `-- images (一些图片)|-- tools (工具)| `-- ota (OTA Over The Air Updates升级工具)`-- updater (升级器)build目录.|-- core (核心编译规则)|-- history (历史记录)|-- libs| `-- host (主机端库,有android “cp”功能替换)|-- target (目标机编译对象)| |-- board (开发平台)| | |-- emulator (模拟器)| | |-- generic (通用)| | |-- idea6410 (自己添加的)| | `-- sim (最简单)| `-- product (开发平台对应的编译规则)| `-- security (密钥相关)`-- tools (编译中主机使用的工具及脚本)|-- acp (Android "acp" Command)|-- apicheck (api检查工具)|-- applypatch (补丁工具)|-- apriori (预链接工具)|-- atree (tree工具)|-- bin2asm (bin转换为asm工具)|-- check_prereq (检查编译时间戳工具)|-- dexpreopt (模拟器相关工具,具体功能不明)|-- droiddoc (?作用不明,java语言,网上有人说和JDK5有关)|-- fs_config (This program takes a list of files and directories)|-- fs_get_stats (获取文件系统状态)|-- iself (判断是否ELF格式)|-- isprelinked (判断是否prelinked)|-- kcm (按键相关)|-- lsd (List symbol dependencies)|-- releasetools (生成镜像的工具及脚本)|-- rgb2565 (rgb转换为565)|-- signapk (apk签名工具)|-- soslim (strip工具)`-- zipalign (zip archive alignment tool)dalvik目录dalvik虚拟机.|-- dalvikvm (main.c的目录)|-- dexdump (dex反汇编)|-- dexlist (List all methods in all concrete classes in a DEX file.)|-- dexopt (预验证与优化)|-- docs (文档)|-- dvz (和zygote相关的一个命令)|-- dx (dx工具,将多个java转换为dex)|-- hit (?java语言写成)|-- libcore (核心库)|-- libcore-disabled (?禁用的库)|-- libdex (dex的库)|-- libnativehelper (Support functions for Android's class libraries)|-- tests (测试代码)|-- tools (工具)`-- vm (虚拟机实现)development 目录(开发者需要的一些例程及工具)|-- apps (一些核心应用程序)| |-- BluetoothDebug (蓝牙调试程序)| |-- CustomLocale (自定义区域设置)| |-- Development (开发)| |-- Fallback (和语言相关的一个程序)| |-- FontLab (字库)| |-- GestureBuilder (手势动作)| |-- NinePatchLab (?)| |-- OBJViewer (OBJ查看器)| |-- SdkSetup (SDK安装器)| |-- SpareParts (高级设置)| |-- Term (远程登录)| `-- launchperf (?)|-- build (编译脚本模板)|-- cmds (有个monkey工具)|-- data (配置数据)|-- docs (文档)|-- host (主机端USB驱动等)|-- ide (集成开发环境)|-- ndk (本地开发套件——c语言开发套件)|-- pdk (Plug Development Kit)|-- samples (例程)| |-- AliasActivity (?)| |-- ApiDemos (API演示程序)| |-- BluetoothChat (蓝牙聊天)| |-- BrowserPlugin (浏览器插件)| |-- BusinessCard (商业卡)| |-- Compass (指南针)| |-- ContactManager (联系人管理器)| |-- CubeLiveWallpaper (动态壁纸的一个简单例程)| |-- FixedGridLayout (像是布局)| |-- GlobalTime (全球时间)| |-- HelloActivity (Hello)| |-- Home (Home)| |-- JetBoy (jetBoy游戏)| |-- LunarLander (貌似又是一个游戏)| |-- MailSync (邮件同步)| |-- MultiResolution (多分辨率)| |-- MySampleRss (RSS)| |-- NotePad (记事本)| |-- RSSReader (RSS阅读器)| |-- SearchableDictionary (目录搜索)| |-- SimpleJNI (JNI例程)| |-- SkeletonApp (空壳APP)| |-- Snake (snake程序)| |-- SoftKeyboard (软键盘)| |-- Wiktionary (?维基)| `-- WiktionarySimple(?维基例程)|-- scripts (脚本)|-- sdk (sdk配置)|-- simulator (?模拟器)|-- testrunner (?测试用)`-- tools (一些工具)external 目录.|-- aes (AES加密)|-- apache-http (网页服务器)|-- astl (ASTL (Android STL) is a slimmed-down version of the regular C++ STL.)|-- bison (自动生成语法分析器,将无关文法转换成C、C++)|-- blktrace (blktrace is a block layer IO tracing mechanism)|-- bluetooth (蓝牙相关、协议栈)|-- bsdiff (diff工具)|-- bzip2 (压缩工具)|-- clearsilver (html模板系统)|-- dbus (低延时、低开销、高可用性的IPC机制)|-- dhcpcd (DHCP服务)|-- dosfstools (DOS文件系统工具)|-- dropbear (SSH2的server)|-- e2fsprogs (EXT2文件系统工具)|-- elfcopy (复制ELF的工具)|-- elfutils (ELF工具)|-- embunit (Embedded Unit Project)|-- emma (java代码覆盖率统计工具)|-- esd (Enlightened Sound Daemon,将多种音频流混合在一个设备上播放)|-- expat (Expat is a stream-oriented XML parser.)|-- fdlibm (FDLIBM (Freely Distributable LIBM))|-- freetype (字体)|-- fsck_msdos (dos文件系统检查工具)|-- gdata (google的无线数据相关)|-- genext2fs (genext2fs generates an ext2 filesystem as a normal (non-root) user)|-- giflib (gif库)|-- googleclient (google用户库)|-- grub (This is GNU GRUB, the GRand Unified Bootloader.)|-- gtest (Google C++ Testing Framework)|-- icu4c (ICU(International Component for Unicode)在C/C++下的版本)|-- ipsec-tools (This package provides a way to use the native IPsec functionality )|-- iptables (防火墙)|-- jdiff (generate a report describing the difference between two public Java APIs.)|-- jhead (jpeg头部信息工具)|-- jpeg (jpeg库)|-- junit (JUnit是一个Java语言的单元测试框架)|-- kernel-headers (内核的一些头文件)|-- libffi (libffi is a foreign function interface library.)|-- libpcap (网络数据包捕获函数)|-- libpng (png库)|-- libxml2 (xml解析库)|-- mtpd (一个命令)|-- netcat (simple Unix utility which reads and writes dataacross network connections)|-- netperf (网络性能测量工具)|-- neven (看代码和JNI相关)|-- opencore (多媒体框架)|-- openssl (SSL加密相关)|-- openvpn (VPN开源库)|-- oprofile (OProfile是Linux内核支持的一种性能分析机制。
Android实现上传文件到服务器实例详解
Android实现上传⽂件到服务器实例详解本实例实现每隔5秒上传⼀次,通过服务器端获取⼿机上传过来的⽂件信息并做相应处理;采⽤Android+Struts2技术。
⼀、Android端实现⽂件上传1)、新建⼀个Android项⽬命名为androidUpload,⽬录结构如下:2)、新建FormFile类,⽤来封装⽂件信息package com.ljq.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;/*** 上传⽂件*/public class FormFile {/* 上传⽂件的数据 */private byte[] data;private InputStream inStream;private File file;/* ⽂件名称 */private String filname;/* 请求参数名称*/private String parameterName;/* 内容类型 */private String contentType = "application/octet-stream";public FormFile(String filname, byte[] data, String parameterName, String contentType) {this.data = data;this.filname = filname;this.parameterName = parameterName;if(contentType!=null) this.contentType = contentType;}public FormFile(String filname, File file, String parameterName, String contentType) {this.filname = filname;this.parameterName = parameterName;this.file = file;try {this.inStream = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();}if(contentType!=null) this.contentType = contentType;}public File getFile() {return file;}public InputStream getInStream() {return inStream;}public byte[] getData() {return data;}public String getFilname() {return filname;}public void setFilname(String filname) {this.filname = filname;}public String getParameterName() {return parameterName;}public void setParameterName(String parameterName) {this.parameterName = parameterName;}public String getContentType() {return contentType;}public void setContentType(String contentType) {this.contentType = contentType;}}3)、新建SocketHttpRequester类,封装上传⽂件到服务器代码package com.ljq.utils;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import .InetAddress;import .Socket;import .URL;import java.util.Map;/*** 上传⽂件到服务器** @author Administrator**/public class SocketHttpRequester {/*** 直接通过HTTP协议提交数据到服务器,实现如下⾯表单提交功能:* <FORM METHOD=POST ACTION="http://192.168.1.101:8083/upload/servlet/UploadServlet" enctype="multipart/form-data"><INPUT TYPE="text" NAME="name"><INPUT TYPE="text" NAME="id"><input type="file" name="imagefile"/><input type="file" name="zip"/></FORM>* @param path 上传路径(注:避免使⽤localhost或127.0.0.1这样的路径测试,因为它会指向⼿机模拟器,你可以使⽤或http://192.168.1.101:8083这样的路径测试) * @param params 请求参数 key为参数名,value为参数值* @param file 上传⽂件*/public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception{final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志int fileDataLength = 0;for(FormFile uploadFile : files){//得到⽂件类型数据的总长度StringBuilder fileExplain = new StringBuilder();fileExplain.append("--");fileExplain.append(BOUNDARY);fileExplain.append("\r\n");fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");fileExplain.append("\r\n");fileDataLength += fileExplain.length();if(uploadFile.getInStream()!=null){fileDataLength += uploadFile.getFile().length();}else{fileDataLength += uploadFile.getData().length;}}StringBuilder textEntity = new StringBuilder();for (Map.Entry<String, String> entry : params.entrySet()) {//构造⽂本类型参数的实体数据textEntity.append("--");textEntity.append(BOUNDARY);textEntity.append("\r\n");textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");textEntity.append(entry.getValue());textEntity.append("\r\n");}//计算传输给服务器的实体数据总长度int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;URL url = new URL(path);int port = url.getPort()==-1 ? 80 : url.getPort();Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);OutputStream outStream = socket.getOutputStream();//下⾯完成HTTP请求头的发送String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";outStream.write(requestmethod.getBytes());String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd outStream.write(accept.getBytes());String language = "Accept-Language: zh-CN\r\n";outStream.write(language.getBytes());String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";outStream.write(contenttype.getBytes());String contentlength = "Content-Length: "+ dataLength + "\r\n";outStream.write(contentlength.getBytes());String alive = "Connection: Keep-Alive\r\n";outStream.write(alive.getBytes());String host = "Host: "+ url.getHost() +":"+ port +"\r\n";outStream.write(host.getBytes());//写完HTTP请求头后根据HTTP协议再写⼀个回车换⾏outStream.write("\r\n".getBytes());//把所有⽂本类型的实体数据发送出来outStream.write(textEntity.toString().getBytes());//把所有⽂件类型的实体数据发送出来for(FormFile uploadFile : files){StringBuilder fileEntity = new StringBuilder();fileEntity.append("--");fileEntity.append(BOUNDARY);fileEntity.append("\r\n");fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");outStream.write(fileEntity.toString().getBytes());if(uploadFile.getInStream()!=null){byte[] buffer = new byte[1024];int len = 0;while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){outStream.write(buffer, 0, len);}uploadFile.getInStream().close();}else{outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);}outStream.write("\r\n".getBytes());}//下⾯发送数据结束标志,表⽰数据已经结束outStream.write(endline.getBytes());BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败return false;}outStream.flush();outStream.close();reader.close();socket.close();return true;}/*** 提交数据到服务器* @param path 上传路径(注:避免使⽤localhost或127.0.0.1这样的路径测试,因为它会指向⼿机模拟器,你可以使⽤或http://192.168.1.10:8080这样的路径测试)* @param params 请求参数 key为参数名,value为参数值* @param file 上传⽂件*/public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception{return post(path, params, new FormFile[]{file});}}4)、新建MainActivity类,实现每隔5秒上传⼀次package com.ljq.activity;import java.io.File;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.util.Log;import com.ljq.utils.FormFile;import com.ljq.utils.SocketHttpRequester;public class MainActivity extends Activity {private File file;private Handler handler;private static final String TAG="MainActivity";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);Log.i(TAG, "onCreate");file = new File(Environment.getExternalStorageDirectory(), "123.rmvb");Log.i(TAG, "照⽚⽂件是否存在:"+file);handler=new Handler();handler.post(runnable);}Runnable runnable=new Runnable() {public void run() {Log.i(TAG, "runnable run");uploadFile(file);handler.postDelayed(runnable, 5000);}};/*** 上传图⽚到服务器** @param imageFile 包含路径*/public void uploadFile(File imageFile) {Log.i(TAG, "upload start");try {String requestUrl = "http://192.168.1.101:8083/upload/upload/execute.do";//请求普通信息Map<String, String> params = new HashMap<String, String>();params.put("username", "张三");params.put("pwd", "zhangsan");params.put("age", "21");params.put("fileName", imageFile.getName());//上传⽂件FormFile formfile = new FormFile(imageFile.getName(), imageFile, "image", "application/octet-stream"); SocketHttpRequester.post(requestUrl, params, formfile);Log.i(TAG, "upload success");} catch (Exception e) {Log.i(TAG, "upload error");e.printStackTrace();}Log.i(TAG, "upload end");}}5)、修改清单⽂件<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.ljq.activity"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity></application><uses-sdk android:minSdkVersion="4" /><uses-permission android:name="android.permission.INTERNET" /></manifest>启动模拟器,运⾏如下:⼆、服务器端⽤来获取Android端上传过来的⽂件信息1)、新建⼀个web项⽬命名为upload,⽬录结构如下注意:记得加⼊struts2 jar包,需加⼊的jar如下2)、新建action类,命名为UploadAction,内容如下package com.ljq.action;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;/*** 获取Android端上传过来的信息** @author Administrator**/@SuppressWarnings("serial")public class UploadAction extends ActionSupport {// 上传⽂件域private File image;// 上传⽂件类型private String imageContentType;// 封装上传⽂件名private String imageFileName;// 接受依赖注⼊的属性private String savePath;@Overridepublic String execute() {HttpServletRequest request=ServletActionContext.getRequest();FileOutputStream fos = null;FileInputStream fis = null;try {System.out.println("获取Android端传过来的普通信息:");System.out.println("⽤户名:"+request.getParameter("username"));System.out.println("密码:"+request.getParameter("pwd"));System.out.println("年龄:"+request.getParameter("age"));System.out.println("⽂件名:"+request.getParameter("fileName"));System.out.println("获取Android端传过来的⽂件信息:");System.out.println("⽂件存放⽬录: "+getSavePath());System.out.println("⽂件名称: "+imageFileName);System.out.println("⽂件⼤⼩: "+image.length());System.out.println("⽂件类型: "+imageContentType);fos = new FileOutputStream(getSavePath() + "/" + getImageFileName());fis = new FileInputStream(getImage());byte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) != -1) {fos.write(buffer, 0, len);}System.out.println("⽂件上传成功");} catch (Exception e) {System.out.println("⽂件上传失败");e.printStackTrace();} finally {close(fos, fis);}return SUCCESS;}/*** ⽂件存放⽬录** @return*/public String getSavePath() throws Exception{return ServletActionContext.getServletContext().getRealPath(savePath);}public void setSavePath(String savePath) {this.savePath = savePath;}public File getImage() {return image;}public void setImage(File image) {this.image = image;}public String getImageContentType() {return imageContentType;}public void setImageContentType(String imageContentType) {this.imageContentType = imageContentType;}public String getImageFileName() {return imageFileName;}public void setImageFileName(String imageFileName) {this.imageFileName = imageFileName;}private void close(FileOutputStream fos, FileInputStream fis) {if (fis != null) {try {fis.close();fis=null;} catch (IOException e) {System.out.println("FileInputStream关闭失败");e.printStackTrace();}}if (fos != null) {try {fos.close();fis=null;} catch (IOException e) {System.out.println("FileOutputStream关闭失败");e.printStackTrace();}}}}3)、配置struts.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><!-- 该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
Android知识点
1、Android体系结构Android是基于Linux内核的软件平台和操作系统,采用了软件堆栈的架构,共分为4层:第一层是Linux内核,提供由操作系统内核管理的底层基础功能;第二层是中间件层,由函数库和Android运行时构成;第三层是应用程序框架层,提供了Android平台基本的管理功能和组件重用机制;第四层是应用程序层,提供了一系列核心应用程序。
2、Dalvik虚拟机基于寄存器的Java虚拟机,每个应用程序在一个独立的Dalvik 虚拟机上运行3、.apk(Android Package)文件,该文件实际上是个压缩包,可改为.zip解压缩4、Android两种开发环境:JDK + Eclipse + ADT + Android SDKJDK + Android Studio + Android SDK5、14:Min SDK Version最低SDK版本22:Target SDK Version目标SDK版本22:Compile SDK Version编译的SDK版本6、adb:Android Debug Bridge,连接PC与Android设备的桥梁adb connect 127.0.0.1:6555查看设备:adb devices安装软件:adb install <apk文件路径>卸载软件:命令1:adb uninstall <软件名>命令2:adb uninstall -k <软件名>登录设备shell:命令1:adb shell命令2:adb shell <command命令>从计算机上发送文件到目标机:adb push <本地路径> <远程路径>从目标机上下载文件到计算机:adb pull <远程路径> <本地路径>显示帮助信息:adb help7、Android项目目录:(代码与资源分开)src 源代码目录gen 目录(R.java文件是ADT自动生成,不能手动修改,R.java作用:src中的代码通过R.java访问res中的资源)res 资源目录(/res/layout/目录:界面布局文件,xml;/res/raw不参加编译的资源,不能生成对应文件)AndroidManifest.xml 清单文件(声明应用程序属性信息,声明组件,声明权限,唯一一个组件BroadcastReceiver不需在AndroidManifest中注册)8、四大组件:Activity,Service,BroadcastReceiver,ContentProvider,前3个组件的组件之间的通信由Intent实现,另一app需通过ContentResolver 来与ContentProvider通信。
APK及相关的Android路径
APK及相关的Android路径APK(Android package, ):android安装包,由(Android Assert Packaging Tool,已集成到⼯具集中)把AndroidManifest.xml、资源⽂件、lib动态链接库、dex(Dalvik⼆进制字节码)等归档成的zip压缩包。
assets:对应项⽬⼯程asset⽬录下的⽂件,可以使⽤AssetManager获取注:其下的main.obb.png为⼀个压缩⽅式为仅存储的标准zip⽂件lib:包含适⽤于不同处理器的第三⽅动态链接库,这⾥边可以有多个⼦⽬录。
如:armeabi、armeabi-v7a、 arm64-v8a,、x86,、x86_64以及mipsMETE-INF:存放签名证书等信息;其中包含两个签名⽂件(CERT.SF和CERT.RSA)和⼀个manifest⽂件(MANIFEST.MF)jdk1.8.0_77\bin\keytool.exe -printcert -file %apkdir%\CERT.RSA// 查看当前apk的签名信息res:包含那些没有被编译到resources.arsc的资源(如:应⽤图标、字符串表等)AndroidManifest.xml:⼆进制格式的manifest⽂件classes*.dex:Dalvik EXcutable file,Dalvik虚拟机执⾏程序,java⽂件先编译为class⽂件,然后打包成dex⼆进制字节码⽂件。
⼀个APK中有多个dex⽂件。
resources.arsc:存储编译好的资源,包括项⽬⼯程中的res/values⽬录⾥的xml⽂件,它们都被编译成⼆进制格式,也包括⼀些路径,指向那些没有被编译的资源,⽐如layout⽂件和图⽚Android系统⽬录结构/init 系统启动⽂件/bin 常⽤的系统本地命令(⼆进制)如:du、ls、mv等/systembuild.prop 系统设置和变更属性app 安装的系统应⽤所在的⽬录bin 常⽤的系统本地命令(⼆进制)如:ps、cp、rm等etc 系统配置⽂件hosts ⽤于配置IP或域名的重定向⽂件font 字体⽬录framework Java平台架构核⼼库,jar包和odex优化的⽂件lib 32位系统底层共享库,.so库⽂件lib64 64位系统底层共享库,.so库⽂件egllibGLES_android.solibart-compiler.solibart-dexlayout.solibart.solibc++.solibc.solibstdc++.solib_malloc_debug.solib_malloc_hooks.solibEGL.solibGLESv1_CM.solibGLESv2.solibGLESv3.so... ...xbin 不常⽤的系统管理⼯具,相当于linux的/sbinmediaaudio 铃声,提⽰⾳等⾳频⽂件, .oggnotifications 通知ui 界⾯alarms 警告ringtones 铃声usr ⽤户⽂件夹,包含共享、键盘布局、时间区域keycharskeylayoutsharesrec 配置......vendor ⼚商⽂件build.propapp ⼚商⾃带应⽤所在⽬录bin ⼚商⾃带命令⼯具etcliblib64egleglSubDriverAndroid.solibGL_adreno.solibGLESv1_CM_adreno.solibGLESv2_adreno.solibq3dtools_adreno.solibq3dtools_esx.solibQTapGLES.so libjson.so... .../etc --> 软链接指向 /system/etc/vendor --> 软链接指向/system/vendor/dev 存放设备节点⽂件/proc 全局系统信息/data ⽤户软件和各种数据local/tmp 临时⽬录,⽆权限要求app 普通程序安装⽬录data<package_name>files Context.getFilesDir() ,Context.openFileOutput() 获取的⽬录,应⽤安装⽬录下cache Context.getCacheDir() 获取的⽬录,应⽤安装⽬录下,系统会⾃动在内存不⾜或⽬录⼤⼩达到特定数值时⾃动清理。
安卓
1.4 Android体系结构采用软件堆层的架构,共分为四层⏹Linux内核❑硬件和其他软件堆层之间的一个抽象隔离层❑提供安全机制、内存管理、进程管理、网络协议堆栈、和驱动程序等⏹中间件层由函数库和Android运行时构成❑函数库,主要提供一组基于C/C++的函数库❑SQLite,轻量级的关系数据库引擎❑OpenGL ES,基于3D图像加速❑Android运行时❑Dalvik虚拟机,实现基于Linux内核的线程管理和底层内存管理⏹应用程序框架❑提供Android平台基本的管理功能和组件重用机制❑Location Manager,管理与地图相关的服务功能⏹应用程序❑提供一系列的核心应用程序❑包括电子邮件客户端、浏览器、通讯录和日历等2.2.1 Android SDK目录结构(+)add-ons(+)google_apis-3(-)README.txt(+)docs(+)platforms(+)android-1.1(+)android-1.5(+)tools(+)usb_driver(+)amd64(+)x86(-)documentation.html(-)RELEASE_NOTES.html1.add-one 目录下的是Google提供地图开发的库函数,支持基于Google Map 的地图开发2.docs目录下的是Android SDK的帮助文档,通过根目录下的documentation.html 文件启动3.platforms目录中存在两个子目录android-1.1和android-1.5,分别用来保存1.1版本和1.5版本的Android SDK 的库函数、外观样式、程序示例和辅助工具等4.tools目录下的是通用的Android开发和调试工具b_driver目录下保了用于amd64和x86平台的USB驱动程序6.RELEASE_NOTES.html是Android SDK的发布说明2.2.3 开发工具1.Android模拟器Android SDK 的最重要的工具;支持加载SD卡映像文件,更改模拟网络状态,延迟和速度,模拟电话呼叫和接收短信等;不支持接听真实电话,USB连接,摄像头捕获,设备耳机,电池电量和AC电源检测,SD卡插拔检查和使用蓝牙设备;Android模拟器外观2.Android调试器连接Android设备和模拟器的工具;客户端/服务器程序,包含守护程序、服务器程序和客户端程序3.DDMSAndroid系统中内置的调试工具;监视Android系统中进程、堆栈信息,查看logcat 日志,实现端口转发服务和屏幕截图功能,模拟器电话呼叫和SMS短信,以及浏览Android模拟器文件系统等3.2 Android程序结构⏹在“Package Explore”中,ADT以工程名称HelloAndroid作为根目录,将所有字段生成的和非自动生成的文件都保存在这个根目录下⏹根目录包含四个子目录:src、assets、res和gen,一个库文件android.jar,以及两个工程文件Androidmanifest.xml和default.properties⏹src目录是源代码目录,所有允许用户修改的java文件和用户自己添加的java文件都保存在这个目录中⏹HelloAndroid工程建立初期,ADT根据用户在工程向导中的“CreateActivity”选项,自动建立HelloAndroid.java文件⏹HelloAndroid.java是Android工程向导根据Activity名称创建的java文件,这个文件完全可以手工修改。
Android
Android 介绍review1.Android 开发环境搭建2.第一个项目—HelloAndroid3.Android项目目录结构4.Android应用解析5.Android生命周期6.Widget开发7.Android中的显示单位8.DDMS的简介与使用9.apk的安装与卸载1.Android 开发环境搭建review•所需软件:•JDK: 1.6以上•Eclipse:3.4以上•Android SDK :/sdk •ADT :https:///android/eclipsereview步骤1:安装JDK 、配置java环境步骤2:Eclipse安装步骤3:安装SDK:下载解压后,运行“SDK Setup.exe”,选择要安装的API。
版本和SDK文档SDK配置:将SDK安装文件夹下的tools文件夹的路径加入环境变量“Path”中步骤4:ADT :Android Development Tools Plug-in, 是Android在Eclipse上的开发工具。
安装ADT:启动eclipse,点击“Help”菜单,依次选择“Software Update”和“Avaiable Software”选项,点击“Add Site”按钮,输入地址“http:///android/eclipse”,根据提示即可完成关联SDK:打开菜单“window”,依次选择“Preferences”-——“Android”,点击“Browse…”,选择Android SDK的安装路径,点击”OK”即可reviewSDK目录:add-ons:第3方插件或者是jar包docs: 相关文档,点击index.html可查看platforms: 各Android版本资源samples: google提供的应用,导入工程即可运行tools: 各种Android工具,如adb.exe等usb_driver: USB驱动2.第一个项目—HelloAndroid review(1)右键New——Project…,在“New Project”对话框中选择Android——Android Projectreview(2)点击“next”按钮,进入“NewAndroid Project”,Project name中输入“HelloAndroid”,Build Target中选择“Android 2.0”或其他Application name中输入“HelloAndroid”Package name中输入“com.thunderst.android.helloAndroid”Create Activity中输入“HelloAndroid”点击“Finish”,HelloAndroid项目创建完成review(3)创建AVD(Android Virtual Device)点击“window”菜单,选择“Android SDK and AVD manager”点击左边的“Virtual Devices”,再点击右边的“New…”,新建AVD填写Name,Target处选择API等级,Size 处填写SD卡的大小,Skin处设计模拟器的风格review(4)配置AVD点击“Run”菜单,选择“Run configurations”点击左边的项目,在右边的Target中选择已创建的AVD 点击Run按钮,即可运行HelloAndroid项目review 3.Android项目目录结构•src/java原代码存放目录•gen/ 自动生成目录,项目中所有资源的索引文件目录中存放所有由Android开发工具自动生成的文件。
AndroidStudio目录结构和Gradle
Android Studio 项目结构Android Studio 的一个project (项目)下可以包含多个独立的module(模块),图中Bugtags-Android-Demo 便是一个项目,app 便是一个module。
结构如下。
project/build.gradle:项目的build.gradle 文件,主要是全局的远程库配置、gradle 插件版本等信息project/app:名字为app 的模块project/build.gradle:模块的build.gradle 文件,是最关键的配置文件,后续会有文章继续专门介绍gradle build systemproject/app/src:源码文件夹project/app/src/java:放置代码文件project/app/src/jniLibs:默认的.so 库放置的位置,可以在模块的build.gradle 中通过jniLibs.srcDirs 值来修改所在位置project/app/libs:放置 .jar 库与gradle相关的文件:1.gradle.properties:从名字上就知道它是一个配置文件,没错,这里面可以定义一些常量供build.gradle使用,比如可以配置签名相关信息如keystore位置,密码,keyalias等。
2.settings.gradle:这个文件是用来配置多模块的,比如你的项目有两个模块module-a,module-b,那么你就需要在这个文件中进行配置,格式如下:1 i nclude ':module-a',':module-b'3.gradle文件夹:这里面有两个文件,gradle-wrapper.jar和gradle-wrapper.properties,它们就是gradle wrapper。
gradle项目都会有,你可以通过命令gradle init来创建它们(前提是本地安装了gradle并且配置到了环境变量中)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android 项目的目录结构1、src - 用于放置源程序2、gen - 自动生成 R.java 文件,用于引用资源文件(即 res 目录下的数据)资源目录 resRes资源文件夹=========================================* res 中的资源,会在生成的 R 类中,生成索引 id* getResources() 方法,获得 Resources 对象,来访问 res 中的资源Res根据不同的资源内容预定义了相应的子目录,这些目录的名字不能任意定义。
Res目录只支持一级子目录,不支持多级子目录res/layout:用于放置布局用的xml文件,这些xml用于定义一个界面的布局1、res/layout/main.xml代码<?xml version="1.0" encoding="utf-8"?><!--设置 ID 的方式:ID前加前缀,@+id/引用资源文件内字符串资源的方式:指定的资源名称前加前缀,@string/--><LinearLayout xmlns:android="/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:id="@+id/layout"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/txt"/></LinearLayout>res/drawable:其中存放图片。
3、res/drawable 目录下放置一个名为 icon.png 的图片文件drawable在2.0版本以后出现了若干个drawable目录根据屏幕硬件尺寸不同,选取使用不同drawable下的图片资源res/values:存放的是各种类型的数据。
是用xml文件保存。
2、res/values/strings.xml代码<?xml version="1.0" encoding="utf-8"?><resources><string name="hello">layout 直接调用 values 中的字符串</string><string name="hello2">编程方式调用 values 中的字符串</string><string name="app_name">webabcd_hello</string></resources>用于:1:最大程度的重用资源2:便于国际化处理* 将文本、数组、颜色、样式外化* 国际化 I18n - Internationalization本地化 L10n - Localization* valuesvalues-en-rUSvalues-en-eUKvalues-zh-rCNvalues-zh-rTWvalues-krvalues-rJP* 布局文件.xml@string/hello_world* ActivitygetResources().getString("hello_world");res/xml: 存放我们程序中需要使用的xml文件res/raw:存放原始文件,原始的,未编译(未压缩)的文件通常:视频文件,音频文件* 不能创建子目录* 获得 raw 中文件的输入流:in =getResources().openRawResource(R.raw.xxx);* 资源的国际化rawraw-en-rUKraw-en-rUS raw-zh-rHK raw-zh-rCN raw-zh-rTWres/anim: android支持的动画文件(用xml定义)在res目录下的资源文件名:1:必须符合java标识符命名规则2:字母不能含有大写5、AndroidManifest.xml - Android 程序的清单文件,相当于配置文件,配置应用程序名称、图标、Activity、Service、Receiver等4、AndroidManifest.xml代码<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.webabcd.hello"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_nam e"><activity android:name=".Main"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="UNCHER"/> </intent-filter></activity></application><uses-sdk android:minSdkVersion="3"/></manifest>xml 文件夹=============================================== * xml 文件会被编译(压缩)* 创建 XmlPullParsergetResources().getXml(索引id)引用资源R类android虽然没有明确说明,但是values目录下的资源不是根据文件名在R中对应的。
而是根据values中xml 的内容决定android使用R类对访问资源提供了统一的方式。
使用R类中的不同常量,来获取对应的相关资源。
R类中的常量我们通常叫它为资源的ID。
通过R类在程序中获取资源的方式:Resource类该实例用于管理当前应用程序中的所有资源。
获取该实例的方式为:Context.getResource()方法Resource中提供了获取不同资源的方法getColor(int resId)getString(int resId)getDrawable(int resId)getStringArray(int resId)获取字符串数组在资源中引用资源需要使用资源引用语法@[package:]type/nameEnvironment类andorid.os.Environment用于访问环境变量的类通常我们使用该类去访问SDCard访问SDCard相关的方法获取SDCard的状态String getExternalStorageState()Environment类提供了相应常量来对应其返回值MEDIA_MOUNTED 表明该外设已经挂载,并可以读写MEDIA_MOUNTED_READ_ONLY 表明该外设只有可读权限MEDIA_REMOVE 该外设不存在MEDIA_UNMOUNTABLE 检测出该设备,但无法挂载MEDIA_UNMOUNTED 外设已经卸载MEDIA_BAD_REMOVAL 在未卸载该外设时将其拔出MEDIA_CHECKING 表示该外设正在检查获取表示SDCard的File对象,用于操作android系统分配的一些目录对应的常量:DIRECTORY_MUISC 存放音乐的标准目录DIRECTORY_MOVIES 存放视频的标准目录....获取相关目录的方法:File getDataDirectory() 获取android的数据目录File getDownloadCacheDirectory()获取android下载缓存目录File getExternalStorageDirectory()获取SDCard目录File getRootDirectory() 获取android根目录File getExternalStoragePublicDirectory()获取sdcard中指定的类型文件的公共存储目录StatFs类StatFs类是用于模拟Linux的df命令的一个类。
获取Sdcard和手机内存使用状况获取手机使用状况的相关方法int getAvailableBlocks():获取可用的存储空间(当前程序可用的空间)int getBlockCount() :获取该区域可用的文件系统数int getBlockSize() :大小(字节为单位)1个文件系统大小int getFreeBlocks() :该区域剩余空间(包含系统占用的可用空间)。