热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用Eclipse开发和调试Android应用程序(二)

二、创建AndroidEclipse工程请参考小生的《AndroidSDK2.3与Eclipse最新版开发环境搭建(五)》,博文地址&#x

二、 创建Android Eclipse工程

请参考小生的《Android SDK 2.3与Eclipse最新版开发环境搭建(五)》,博文地址:http://blog.sina.com.cn/s/blog_573860a90100ownd.html or http://blog.csdn.net/deaboway/archive/2011/01/30/6170449.aspx

三、 工程结构详细解析

1. 工程结构

在Eclipse的Java透视图中,可以看到工程的Package Explorer如下图:

clip_image002

具体包括:

src 文件夹 - 包含示例应用程序的包,即org.deaboway.test。

R.java - Android Developer Tools 自动创建这个文件,它提供访问 Android 应用程序的各种资源所需的常量。后面会详细讨论 R 类与资源之间的关系。

HelloAndroidWorld.java - 应用程序的主活动类的实现。

Referenced libraries - 包含 android.jar,这是 Android SDK 中的 Android 运行时类的 jar 文件。

res 文件夹- 包含应用程序的资源,包括:

· drawable - 图标:这个文件夹包含图形文件,比如图标和位图。

· layout - 布局文件:这个文件夹包含表示应用程序布局和视图的 XML 文件。

· values - 字符串:这个文件夹包含 strings.xml 文件。这是为应用程序实现字符串本地化的主要方法。

AndriodManifest.xml - 示例应用程序的部署描述符。

default.properties 和proguard.cfg – 从2.3版本以后,android sdk 本身包含proguard,可以通过正常的编译方式也能实现代码混淆,我们可以看到android-sdk-windows\tools\下面多了一个proguard文件夹。防止反编译工具进行反编译,保证代码安全。

2. 主类分析

这个示例应用程序由一个Activity(活动)组成,即HelloAndroidWorld。正如前面提到的,HelloAndroidWorld类是在HelloAndroidWorld.java 文件中实现的。

package org.deaboway.test;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class HelloAndroidWorld extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// TextView textView = new TextView(this);

// textView.setText("Hello Android World!");

// setContentView(textView);

setContentView(R.layout.main);

}

}

在这个源代码片段中,要注意几点:

  • HelloAndroidWorld 是一个普通的 Java 类,包含包和导入语句。
  • HelloAndroidWorld 扩展 android.app 包中的 Android 基类 Activity。
  • onCreate() 方法是这个活动的入口点,它接受一个 Bundle 类型的参数。Bundle 类本质上是 map 或 hashmap 的包装器。在这个参数中传递构造活动所需的元素。这里暂时不讨论这个参数。
  • setContentView() 负责用 R.layout.main 参数创建主 UI。R.layout.main 是应用程序资源中主布局的标识符。

3. R.java文件

R.java 文件是在构建时自动创建的,所以不要手工修改它,因为所有修改都会丢失。本实例的R.java文件内容如下:

package org.deaboway.test;

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 类包含一些匿名子类,每个子类包含前面描述的各种资源的标识符。注意,这些类都是静态的。

请注意 R.layout.main 代表的元素。这个标识符代表由 main.xml 定义的布局。在活动的 onCreate 方法中可以使用这个值:setContentView(R.layout.main)。这就是在运行时把特定的活动(这里是HelloAndroidWorld)和特定的布局(主布局)联系在一起的方法。

4. main.xml文件

本示例应用程序包含一个活动和一个视图。应用程序包含一个名为 main.xml 的文件,它代表活动的主 UI 的视觉方面。

注意,在 main.xml 中没有指定在哪里使用这个布局。这意味着,如果需要的话,可以在多个活动中使用它。

"1.0" encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

这是最简单的布局,其中只有一个垂直的线性布局,这意味着所有元素排成一列。这里有一个 TextView 元素,它与其他开发环境中的标签类似。TextView 代表不可编辑的静态文本。

注意,每个视图元素(比如这个示例中的 LinearLayout 和 TextView)都有属于 Android 名称空间的属性。一些属性是所有视图元素都有的,比如 android:layout_width 和android:layout_height。这些属性可以采用的值是:

fill_parent - 使视图元素占满可用的空间。也可以认为这就是 “拉伸”。

wrap_content - 这个值让 Android 把元素一个接一个地排列,不进行拉伸。

5. AndroidManifest.xml文件

AndroidManifest.xml 文件是 Android 应用程序的部署描述符。这个文件列出应用程序中包含的所有Activity(活动)、ContentProvider(内容提供程序)、BroadcastReceiver(广播接收器)与Service(服务),以及应用程序支持的 IntentFilter。下面是这个示例应用程序的完整的 AndroidManifest.xml 文件。

"1.0" encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"

package="org.deaboway.test"

android:versionCode="1"

android:versionName="1.0">

"@drawable/icon" android:label="@string/app_name">

".HelloAndroidWorld"

android:label="@string/app_name">

"android.intent.action.MAIN" />

"android.intent.category.LAUNCHER" />

  • 这里指定了源文件中的包名。采用与 Java 源文件和导入语句相似的模式。 标记的实际作用是 “导入” 这个包中的类。在这个文件中,所有非完全限定的类都属于 package 属性指定的包。
  • 标记的一个属性引用了应用程序的一个资源。请注意 drawable 标识符前面的 @ 符号。这里的意思是,在应用程序资源的 drawable 文件夹中寻找名为 “icon” 的资源。
  • 标记包含以下属性和值:
    • android:name表示实现这个活动的 Java 类。
    • android:label 是应用程序的名称。注意,它来自一个字符串资源。string.xml 文件包含应用程序的本地化字符串。
    • 表示应用程序中可用的 IntentFilter。这是 Android 应用程序中最常见的 IntentFilter。这个过滤器的实际意思是,它实现 “主” 操作(也就是入口点),而且它位于 OS 的启动器中。这意味着可以在 Android 设备上像启动其他应用程序一样,从应用程序主列表中启动它。

四、 应用程序调试

要想检查正在运行的应用程序中发生了什么情况,就需要查看正在运行的 Dalvik VM。在 Eclipse 中,选择 Window > Open Perspective > Other。在出现的对话框中选择 DDMS。这会在 Eclipse 中打开一个新的透视图,其中有许多有趣的窗口。

DDMS 为IDE和Emultor(or GPhone)架起来了一座桥梁。Developer可以通过DDMS看到目标机器上运行的进程/线程状态:可以让Eclipse程序连接到开发机上运行;可以看进程的heap信息、logcat信息、进程分配内存情况;可以像目标机发送短信、发送地理位置信息以及打电话;可以像gdb一样attach 某一个进程调试。

下面简要介绍一下 DDMS 透视图中提供的资源:

1. Devices

Device 中罗列了Emulator中所有的进程,选项卡右上角那一排按钮分别为:Debug the selected process调试进程、Update Heap更新进程堆栈信息、Dump HPROF file检查HPROF(Heap/CPU Profiling Tool)文件、Cause GC调用垃圾回收、更新进程Update Threads、Start Method Profiling开始方法分析、Stop Process停止某个进程,和Screen Capture抓取 Emulator目前的屏幕。当你选中某个进程,并按下调试进程按钮时,如果eclipse中有这个进程的代码,那就可以进行源代码级别的调试。有点像 gdb attach。图片抓取按钮可以把当前android的显示桌面抓到你的机器上,也是非常有用。

clip_image004

这里可以查看到所有与DDMS连接的终端的详细信息,以及每个终端正在运行的APP进程,每个进程最右边相对应的是与调试器链接的端口。因为Android是基于Linux内核开发的操作平台,同时也保留了Linux中特有的进程ID,它介于进程名和端口号之间。

DDMS监听第一个终端App进程的端口为8600,APP进程将分配8601,如果有更多终端或者更多APP进程将按照这个顺序依次类推。DDMS通过8700端口(”base port”)接收所有终端的指令。

2. Emulator Control

通过这个面板的一些功能可以非常容易的使测试终端模拟真实手机所具备的一些交互功能,比如:接听电话,根据选项模拟各种不同网络情况,模拟接受SMS消息和发送虚拟地址坐标用于测试GPS功能等。

clip_image006

Telephony Status: 通过选项模拟语音质量以及信号连接模式。

Telephony Actions: 模拟电话接听和发送SMS到测试终端。

Location Control: 模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地理标识,可以通过以下3种方式:

· Manual: 手动为终端发送二维经纬坐标。

· GPX: 通过GPX文件导入序列动态变化地理坐标,从而模拟行进中GPS变化的数值。

· KML: 通过KML文件导入独特的地理标识,并以动态形式根据变化的地理坐标显示在测试终端。

如:在Emulator Control\Telephony Actions 中输入如上图内容“Android 中文”,单击发送后,在Android模拟器中打开Messaging,看到下面的短信:

clip_image008

3. 文件管理器

显示文件系统信息。File Explorer非常有用:它可以把文件上传到Android、或者从Android上下载文件下来、也可以进行文件删除操作。选项卡右上角有上传、下载、删除三个按钮。一般情况下,File Explorer会有如下三个目录:data、sdcard、system。

· data对应手机的RAM,会存放Android OS 运行时的Cache等临时数据(/data/dalvik-cache目录);没有root权限时apk程序安装在/data/app中(只是存放apk 文件本身);/data/data中存放Android中所有程序(系统apk+第三方apk)的详细目录信息。

· mnt是mount,挂装的意思,mnt目录下的 sdcard对应sd卡。

· system对应手机的ROM,OS以及系统自带apk程序等存放在这里。

用户应用程序部署在 /data/app 目录中,而 Android 内置的应用程序部署在 /system/app 目录中。

clip_image010

4. Threads、Heap、Allocation Tracker

Threads视图列出当前进程的所有线程。

Heap视图展示一些堆的状态,在垃圾回收其间更新。当选定一个虚拟机时, VM Heap视图不能显示数据,可以点击右边面包上的带有绿色的”Show heap updates”按钮,然后在点击”Cause GC “实施垃圾回收更新堆的状态。

在Allocation Tracker视图里,我们可以跟踪每个选中的虚拟机的内存分配情况。点击”Start Tracking”后点击”Get Allocations “就可以看到。

例如,为了查看Garbage Collection信息:点击 [Start Tracking]按钮 -> 保持程序运行一段时间后 ->点击[Get Allocations] 按钮,凭借得到的Allocations信息可以通过Line Number准确找到哪里的代码出现了问题。

clip_image012

5. LogCat

LogCat 是一个日志文件,它记录 VM 中发生的活动。应用程序可以通过 Log.i(tag,message); 在这个日志文件中添加自己的日志项,其中的 tag 和 message 都是 Java 字符串。Log 类属于android.util.Log 包。

clip_image014

6. Console

Android输出的信息,加载程序等信息。

clip_image016

转:https://www.cnblogs.com/deaboway/archive/2011/03/13/1982925.html



推荐阅读
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Java测试服务器调试指南详细介绍了如何进行远程调试,并深入解析了Java Xdebug参数的使用方法。本文首先概述了Java内置的调试功能,重点介绍了JDB这一类似于GDB的强大调试工具。通过实例演示,读者可以掌握在测试环境中高效调试Java应用程序的技巧,包括配置远程调试环境和优化调试参数,以提高开发效率和代码质量。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
author-avatar
仇顺嵐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有