使用adb命令行工具的好处就是方便,不需要你安装一个庞大的Android Studio工具。你只需要把sdk下的platform-tools拿在身边即可。比如安装一个apk、获取app的log等信息,就可以用adb相关的命令。今天遇到一个奇怪的问题是,直接在cmd里面敲adb devices,一直提示“系统找不到指定文件”:奇怪了,环境变量应该配置了啊。去环境变量里面看看:...
packer-ng-plugin 是下一代Android渠道打包工具Gradle插件,支持极速打包,1000个渠道包只需要5秒钟,速度是 gradle-packer-plugin 的1000倍以上,可方便的用于CI
系统
集成,支持自定义输出目录和最终APK
文件
名,依赖包: com.mcxiaoke.gradle:packer-ng:1.0. 简短名:packer,可以在项目的 build.gradle 中
指定
使用
,还提供了命令
行
独立
使用
的Java和Python脚本。实现原理PackerNg原理优点
使用
APK注释字段保存渠道信息和MAGIC字节,从
文件
末尾读取渠道信息,速度快实现为一个Gradle Plugin,支持定制输出APK的
文件
名等信息,方便CI集成提供Java版和Python的独立命令
行
脚本,不依赖Gradle插件,支持独立
使用
由于打包速度极快,单个包只需要5毫秒左右,可用于网站后台动态生成渠道包缺点没有
使用
Android的productFlavors,无法利用flavors条件编译的功能
文件
格式Android应用
使用
的APK
文件
就是一个带签名信息的ZIP
文件
,根据 ZIP
文件
格式规范,每个ZIP
文件
的最后都必须有一个叫 Central Directory Record 的部分,这个CDR的最后部分叫"end of central directory record",这一部分包含一些元数据,它的末尾是ZIP
文件
的注释。注释包含Comment Length和File Comment两个字段,前者表示注释内容的长度,后者是注释的内容,正确修改这一部分不会对ZIP
文件
造成破坏,利用这个字段,我们可以添加一些自定义的数据,PackerNg项目就是在这里添加和读取渠道信息。细节处理原理很简单,就是将渠道信息存放在APK
文件
的注释字段中,但是实现起来遇到不少坑,测试了好多次。ZipOutputStream.setCommentFileOutputStream is = new FileOutputStream("demo.apk", true);ZipOutputStream zos = new ZipOutputStream(is);
zos.setComment("Google_Market");
zos.finish();
zos.close();ZipFile zipFile=new ZipFile("demo.apk");System.out.println(zipFile.getComment());
使用
Java写入APK
文件
注释虽然可以正常读取,但是安装的时候会失败,错误信息是:
adb
install -r demo.apk
Failure [INSTALL_FAILED_INVALID_APK]原因未知,可能Java的Zip实现写入了某些特殊字符导致APK
文件
校验失败,于是只能放弃这个方法。同样的功能
使用
Python测试完全没有
问题
,处理后的APK可以正常安装。ZipFile.getComment上面是ZIP
文件
注释写入,
使用
Java会导致APK
文件
被破坏,无法安装。这里是读取ZIP
文件
注释的
问题
,Java 7里可以
使用
zipFile.getComment() 方法直接读取注释,非常方便。但是Android
系统
直到API 19,也就是4.4以上的版本才支持 ZipFile.getComment() 方法。由于要兼容之前的版本,所以这个方法也不能
使用
。解决方法由于
使用
Java直接写入和读取ZIP
文件
的注释都不可
行
,
使用
Python又不方便与Gradle
系统
集成,所以只能自己实现注释的写入和读取。
实现起来也不复杂,就是为了提高性能,避免读取整个
文件
,需要在注释的最后加入几个MAGIC字节,这样从
文件
的最后开始,读取很少的几个字节就可以定位
渠道名的位置。几个常量定义:// ZIP
文件
的注释最长65535个字节
static final int ZIP_COMMENT_MAX_LENGTH = 65535;
// ZIP
文件
注释长度字段的字节数
static final int SHORT_LENGTH = 2;
//
文件
最后用于定位的MAGIC字节
static final byte[] MAGIC = new byte[]{0x21, 0x5a, 0x58, 0x4b, 0x21}; //!ZXK!读写注释Java版详细的实现见 PackerNg.java,Python版的实现见 ngpacker.py 。写入ZIP
文件
注释:public static void writeZipComment(File file, String comment)
throws IOException {
byte[] data = comment.getBytes(UTF_8);
final RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(file.length() - SHORT_LENGTH);
// write zip comment length
// (content field length length field length magic field length)
writeShort(data.length SHORT_LENGTH MAGIC.length, raf);
// write content
writeBytes(data, raf);
// write content length
writeShort(data.length, raf);
// write magic bytes
writeBytes(MAGIC, raf);
raf.close();
}读取ZIP
文件
注释,有两个版本的实现,这里
使用
的是 RandomAccessFile ,另一个版本
使用
的是 MappedByteBuffer ,经过测试,对于特别长的注释,
使用
内存映射
文件
读取性能要稍微好一些,对于特别短的注释(比如渠道名),这个版本反而更快一些。public static String readZipComment(File file) throws IOException {
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(file, "r");
long index = raf.length();
byte[] buffer = new byte[MAGIC.length];
index -= MAGIC.length;
// read magic bytes
raf.seek(index);
raf.readFully(buffer);
// if magic bytes matched
if (isMagicMatched(buffer)) {
index -= SHORT_LENGTH;
raf.seek(index);
// read content length field
int length = readShort(raf);
if (length > 0) {
index -= length;
raf.seek(index);
// read content bytes
byte[] bytesComment = new byte[length];
raf.readFully(bytesComment);
return new String(bytesComment, UTF_8);
} finally {
if (raf != null) {
raf.close();
return null;
}读取APK
文件
,由于这个库 packer-helper 需要同时给Gradle插件和Android项目
使用
,所以不能添加Android相关的依赖,但是又需要读取自身APK
文件
的路径,
使用
反射实现:// for android code
private static String getSourceDir(final Object context)
throws ClassNotFoundException,
InvocationTargetException,
IllegalAccessException,
NoSuchFieldException,
NoSuchMethodException {
final Class<?> contextClass = Class.forName("android.content.Context");
final Class<?> applicationInfoClass = Class.forName("android.content.pm.ApplicationInfo");
final Method getApplicationInfoMethod = contextClass.getMethod("getApplicationInfo");
final Object appInfo = getApplicationInfoMethod.invoke(context);
final Field sourceDirField = applicationInfoClass.getField("sourceDir");
return (String) sourceDirField.get(appInfo);
}Gradle Plugin这个和旧版插件基本一致,首先是读取渠道列表
文件
,保存起来,打包的时候遍历列表,复制生成的APK
文件
到临时
文件
,给临时
文件
写入渠道信息,然后复制到输出目录,
文件
名可以
使用
模板定制。主要代码如下:// 添加打包用的TASK
def archiveTask = project.task("apk${variant.name.capitalize()}",
type: ArchiveAllApkTask) {
theVariant = variant
theExtension = modifierExtension
theMarkets = markets
dependsOn variant.assemble
def buildTypeName = variant.buildType.name
if (variant.name != buildTypeName) {
project.task("apk${buildTypeName.capitalize()}", dependsOn: archiveTask)
// 遍历列表修改APK
文件
theMarkets.each { String market ->
String apkName = buildApkName(theVariant, market)
File tempFile = new File(tempDir, apkName)
File finalFile = new File(outputDir, apkName)
tempFile << originalFile.bytes
copyTo(originalFile, tempFile)
PackerNg.Helper.writeMarket(tempFile, market)
if (PackerNg.Helper.verifyMarket(tempFile, market)) {
copyTo(tempFile, finalFile)
}详细的实现可以查看
文件
PackerNgPlugin.groovy 和
文件
ArchiveAllApkTask.groovy
标签:packer
r40_tinav2.1_最终验证通过_
使用
CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z
开发板:CB-S
1、(可选修改/调试技巧:)
除了ov5640.c之外,其它的驱动都不编译,节省编译时间!
W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\device\Makefile
obj-m += ov5640.o
#obj-m += ov2640.o
#obj-m += ov7736.o
#obj-m += s5k4ec.o
#obj-m += s5k4ec_mipi.o
#obj-m += gc2035.o
#obj-m += gt2005.o
#obj-m += gc0307.o
#obj-m += gc0308.o
#obj-m += gc0328.o
#obj-m += gc0328c.o
#obj-m += gc2145.o
#obj-m += gc0329.o
#obj-m += gc0311.o
#obj-m += hi253.o
#obj-m += sp2518.o
#obj-m += sp2519.o
#obj-m += sp0718.o
#obj-m += sp0838.o
#obj-m += ov16825.o
#obj-m += ov5650.o
#obj-m += ov5647.o
#obj-m += ov5647_mipi.o
#obj-m += t8et5.o
#obj-m += s5k4e1.o
#obj-m += s5k4e1_mipi.o
#obj-m += sp2518.o
#obj-m += sp0718.o
#obj-m += gc5004.o
#obj-m += gc5004_mipi.o
#obj-m += ov5648.o
#obj-m += ar0330.o
#obj-m += ov5648.o
#obj-m += sp5408.o
#obj-m += ov12830.o
#obj-m += ov8825.o
#obj-m += ov8850.o
#obj-m += gc2155.o
#obj-m += ov8858.o
#obj-m += ov13850.o
#obj-m += imx214.o
#obj-m += ov8858_4lane.o
#obj-m += sp5409.o
#obj-m += s5k5e2yx.o
#obj-m += ov2710_mipi.o
#obj-m += ov2686.o
(这里是看ov5640的驱动的probe执
行
是否正确?设备ID是否读取成功!)
W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\device\ov5640.c
static int sensor_detect(struct v4l2_subdev *sd)
data_type rdval;
printk("****wyb %s:%d/%s()! \n", __FILE__, __LINE__, __func__);
LOG_ERR_RET(sensor_read(sd, 0x300a, &rdval;))
printk("****wyb %s:%d/%s()! 0x300a rdval=0xx\n", __FILE__, __LINE__, __func__, rdval);
if(rdval != 0x56)
return -ENODEV;
LOG_ERR_RET(sensor_read(sd, 0x300b, &rdval;))
printk("****wyb %s:%d/%s()! 0x300b rdval=0xx\n", __FILE__, __LINE__, __func__, rdval);
if(rdval != 0x40)
return -ENODEV;
return 0;
(在全志R16平台改过这个
文件
,让摄像头不要休眠,但是全志R40平台的tina v2.1
系统
下不需要修改!)
W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\vfe.c
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
分别对应 Verbose, Debug, Info, Warning,Error.
tag是一个标识,可以是任意字符串,通常可以
使用
类名+方法名, 主要是用来在查看日志时提供一个筛选条件.
程序运
行
后 并不会在 ide的控制台内输出任何信息.
如果要后查看日志 请
使用
adb
logcat
关于
adb
的更多信息请查看官方网站.
当执
行
adb
logcat 后会以tail方式实时显示出所有的日志信息.
这时候我们通常需要对信息进
行
过滤,来显示我们需要的信息, 这时候我们
指定
的 tag就派上了用场.
adb
logcat -s MyAndroid:I
这时将只显示tag为MyAndroid,级别为I或级别高于I(Warning,Error)的日志信息.
示例代码如下:
Java代码
1. package com.zijun;
3. import android.app.Activity;
4. import android.content.Context;
5. import android.graphics.Canvas;
6. import android.os.Bundle;
7. import android.util.Log;
8. import android.view.MotionEvent;
9. import android.view.View;
11. public class MyAndroid extends Activity {
13. protected static final String ACTIVITY_TAG="MyAndroid";
15. @Override
16. protected void onCreate(Bundle icicle) {
17. super.onCreate(icicle);
18. setContentView(new MyView(this));
19. }
20. public class MyView extends View {
21. public MyView(Context c) {
22. super(c);
23. }
24. @Override
25. protected void onDraw(Canvas canvas) {
27. }
28. @Override
29. public boolean onMotionEvent(MotionEvent event) {
30. Log.i(MyAndroid.ACTIVITY_TAG, "=============================");
32. Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. ");
33. Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. ");
34. Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. ");
36. return true;
37. }
ADB
,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。
注:有部分命令的支持情况可能与 Android
系统
版本及定制 ROM 的实现有关。
adb
命令的基本语法如下:
adb
[-d|-e|-s ]
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s ] 这一部分,直接
使用
adb
。
为命令
指定
目标设备
如果有多个设备/模拟器连接,则需要为命令
指定
目标设备。
参数 含义
-d
指定
当前唯一通过 USB 连接的 Android 设备为命令目标
-e
指定
当前唯一运
行
的模拟器为命令目标
-s
指定
相应 serialNumber 号的设备/模拟器为命令目标
在多个设备/模拟器连接的情况下较常用的是 -s 参数,serialNumber 可以通过
adb
devices 命令获取。如:
$
adb
devices
List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
输出里的 cf264b8f、emulator-5554 和 10.129.164.6:5555 即为 serialNumber。
比如这时想
指定
cf264b8f 这个设备来运
行
adb
命令获取屏幕分辨率:
adb
-s cf264b8f shell wm size
又如想给 10.129.164.6:5555 这个设备安装应用(这种形式的 serialNumber 格式为 :,一般为无线连接的设备或 Genymotion 等第三方 Android 模拟器):
adb
-s 10.129.164.6:5555 install test.apk
遇到多设备/模拟器的情况均
使用
这几个参数为命令
指定
目标设备,下文中为简化描述,不再重复。
启动/停止
启动
adb
server 命令:
adb
start-server
(一般无需手动执
行
此命令,在运
行
adb
命令时若发现
adb
server 没有启动会自动调起。)
停止
adb
server 命令:
adb
kill-server
查看
adb
版本
adb
version
示例输出:
Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android
以 root 权限运
行
adb
d
adb
的运
行
原理是 PC 端的
adb
server 与手机端的守护进程
adb
d 建立连接,然后 PC 端的
adb
client 通过
adb
server 转发命令,
adb
d 接收命令后解析运
行
。
所以如果
adb
d 以普通权限执
行
,有些需要 root 权限才能执
行
的命令无法直接用
adb
xxx 执
行
。这时可以
adb
shell 然后 su 后执
行
命令,也可以让
adb
d 以 root 权限执
行
,这个就能随意执
行
高权限命令了。
adb
root
正常输出:
restarting
adb
d as root
现在再运
行
adb
shell,看看命令
行
提示符是不是变成 # 了?
有些手机 root 后也无法通过
adb
root 命令让
adb
d 以 root 权限执
行
,比如三星的部分机型,会提示
adb
d cannot run as root in production builds,此时可以先安装
adb
d Insecure,然后
adb
root 试试。
相应地,如果要恢复
adb
d 为非 root 权限的话,可以
使用
adb
unroot 命令。
指定
adb
server 的网络端口
adb
-P start-server
默认端口为 5037。
设备连接管理
查询已连接设备/模拟器
adb
devices
输出示例:
List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
输出格式为 [serialNumber] [state],serialNumber 即我们常说的 SN,state 有如下几种:
offline —— 表示设备未连接成功或无响应。
device —— 设备已连接。注意这个状态并不能标识 Android
系统
已经完全启动和可操作,在设备启动过程中设备实例就可连接到
adb
,但启动完毕后
系统
才处于可操作状态。
no device —— 没有设备/模拟器连接。
以上输出显示当前已经连接了三台设备/模拟器,cf264b8f、emulator-5554 和 10.129.164.6:5555 分别是它们的 SN。从 emulator-5554 这个名字可以看出它是一个 Android 模拟器,而 10.129.164.6:5555 这种形为 : 的 serialNumber 一般是无线连接的设备或 Genymotion 等第三方 Android 模拟器。
常见异常输出:
没有设备/模拟器连接成功。
List of devices attached
设备/模拟器未连接到
adb
或无响应。
List of devices attached
cf264b8f offline
USB 连接
通过 USB 连接来正常
使用
adb
需要保证几点:
硬件状态正常。
包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。
Android 设备的开发者选项和 USB 调试模式已开启。
可以到「设置」-「开发者选项」-「Android 调试」查看。
如果在设置里
找
不到
开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「版本号」7 次。
设备驱动状态正常。
这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动状态已经好了。否则可以下载一个手机助手类程序来安装驱动先。
通过 USB 线连接好电脑和设备后确认状态。
adb
devices
如果能看到
xxxxxx device
说明连接成功。
无线连接(需要借助 USB 线)
除了可以通过 USB 连接设备与电脑来
使用
adb
,也可以通过无线连接——虽然连接过程中也有需要
使用
USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
将 Android 设备与要运
行
adb
的电脑连接到同一个局域网,比如连到同一个 WiFi。
将设备与电脑通过 USB 线连接。
应确保连接成功(可运
行
adb
devices 看是否能列出该设备)。
让设备在 5555 端口监听 TCP/IP 连接:
adb
tcpip 5555
断开 USB 连接。
找
到设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」
找
到,也可以
使用
下文里 查看设备信息 - IP 地址 一节里的方法用
adb
命令来查看。
通过 IP 地址连接设备。
adb
connect
这里的 就是上一步中
找
到的设备 IP 地址。
确认连接状态。
adb
devices
如果能看到
:5555 device
说明连接成功。
如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执
行
adb
connect 那一步;
如果还是不
行
的话,通过
adb
kill-server 重新启动
adb
然后从头再来一次试试。
断开无线连接
adb
disconnect
无线连接(无需借助 USB 线)
注:需要 root 权限。
上一节「无线连接(需要借助 USB 线)」是官方文档里介绍的方法,需要借助于 USB 数据线来实现无线连接。
既然我们想要实现无线连接,那能不能所有步骤下来都是无线的呢?答案是能的。
在 Android 设备上安装一个终端模拟器。
已经安装过的设备可以跳过此步。我
使用
的终端模拟器下载地址是:Terminal Emulator for Android Downloads
将 Android 设备与要运
行
adb
的电脑连接到同一个局域网,比如连到同一个 WiFi。
打开 Android 设备上的终端模拟器,在里面依次运
行
命令:
setprop service.
adb
.tcp.port 5555
找
到 Android 设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」
找
到,也可以
使用
下文里 查看设备信息 - IP 地址 一节里的方法用
adb
命令来查看。
在电脑上通过
adb
和 IP 地址连接 Android 设备。
adb
connect
这里的 就是上一步中
找
到的设备 IP 地址。
如果能看到 connected to :5555 这样的输出则表示连接成功。
有的设备,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第 5 步之前需要重启
adb
d 服务,在设备的终端模拟器上运
行
:
restart
adb
d
如果 restart 无效,尝试以下命令:
start
adb
d
stop
adb
d
查看应用列表
查看应用列表的基本命令格式是
adb
shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在
adb
shell pm list packages 的基础上可以加一些参数进
行
过滤查看不同的列表,支持的过滤参数如下:
参数 显示列表
无 所有应用
-f 显示应用关联的 apk
文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示
系统
应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
包名包含 字符串
adb
shell pm list packages
输出示例:
package:com.android.smoketest
package:com.example.android.livecubes
package:com.android.providers.telephony
package:com.google.android.googlequicksearchbox
package:com.android.providers.calendar
package:com.android.providers.media
package:com.android.protips
package:com.android.documentsui
package:com.android.gallery
package:com.android.externalstorage
// other packages here
系统
应用
adb
shell pm list packages -s
第三方应用
adb
shell pm list packages -3
包名包含某字符串的应用
比如要查看包名包含字符串 mazhuang 的应用列表,命令:
adb
shell pm list packages mazhuang
当然也可以
使用
grep 来过滤:
adb
shell pm list packages | grep mazhuang
安装 APK
命令格式:
adb
install [-lrtsdg]
adb
install 后面可以跟一些可选参数来控制安装 APK 的
行
为,可用参数及含义如下:
参数 含义
-l 将应用安装到保护目录 /mnt/asec
-r 允许覆盖安装
-t 允许安装 AndroidManifest.xml 里 application
指定
android:testOnly="true" 的应用
-s 将应用安装到 sdcard
-d 允许降级覆盖安装
-g 授予所有运
行
时权限
运
行
命令后如果见到类似如下输出(状态为 Success)代表安装成功:
[100%] /data/local/tmp/1.apk
pkg: /data/local/tmp/1.apk
Success
上面是当前最新版 v1.0.36 的
adb
的输出,会显示 push apk
文件
到手机的进度百分比。
使用
旧版本
adb
的输出则是这样的:
12040 KB/s (22205609 bytes in 1.801s)
pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk
Success
而如果状态为 Failure 则表示安装失败,比如:
[100%] /data/local/tmp/map-20160831.apk
pkg: /data/local/tmp/map-20160831.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
常见安装失败输出代码、含义及可能的解决办法如下:
输出 含义 解决办法
INSTALL_FAILED_ALREADY_EXISTS 应用已经存在,或卸载了但没卸载干净
adb
install 时
使用
-r 参数,或者先
adb
uninstall 再安装
INSTALL_FAILED_INVALID_APK 无效的 APK
文件
INSTALL_FAILED_INVALID_URI 无效的 APK
文件
名 确保 APK
文件
名里无中文
INSTALL_FAILED_INSUFFICIENT_STORAGE 空间不足 清理空间
INSTALL_FAILED_DUPLICATE_PACKAGE 已经存在同名程序
INSTALL_FAILED_NO_SHARED_USER 请求的共享用户不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE 以前安装过同名应用,但卸载时数据没有移除 先
adb
uninstall 再安装
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 请求的共享用户存在但签名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安装包
使用
了设备上不可用的共享库
INSTALL_FAILED_REPLACE_COULDNT_DELETE 替换时无法删除
INSTALL_FAILED_DEXOPT dex 优化验证失败或空间不足
INSTALL_FAILED_OLDER_SDK 设备
系统
版本低于应用要求
INSTALL_FAILED_CONFLICTING_PROVIDER 设备里已经存在与应用里同名的 content provider
INSTALL_FAILED_NEWER_SDK 设备
系统
版本高于应用要求
INSTALL_FAILED_TEST_ONLY 应用是 test-only 的,但安装时没有
指定
-t 参数
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容设备 CPU 应用程序二进制接口的 native code
INSTALL_FAILED_MISSING_FEATURE 应用
使用
了设备不可用的功能
INSTALL_FAILED_CONTAINER_ERROR 1. sdcard 访问失败; 2. 应用签名与 ROM 签名一致,被当作内置应用 1. 确认 sdcard 可用,或者安装到内置存储; 2. 打包时不与 ROM
使用
相同签名
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安装到
指定
位置; 2. 应用签名与 ROM 签名一致,被当作内置应用 1. 切换安装位置,添加或删除 -s 参数; 2. 打包时不与 ROM
使用
相同签名
INSTALL_FAILED_MEDIA_UNAVAILABLE 安装位置不可用 一般为 sdcard,确认 sdcard 可用或安装到内置存储
INSTALL_FAILED_VERIFICATION_TIMEOUT 验证安装包超时
INSTALL_FAILED_VERIFICATION_FAILURE 验证安装包失败
INSTALL_FAILED_PACKAGE_CHANGED 应用与调用程序期望的不一致
INSTALL_FAILED_UID_CHANGED 以前安装过该应用,与本次分配的 UID 不一致 清除以前安装过的残留
文件
INSTALL_FAILED_VERSION_DOWNGRADE 已经安装了该应用更高版本
使用
-d 参数
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE 已安装 target SDK 支持运
行
时权限的同名应用,要安装的版本不支持运
行
时权限
INSTALL_PARSE_FAILED_NOT_APK
指定
路径不是
文件
,或不是以 .apk 结尾
INSTALL_PARSE_FAILED_BAD_MANIFEST 无法解析的 AndroidManifest.xml
文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 解析器遇到异常
INSTALL_PARSE_FAILED_NO_CERTIFICATES 安装包没有签名
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 已安装该应用,且签名与 APK
文件
不一致 先卸载设备上的该应用,再安装
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING 解析 APK
文件
时遇到 CertificateEncodingException
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME manifest
文件
里没有或者
使用
了无效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID manifest
文件
里
指定
了无效的共享用户 ID
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解析 manifest
文件
时遇到结构性错误
INSTALL_PARSE_FAILED_MANIFEST_EMPTY 在 manifest
文件
里
找
不到
找
可操作标签(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR 因
系统
问题
安装失败
INSTALL_FAILED_USER_RESTRICTED 用户被限制安装应用
INSTALL_FAILED_DUPLICATE_PERMISSION 应用尝试定义一个已经存在的权限名称
INSTALL_FAILED_NO_MATCHING_ABIS 应用包含设备的应用程序二进制接口不支持的 native code
INSTALL_CANCELED_BY_USER 应用安装需要在设备上确认,但未操作设备或点了取消 在设备上同意安装
INSTALL_FAILED_ACWF_INCOMPATIBLE 应用程序与设备不兼容
does not contain AndroidManifest.xml 无效的 APK
文件
is not a valid zip file 无效的 APK
文件
Offline 设备未连接成功 先将设备与
adb
连接成功
unauthorized 设备未授权允许调试
error: device not found 没有连接成功的设备 先将设备与
adb
连接成功
protocol failure 设备已断开连接 先将设备与
adb
连接成功
Unknown option: -s Android 2.2 以下不支持安装到 sdcard 不
使用
-s 参数
No space left on devicerm 空间不足 清理空间
Permission denied … sdcard … sdcard 不可用
参考:PackageManager.java
adb
install 内部原理简介
adb
install 实际是分三步完成:
push apk
文件
到 /data/local/tmp。
调用 pm install 安装。
删除 /data/local/tmp 下的对应 apk
文件
。
所以,必要的时候也可以根据这个步骤,手动分步执
行
安装过程。
adb
uninstall [-k]
表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录。
命令示例:
adb
uninstall com.qihoo360.mobilesafe
表示卸载 360 手机卫士。
清除应用数据与缓存
adb
shell pm clear
表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
命令示例:
adb
shell pm clear com.qihoo360.mobilesafe
表示清除 360 手机卫士的数据和缓存。
查看前台 Activity
adb
shell dumpsys activity activities | grep mFocusedActivity
输出示例:
mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher 就是当前处于前台的 Activity。
查看正在运
行
的 Services
adb
shell dumpsys activity services []
参数不是必须的,
指定
表示查看与某个包名相关的 Services,不
指定
表示查看所有 Services。
不一定要给出完整的包名,比如运
行
adb
shell dumpsys activity services org.mazhuang,那么包名 org.mazhuang.demo1、org.mazhuang.demo2 和 org.mazhuang123 等相关的 Services 都会列出来。
与应用交互
主要是
使用
am 命令,常用的 如下:
command 用途
start [options] 启动
指定
的 Activity
startservice [options] 启动
指定
的 Service
broadcast [options] 发送
指定
的广播
force-stop 停止 相关的进程
参数很灵活,和写 Android 程序时代码里的 Intent 相对应。
用于决定 intent 对象的选项如下:
参数 含义
-a
指定
action,比如 android.intent.action.VIEW
-c
指定
category,比如 android.intent.category.APP_CONTACTS
-n
指定
完整 component 名,用于明确
指定
启动哪个 Activity,如 com.example.app/.ExampleActivity
里还能带数据,就像写代码时的 Bundle 一样:
参数 含义
--esn null 值(只有 key 名)
-e|--es string 值
--ez boolean 值
--ei integer 值
--el long 值
--ef float 值
--eu URI
--ecn component name
--eia [,<EXTRA_INT_VALUE...] integer 数组
--ela [,<EXTRA_LONG_VALUE...] long 数组
调起 Activity
命令格式:
adb
shell am start [options]
adb
shell am start -n com.tencent.mm/.ui.LauncherUI
表示调起微信主界面。
adb
shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world。
调起 Service
命令格式:
adb
shell am startservice [options]
adb
shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示调起微信的某 Service。
命令格式:
adb
shell am broadcast [options]
可以向所有组件广播,也可以只向
指定
组件广播。
例如,向所有组件广播 BOOT_COMPLETED:
adb
shell am broadcast -a android.intent.action.BOOT_COMPLETED
又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED:
adb
shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。
既能发送
系统
预定义的广播,也能发送自定义广播。如下是部分
系统
预定义广播及正常触发时机:
action 触发时机
android.net.conn.CONNECTIVITY_CHANGE 网络连接发生变化
android.intent.action.SCREEN_ON 屏幕点亮
android.intent.action.SCREEN_OFF 屏幕熄灭
android.intent.action.BATTERY_LOW 电量低,会弹出电量低提示框
android.intent.action.BATTERY_OKAY 电量恢复了
android.intent.action.BOOT_COMPLETED 设备启动完毕
android.intent.action.DEVICE_STORAGE_LOW 存储空间过低
android.intent.action.DEVICE_STORAGE_OK 存储空间恢复
android.intent.action.PACKAGE_ADDED 安装了新的应用
android.net.wifi.STATE_CHANGE WiFi 连接状态发生变化
android.net.wifi.WIFI_STATE_CHANGED WiFi 状态变为启用/关闭/正在启动/正在关闭/未知
android.intent.action.BATTERY_CHANGED 电池电量发生变化
android.intent.action.INPUT_METHOD_CHANGED
系统
输入法发生变化
android.intent.action.ACTION_POWER_CONNECTED 外部电源连接
android.intent.action.ACTION_POWER_DISCONNECTED 外部电源断开连接
android.intent.action.DREAMING_STARTED
系统
开始休眠
android.intent.action.DREAMING_STOPPED
系统
停止休眠
android.intent.action.WALLPAPER_CHANGED 壁纸发生变化
android.intent.action.HEADSET_PLUG 插入耳机
android.intent.action.MEDIA_UNMOUNTED 卸载外部介质
android.intent.action.MEDIA_MOUNTED 挂载外部介质
android.os.action.POWER_SAVE_MODE_CHANGED 省电模式开启
(以上广播均可
使用
adb
触发)
强制停止应用
adb
shell am force-stop
命令示例:
adb
shell am force-stop com.qihoo360.mobilesafe
表示停止 360 安全卫士的一切进程与服务。
文件
管理
复制设备里的
文件
到电脑
adb
pull [电脑上的目录]
其中 电脑上的目录 参数可以省略,默认复制到当前目录。
adb
pull /sdcard/sr.mp4 ~/tmp/
小技巧:设备上的
文件
路径可能需要 root 权限才能访问,如果你的设备已经 root 过,可以先
使用
adb
shell 和 su 命令在
adb
shell 里获取 root 权限后,先 cp /path/on/device /sdcard/filename 将
文件
复制到 sdcard,然后
adb
pull /sdcard/filename /path/on/pc。
复制电脑里的
文件
到设备
adb
push
adb
push ~/sr.mp4 /sdcard/
小技巧:设备上的
文件
路径普通权限可能无法直接写入,如果你的设备已经 root 过,可以先
adb
push /path/on/pc /sdcard/filename,然后
adb
shell 和 su 在
adb
shell 里获取 root 权限后,cp /sdcard/filename /path/on/device。
模拟按键/输入
在
adb
shell 里有个很实用的命令叫 input,通过它可以做一些有趣的事情。
input 命令的完整 help 信息如下:
Usage: input [] [...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
gesture
touchscreen
gamepad
The commands and default sources are:
text (Default: touchscreen)
keyevent [--longpress] ... (Default: keyboard)
tap (Default: touchscreen)
swipe [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll (Default: trackball)
比如
使用
adb
shell input keyevent 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:
keycode 含义
3 HOME 键
4 返回键
5 打开拨号应用
6 挂断电话
24 增加音量
25 降低音量
26 电源键
27 拍照(需要在相机应用里)
64 打开浏览器
82 菜单键
85 播放/暂停
86 停止播放
87 播放下一首
88 播放上一首
122 移动光标到
行
首或列表顶部
123 移动光标到
行
末或列表底部
126 恢复播放
127 暂停播放
164 静音
176 打开
系统
设置
187 切换应用
207 打开联系人
208 打开日历
209 打开音乐
210 打开计算器
220 降低屏幕亮度
221 提高屏幕亮度
223
系统
休眠
224 点亮屏幕
231 打开语音助手
276 如果没有 wakelock 则让
系统
休眠
下面是 input 命令的一些用法举例。
adb
shell input keyevent 26
执
行
效果相当于按电源键。
需要验证一个
问题
,手机处于深度睡眠时期,是否会向
系统
发送广播日志。
这个时候,我们需要将手机重启一下,并通过*#800#开启log。但是日志是读取到sdcard里面的,如何通过
adb命令
将sdcard里面的日志内容给导出来呢?
1、通过cmd进入,敲
adb
shell命令,然后进入sdcard的日志路径,最后通过ls命令,查看你需要的是哪个日期的日志。
>>
adb
.exe start-server
* daemon not running; starting now at tcp:5037
adb
: CreateFileW 'nul' failed:
系统
找
不到
指定
的
文件
。 (2)
* failed to start daemon
error: cannot connect to daemon
报错信息截图:
手动启动
adb
:
>>
adb
nodaemon server
adb
I 06-
----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance Alliance Alliance Alliance
什么是开放手机联盟?
开放手机联盟, Open Handset Alliance :是美国 Google 公司与 2007 年 11 月 5 日宣布组建的一个全球性的联
盟组织。这一联盟将会支持 Google 发布的 Android 手机操作
系统
或者应用软件,共同开发名为 Android 的 开
放源代码的移动
系统
。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数
量已经达到了 43 家。
移动手机联盟创始成员:
Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、宏达电、英特尔、 KDDI 、
Living Image 、 LG 、 Marvell 、摩托罗拉、 NMS 、 NTT DoCoMo 、 Nuance 、 Nvidia 、 PacketVideo 、高通、三星 、
SiRF 、 SkyPop 、 Sonic Network 、 Sprint Nextel 、 Synaptics 、 TAT 、意大利电信、西班牙电信、德州仪器、 T-M obile
和 Wind River 。
Mobile Mobile Mobile Mobile Operators Operators Operators Operators 移动运营商类
China Mobile Communications Corporation 中国移动通信
KDDI CORPORATION 日本 KDDI 电信
NTT DoCoMo, Inc. 日本多科莫电信
SOFTBANK MOBILE Corp. 日本软银移动
Sprint Nextel( 美国 )
T-Mobile( 德国 )
Telecom Italia( 意大利 )
Telef ó nica( 西班牙 )
Vodafone 沃达丰电信
China Unicom 中国联通
Semiconductor Semiconductor Semiconductor Semiconductor Companies Companies Companies Companies 半导体制造公司
AKM Semiconductor Inc
Audience
Atheros Communications
Broadcom Corporation( 博通 )
Ericsson ( 爱立信公司 )
Intel Corporation ( 英特尔公司 )
Marvell Semiconductor, Inc. ( 收购了 intel 手机芯片部门的公司 )----------------------------------- Android 编程基础
NVIDIA Corporation ( 英伟达公司 )
Qualcomm Inc.( 高通公司 )
SiRF Technology Holdings, Inc.( 知名 GPS 芯片制造商 )
Synaptics, Inc.
Texas Instruments Incorporated ( 德州仪器 )
Handset Handset Handset Handset Manufacturers Manufacturers Manufacturers Manufacturers 电话制造商
ASUSTeK Computer Inc. 华硕
Garmin International, Inc.
HTC Corporation ( 多普达的母公司 ) 宏达电子
Huawei Technologies 华为科技
LG Electronics, Inc. 乐金电子
Motorola, Inc. 摩托罗拉
Samsung Electronics 三星电子
Sony Ericsson 索尼爱立信
Toshiba Corporation 东芝公司
lenovo 联想移动
联盟成员: Software Software Software Software Companies Companies Companies Companies 软件提供公司
Ascender Corp.
eBay Inc.
Esmertec
Google Inc.
LivingImage LTD.
Nuance Communications, Inc.
OMRON SOFTWARE Co, Ltd. 日本欧姆龙软件
PacketVideo (PV)
SkyPop
SONiVOX
ASUSTeK Computer Inc. 华硕
AKM Semiconductor AKM 半导体公司
ARM 公司
Atheros Communications
Toshiba Corporation 东芝公司
lenovo 联想移动
软银移动 日本无线运营商软银
瑞典计算机咨询公司 Teleca AB
Garmin International, Inc. 高明
HTC Corporation ( 多普达的母公司 ) 宏达电子
Huawei Technologies 华为科技
LG Electronics, Inc. 乐金电子
Motorola, Inc. 摩托罗拉
Samsung Electronics 三星电子
Sony Ericsson 索尼爱立信
Teleca
Borqs 播思通讯
将会支持 Google 可能发布的手机操作
系统
或者应用软件,共同开发名为 Android 的开放源代码的移动 系
谷歌早在 2002 年就进入了移动领域,可是由于目前的手机操作
系统
企业和手机企业相对封闭,提高了
行
业的进入门槛,移动互联网的发展远没有拥有统一标准的传统互联网发展迅速,此次推出的开源手机操 作
系统
平台就是出于这个目的。
也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移
动互联网。----------------------------------- Android 编程基础
Android Android Android Android 手机新概念
操作
系统
的选择 -------- 定制和长尾
� MVC 和 Web APP 架构
Android Android Android Android 开发背景
� 计算技术、无线接入技术的发展,使嵌入式
系统
逐渐有能力对桌面
系统
常规业务进
行
支持。
� 谷歌长期以来奉
行
的移动发展战略:通过与全球各地的手机制造商和移动运营商结成合作伙伴,开发 既
有用又有吸引力的移动服务,并推广这些产品。 Android 进一步推进了 " 随时随地为每个人提供信息 " 这一企 业
目标的实现。
� Open Handset Alliance 汇集了多家业界巨头。运营商如: China Mobile 、 NTT DoCoMo 、 Vodafone 、 T-M obile
等;设备制造商如 ASUS 、 HTC 、 Huawei 、 LG 、 Motorola 、 Samsung 、 Sony Ericsson 、 Toshiba 等;芯片厂商
如 ARM 、 Broadcom 、 Intel 、 Marvell 、 NVIDIA 、 Qualcomm 等。软件厂商如 Ascender 、 eBay 、 Esmertec 、 Li vingImage
� Android 更像一款桌面环境为 Java 的 Linux 操作
系统
。有助于 Google 实现其 " 随时随地为每个人提供信
息 " 的企业战略。
HTC HTC HTC HTC Dream/G1 Dream/G1 Dream/G1 Dream/G1 具体配置
3.17 英寸 HVGA (480 x 320) ; 1150mAh 电池 ;高通 528Mhz 7201 处理器 ; 64MB RAM 、 128MB ROM ; 1GB
MicroSD 卡 ; QWERTY 全键盘; 310 万像素摄像头。
支持视频格式: H.264 、流媒体、 3GPP 、 MPEG4 和 Codec 3GP ;支持音频格式: MP3 、 AAC 、 AAC+ 、 W MA 、
MPEG4 、 WAV 、 MIDI 、 REAL 、 AUDIO 和 OGG ;支持墙纸格式: JPG 、 BMP 、 PNG 和 GIF ;铃声 (MP3 、
AAC 、 AAC+ 和 WMA) 。
蓝牙 (class 1) ;四频 (850 , 900 , 1800 , 1900) ;支持 3G , 802.11b 和 802.11g 。----------------------------------- Android 编程基础
支持 HTTP 、 WAP Push 和 xHTML ;支持 POP 、 IMAP 、 SMTP ,以及 AOL 和 GMAIL 电子邮件服务;支持 AIM 、
MSN 、雅虎通和 GTALK ;与谷歌日历同步;与 Android Market 联机;支持谷歌 “ 街景 ” 服务;包装盒内附
数据工具包。
https://sites.google.com/a/android.com/opensource/release-features
Android Android Android Android 盈利模式
Android 的 App Market 模式,软件开发者获得 7 成收入, 3 成用于
系统
维护。难点在于位置营销。
设备商通过卖设备、内置特色应用来获得盈利。也可以兼职专业软件开发者进
行
赢利。
Google 自身通过基于统一平台为用户提供信息来盈利。
Android Android Android Android 的优势
� 源代码完全开放,便于开发人员更清楚的把握实现细节,便于提高开发人员的技术水平,有利于开发 出
更具差异性的应用。
� 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运
行
速度比想象的要快很多。
� 运营商(中国移动等)的大力支持,产业链条的热捧。
� 良好的盈利模式( 3/7 开),产业链条的各方:运营商、制造商、独立软件生产商都可以获得不错的利 益 。
将移动终端的评价标准从硬件向软件转变,极大的激发了软件开发者的热情。
� Android 的源代码遵循 Apache V2 软件许可,而不是通常的 GPL v2 许可。有利于商业开发。
� 具有强大的 Linux 社区的支持。
Android Android Android Android 的不足
� 由于采用了 Java 作为应用开发语言,目前可用的传统第三方应用还很少,但由于 Android 是一款完全 开
源的移动计算平台,相信第三方应用会很快的丰富起来。
� Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造
成J ava 阵营的进一步分裂。
� 现有应用完善度不太够,需要的开发工作量较大。----------------------------------- Android 编程基础
� 基于 QEMU 开发的模拟器调试手段不十分丰富,只支持通话、SMS等,速度慢。
� 暂不具备 Push Mail 和 Office(DataViz 、 QuickOffice 计划近期推出 ) 功能,目前主要面向的是普通消费 者
用户,对商业用户支持尚弱。
Android Android Android Android 带来的影响
ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。
对消费者的影响
� 高档手机选择面增加。
� A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从计算机为主改成从手机
使用
为导向。新
生应用如:G oogle 地图及其衍生应用、 GMail 、 GTalk 等。
� GPS 卫星导航功能,手机照相, MP3 ,蓝芽等均被列为 Android 所提供支持的基本选项。
� Android 的平台基本上是免费的,虽然有部份原生链接库会要求费用,但大部份是免权利金; Android 的
程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自
己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。
对手机制造者的影响
� Android 是款开源的移动计算软件平台,组建了 google 主导的拥有众多产业界巨头的产业联盟,有利于
高效开发、降低成本。
� 由于是源代码开放的产品,对非主导厂商而言,可以避开与主导厂商在核心技术上面的差距,开发出 更
具竞争力和差异化的产品。
对运营商的影响
� 丰富的数据业务,将导致数据流量的显著增加 。
� 手机来源增加,价格更为低廉。
对软件开发者的影响
� 因为 Android 移动软件平台抱持开放互通的观念,势必吸引不少自由软件的拥护者。
� 开发方向有三个重点 :----------------------------------- Android 编程基础
� 应用软件的开发
� 特殊功能的原生链接库
� 专属应用程序框架
� 由于 Android 的A pp Market 性质,可能催生出专门的应用软件开发商。
Android Android Android Android 应用现状
� 设备商: lenovo 、琦基、戴尔、三星、摩托罗拉、华为、英特尔、 Kogan 、索爱、华硕、多普达、爱可 视 、
Archos 等。
� 制造商: HTC 、 Telstra 等。
� 手机设计公司:播思、德信无线等。
� 运营商:中国移动、 Sprint 、 T-Mobile 、 Teleca AB 等。
� 芯片商: Qualcomm 、 Marvell 、 TI 、 Boardcom 等。----------------------------------- Android 编程基础
Android Android Android Android 开发入门
System System System System Requirements Requirements Requirements Requirements
The sections below describe the system and software requirements for developing Android applications using the
Android SDK tools included in Android 1.1 SDK, Release 1.
Supported Supported Supported Supported Operating Operating Operating Operating Systems Systems Systems Systems
• Windows XP (32-bit) or Vista (32- or 64-bit)
• Mac OS X 10.4.8 or later (x86 only)
• Linux (tested on Linux Ubuntu Dapper Drake)
Supported Supported Supported Supported Development Development Development Development Environments Environments Environments Environments
Eclipse IDE
o Eclipse 3.3 (Europa), 3.4 (Ganymede)
� Eclipse JDT plugin (included in most Eclipse IDE packages)
� WST (optional, but needed for the Android Editors feature; included in most Eclipse IDE
packages )
o JDK 5 or JDK 6 (JRE alone is not sufficient)
o Android Development Tools plugin (optional)
o Not Not Not Not compatible with Gnu Compiler for Java (gcj)
Other development environments or IDEs
o JDK 5 or JDK 6 (JRE alone is not sufficient)
o Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows
o Not Not Not Not compatible with Gnu Compiler for Java (gcj)
Note: Note: Note: Note: If JDK is already installed on your development computer, please take a moment to make sure that it meets the
version requirements listed above. In particular, note that some Linux distributions may include JDK 1.4 or Gnu
Compiler for Java, both of which are not supported for Android development----------------------------------- Android 编程基础
什么是 Android? Android? Android? Android?
Android 是一个专门针对移动设备的软件集,它包括一个操作
系统
,中间件和一些重要的应用程序。 Beta 版
的 Android SDK 提供了在 Android 平台上
使用
JaVa 语言进
行
Android 应用开发必须的工具和 API 接口。
• 应用程序框架 支持组件的重用与替换
• Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化
• 集成的浏览器 基于开源的 WebKit 引擎
• 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 (硬件加速可选)
• SQLite SQLite SQLite SQLite 用作结构化的数据存储
• 多媒体支持 包括常见的音频、视频和静态图像格式 ( 如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG ,
GIF )
• GSM GSM GSM GSM 电话技术 (依赖于硬件)
• 蓝牙 Bluetooth, Bluetooth, Bluetooth, Bluetooth, EDGE, EDGE, EDGE, EDGE, 3G, 3G, 3G, 3G, 和 WiFi WiFi WiFi WiFi (依赖于硬件)
• 照相机, GPS GPS GPS GPS ,指南针,和加速度计( accelerometer accelerometer accelerometer accelerometer ) (依赖于硬件)
• 丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和 Eclipse 集成开发环境插件
Android 会同一系列核心应用程序包一起发布,该应用程序包包括 email 客户端, SMS 短消息程序,日历,
地图,浏览器,联系人管理程序等。所有的应用程序都是
使用
JAVA 语言编写的。
应用程序框架
开发人员也可以完全访问核心应用程序所
使用
的 API 框架。该应用程序的架构设计简化了组件的重用;任 何
一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以
使用
其所发布的功能块(不过得遵循 框
架的安全性限制)。同样,该应用程序重用机制也
使用
户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和
系统
, 其中包括;
• 丰富而又可扩展的视图( Views ),可以用来构建应用程序, 它包括列表( lists ),网格( grids ),文
本框( text boxes ),按钮( buttons ), 甚至可嵌入的 web 浏览器。
• 内容提供器( Content Providers )使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或
者共享它们自己的数据
• 资源管理器( Resource Manager )提供 非代码资源的访问,如本地字符串,图形,和布局
文件
( la yout
files )。
• 通知管理器 ( Notification Manager ) 使得应用程序可以在状态栏中显示自定义的提示信息。
• 活动管理器( Activity Manager ) 用来管理应用程序生命周期并提供常用的导航回退功能。----------------------------------- Android 编程基础
Android 包含一些 C/C++ 库,这些库能被 Android
系统
中不同的组件
使用
。它们通过 Android 应用程序框架
为开发者提供服务。以下是一些核心库:
•
系统
C C C C 库 - 一个从 BSD 继承来的标准 C
系统
函数库( libc ), 它是专门为基于 embedded linu x
的设备定制的。
• 媒体库 - 基于 PacketVideo OpenCORE ;该库支持多种常用的音频、视频格式回放和录制,同时支 持
静态图像
文件
。编码格式包括 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
• Surface Surface Surface Surface Manager Manager Manager Manager - 对显示子
系统
的管理,并且为多个应用程序提 供了 2D 和 3D 图层的无缝融合。
• LibWebCore LibWebCore LibWebCore LibWebCore - 一个最新的 web 浏览器引擎用,支持 Android 浏览器和一个可嵌入的 web 视图。
• SGL SGL SGL SGL - 底层的 2D 图形引擎
• 3D 3D 3D 3D libraries libraries libraries libraries - 基于 OpenGL ES 1.0 APIs 实现;该库可以
使用
硬件 3D 加速(如果可用)或者
使用
高
度优化的 3D 软加速。
• FreeType FreeType FreeType FreeType - 位图( bitmap )和矢量( vector )字体显示。
• SQLite SQLite SQLite SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
Android Android Android Android 运
行
库
Android 包括了一个核心库,该核心库提供了 JAVA 编程语言核心库的大多数功能。
每一个 Android 应用程序都在它自己的进程中运
行
,都拥有一个独立的 Dalvik 虚拟 机实例。 Dalvik 被设计
成一个设备可以同时高效地运
行
多个虚拟
系统
。 Dalvik 虚拟机执
行
( .dex )的 Dalvik 可执
行
文件
,该格式 文
件针对小内存
使用
做了 优化。同时虚拟机是基于寄存器的,所有的类都经由 JAVA 编译器编译,然后通过 SDK
中 的 "dx" 工具转化成 .dex 格式由虚拟机执
行
。
Dalvik 虚拟机依赖于 linux 内核的一些功能,比如线程机制和底层内存管理机制。
Linux Linux Linux Linux 内核
Android 的核心
系统
服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模 型 。
Linux 内核也同时作为硬件和软件栈之间的抽象层。----------------------------------- Android 编程基础
Android Android Android Android 的
系统
架构
系统
构架
Android Android Android Android 内核
� Linux 内核版本 2.6
� 位于硬件和软件堆之间的抽象层
� 核心服务:安全机制、内存管理、进程管理、网络、硬件驱动。
Android 依赖 Linux 内核 2.6 提供核心服务,比如安全、内存管理、进程管理、网络、硬件驱动。在这里, L inux
内核扮演的是硬件层和
系统
其它层次之间的一个抽象层的概念。这个操作
系统
并非类 GNU/Linux 的,因为 其
系统
库,
系统
初始化和编程接口都和标准的 Linux
系统
是有所不同的。----------------------------------- Android 编程基础
从 Google 目前 release 的 Linux
系统
来看,其没有虚拟内存
文件
系统
,
系统
所用的是 yaffs2
文件
系统
,具体
的映像也都位于 SDK 安装目录下。通过 emulator -console 命令,我们可以在 host 中断下得到一个简单的可 以
控制 Android 的 shell ,这 个 系 统 包 含 了 一 个 Toolbox ,提 供 一 些 基 本 的 命 令 工 具 , 集 中 在
/sbin,/system/sbin,/system/bin 中,但是很简陋,命令种类也很少。
目前 Android 的程序安装模式是靠 Eclipse 自动进
行
的,通过对底层的分析可知,大致步骤就是在 /data/app 和
data/data 下存放 android 底层和普通内核没有什么大的区别,我们可以将其作为一个 Linux 来进
行
开发和
hacking 。
Lib Lib Lib Lib 和运
行
环境
� C/C++ 库:被各种 Android 组件
使用
� 通过应用程序框架开发者可以
使用
其功能
� 包括:
� 媒体库: MPEG4 H.264 MP3 JPG PNG .....
� WebKit/LibWebCore : Web 浏览引擎
� SQLite 关系数据库引擎
� 2D , 3D 图形库、引擎
丰富的类库支持: 2D 和 3D 图像库 OpenGL ES 、数据库 SQLite 、对象数据库 db4o 类库、媒体库、基于 Lin ux
底层
系统
C 库等等,让应用开发更简单多样。 Google
使用
Apache 的 Harmony 类库, Harmony 某些方面速 度
快于 Sun 的 VM 。 Runtime 在 Dalvik Java VM 上, Dalvik 采用简练、高效的 byte code 格式运
行
,它能够在 低
资耗和没有应用相互干扰的情况下并
行
执
行
多个应用。
运
行
时环境
� 核心库提供的 Java 功能
� Dalvik 虚拟机依赖于 Linux 内核,例如线程或底层内存管理
� 设备可以运
行
多个 Dalvik 虚拟机,每一个 Android 应用程序在它自己的 Dalvik VM 实例中运
行
� VM 执
行
优化的 Dalvik 可执
行
文件
(.dex)
� Dx- 工具把编译过的 Java
文件
转换为 dex
文件
----------------------------------- Android 编程基础
应用和框架
� 核心应用,例如联系人,电子邮件,电话,浏览器,日历,地图, ...
� 充分访问所有核心应用框架 API
� 简化组件的重用
� 用 Java 编写应用程序----------------------------------- Android 编程基础
支持的功能
+ Application framework: 可重用的和可替换的组件部分,在这个层面上,所有的软件都是平等的。
+ Dalvik virtul machine: 一个基于 Linux 的虚拟机。
+ Integrated browser: 一个基于开源的 WebKit 引擎的浏览器,在应用程序层。
+ Optimized graphics: 包含一个自定义的 2D 图形库和基于 OpenGL ES 1.0 标准的 3D 实现。
+ SQLite: 数据库
+ Media support: 通用的音频,视频和对各种图片格式的支持 (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GI F)
+ GSM Telephony: GSM 移动网络 , 硬件支持。
+ Bluetooth, EDGE, 3G, and WiFi: 都依赖于硬件支持。
+ Camera, GPS, compass, and accelerometer: 都依赖于硬件支持。
+ Rich development environment: 包含一套完整的开发工具集,方便跟踪调试,内存检测和性能测试,而且
Eclipse 的插件。最底层的是一个 Linux Kernel ,加载了几个移动设备必要的
系统
驱动(这么说来 Android 基
础
系统
是要以 GPL 发布了?不知道 34 家厂商的硬件开发商们是怎么样想的);上面是类库和 Runtime ,绿 色
的类库部分可以看到大名鼎鼎的 SQLite ,这个软件甚至声称自己属于公共领域(比 MIT License 还要强 @ @ ) ,
字体 FreeType 是 BSD-style License 的,图形库 OpenGL ES 只需通过产品测试,无偿
使用
于产品。再向上看
是应用层的东西了,这里可以做的事情就非常多了 ,各个社区,各个厂家都可以参与进来。难怪 Android 的 sdk
可以 Apache License 发布了 , 对企业和开发人员友好啊。 那么 Google 自己的东西在哪里呢?没错,就是 右
边那个 runtime ,最吸引技术人员的就是这个 runtime (注意,这个才是 Android 的核心)。 Google 为它准备 了
一个虚拟机,叫做 Dalvik 。这个让人摸不着头脑的东西的到底是什么?从开发平台上我们清清楚楚地得到 了
答案: Java----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
7 7 7 7 个 Linux Linux Linux Linux 手机平台
� Maemo
� Android
� LIMO
� OpenMOKO
� GPE^2
� ALP
� QTopia Phone Edition
Maemo Maemo Maemo Maemo 架构----------------------------------- Android 编程基础
Android Android Android Android 架构----------------------------------- Android 编程基础
LIMO LIMO LIMO LIMO 架构----------------------------------- Android 编程基础
OpneMOKO OpneMOKO OpneMOKO OpneMOKO 架构----------------------------------- Android 编程基础
GPE^2 GPE^2 GPE^2 GPE^2 架构----------------------------------- Android 编程基础
ALP ALP ALP ALP 架构----------------------------------- Android 编程基础
QTopia QTopia QTopia QTopia Phone Phone Phone Phone Edition Edition Edition Edition 架构----------------------------------- Android 编程基础
进程间的通信
Linux 手机平台进程间通信
� Maemo 采用 D-BUS
� Android 采用 OpenBinder
� LiMO 采用 D-BUS
� OpenMoko 采用 D-BUS
� GPE Phone Edition 采用 D-BUS
� ALC 采用 OpenBinder
� Qtopia Phone Edition 采用 D-BUS
进程间通信种类
� D-BUS
� Openbinder
� CORBA/Corbit
� IVY
� GNET
D-BUS----------------------------------- Android 编程基础
Android Android Android Android 学习方法
① 了解什么是 Androi
② 建立开发环境
③ 阅读 SDK 文档
④ 背景知识
� Java
� 面向对象
� 设计模式
� J2ME 、 Brew 、 Symbian
建立 Android Android Android Android 开发环境
① 下载 JDK 5 or JDK 6 (JRE alone is not sufficient) -> 安装 -> 设置环境变量
JAVA_HOME CLASSPATH path
② 下载 Eclipse 3.3 (Europa), 3.4 (Ganymede) IDE for JAVA-> 解压
③ 下载 Android SDK 解压 -> path 里加入 SDK 包中的 tools 目录全路径
④ 下载 ADT 0.8.0 解压
⑤ 打开 Eclipse 安装 ADT 插件----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
Android Android Android Android 开发环境搭建
ADV ADV ADV ADV 的创建
ADT0.9.1 版本
① 在 Eclipse 中创建----------------------------------- Android 编程基础
② 在命令
行
中创建
打开 CMD 命令
行
,进入到 Android SDK tools 目录
使用
android 命令列出 target 值
使用
android create avd 命令来创建 AVD
cd E:\Mobile DEV\Android_SDK1.5\tools
android list targets
行
为: "create avd":
创建一个新的 Android 虚拟设备。
-t --target 新的 AVD 的 Target ID( 必须 )
-c --sdcard 指向一个共享的 SD 存储卡的路径或是为新的 AVD 定制的新 SD 存储卡的容量大小
-p --path 新 AVD 将被创建的位置路径
-n --name 新 AVD 的名称 ( 必须 )
-f --force 强制创建 ( 覆盖已存在的 AVD)
-s --skin 新 AVD 的皮肤----------------------------------- Android 编程基础
例子 : 将建一个名叫 GPhone 的 AVD , Target ID=2 、 SD 存储卡容量 52M 、路径 C:\AVD\ 、皮肤 SUSE-HVGA- P
查看自己新创建的 ADV : list avd 命令
ADT0.9.0 版本
只能在命令
行
中创建
开启命令
行
进入 Android SDK tools 目录
列出 Target ID
创建一个新的 AVD
查看新创建的 AVD
运
行
指定
的 AVD
运
行
新创建的 AVD:GPhone
android create avd -n GPhone -t 2 -c 52M -p C:\AVD\ -s SUSE-HVGA-P
android list avd
cd E:\Mobile DEV\Android_SDK1.5\tools
andriod list target
android create avd -n GPhone -t 2 -c 52M -p C:\AVD\ -s SUSE-HVGA-P
android list avd
emulator -avd GPhone----------------------------------- Android 编程基础
Windows Windows Windows Windows 平台:
Eclipse IDE 版本
------------JDK+Eclipse+Android SDK+ADT
1. 必须软件
2. 安装过程
① 安装 JAVA JDK SE 1.6
� 设置环境变量
� JAVA_HOME
� JAVA_JRE_HOME
� JRE_HOME
� Android_SDK_HOME
� CLASSPATH
� Path
① JAVA JDK SE 1.6 jdk-6u13-windows-i586-p.exe
② Eclipse 3.4.2 eclipse-java-ganymede-SR2-win32.zip
③ Google Android SDK android-sdk-windows-1.5_r1.zip
④ ADT-0.9.0 ADT-0.9.0.zip
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_13
JAVA_JRE_HOME=C:\Program Files\Java\jdk1.6.0_13\jre
JRE_HOME=C:\Program Files\Java\jre6
Android_SDK_HOME =C:\Mobile Phone DEV\Android SDK
CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.
jar;%JRE_HOME%\lib;%JRE_HOME%\lib\rt.jar;%JAVA_JRE_HOME%\lib;%JAVA_JRE_HOME%
\lib\rt.jar
Path= %Android_SDK_HOME%\tools ;%JAVA_HOME%\bin;%JRE_HOME%\bin;%JAVA_JRE
_HOME%\bin;
要
使用
命令
行
工具必须配置----------------------------------- Android 编程基础
② 解压 Eclipse 3.4.2
③ 解压 Google Android SDK
④ Eclipse 下安装 ADT 0.9.0
⑤ 设置 Google Android SDK 路径
解压 eclipse-java-ganymede-SR2-win32.zip 到 C:\Eclipse For Android\
解压 android-sdk-windows-1.5_r1.zip 到 C:\Mobile Phone DEV\Android SDK
复制 ADT-0.9.0.zip 到 C:\
打开 C:\Eclipse For Android\eclipse.exe
设置工作路径为 C:\WorkSpace
Help->SoftWare Update->find and install ->Search for new features to install ->Next->New Archived
site-> 选中 C:\ ADT-0.9.0.zip->OK->Finish->ADT-0.9.0.zip 选勾 ->Next->Accept->Next->Finish-
>Install All->Restart “ YES ”
Window->preferences-> 选中 Android->SDK Location 中选择 Google Android SDK 的安装路 径
C:\Mobile Phone DEV\Android SDK->OK----------------------------------- Android 编程基础
3. HelloWorld 程序实例
① 新建一个 Android Project
� Project name 设置工程名 Hello Google Android
� Package name 设置包名 zyf.android.test.hello
� Activity name 设置活动名 Hello
� Application name 设置应用程序名 Hello
� Build Target 设置 AVD API 的版本 3 Android1.5----------------------------------- Android 编程基础
8----------------------------------- Android 编程基础
② 修改 Hello.java
文件
内容如下:
③ 运
行
as Android
package package package package zyf.android.test.hello;
import import import import android.app.Activity;
import import import import android.os.Bundle;
import import import import android.widget.TextView;
public public public public class class class class Hello extends extends extends extends Activity {
/** Called when the activity is first created. */
@Override
public public public public void void void void onCreate(Bundle savedInstanceState) {
super super super super .onCreate(savedInstanceState);
// setContentView (R.layout.main);
TextView tv = new new new new TextView( this this this this );
tv.setText( " 这是一个测试 Android 的 helloWorld" );
setContentView(tv);
}----------------------------------- Android 编程基础
④ 代码分析:
在 Android 中,用户界面控件被封装成了各种 Class 叫做 Views 。一个 View 是一个可以显示的控件对
象,比如 RadioButton , Animation , TextLable 等。其中的一个简单的控件是 TextView:
传入 TextView 构造函数的参数是一个 Context 对象,通过这个对象可以
使用
系统
提供的功能接口,比
如加载资源,访问数据库和共享数据等等。 Activity 类从 Context 类继承而来,所以 Activity 本身 是
一个 Context ( Java 中的继承概念)。
TextView 对象构建以后就可以设置要显示的数据了。
tv.setText(" 这是一个测试 Android 的 helloWorld");
最后是连接 TextView 到屏幕 , 类似这样 :
setContentView() 方法可以控制具体哪一个控件和
系统
的 UI 联系起来(我的理
解是设置为主显示 View )。如果没有设置,屏幕中将会显示空白。
TextView tv = new new new new TextView( this this this this );
setContentView(tv);----------------------------------- Android 编程基础
11----------------------------------- Android 编程基础
Apache Ant IDE 版本
------------JDK+Android SDK +Ant
1. 必须软件
2. 安装过程
① 安装 JAVA JDK SE 1.6
� 设置环境变量
� JAVA_HOME
� JAVA_JRE_HOME
� JRE_HOME
� Android_SDK_HOME
� ANT_HOME
� CLASSPATH
� Path
① JAVA JDK SE 1.6 jdk-6u13-windows-i586-p.exe
② Google Android SDK android-sdk-windows-1.5_r1.zip
③ Apache Ant apache-ant-1.7.1-bin.zip
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_13
JAVA_JRE_HOME=C:\Program Files\Java\jdk1.6.0_13\jre
JRE_HOME=C:\Program Files\Java\jre6
Android_SDK_HOME =C:\Mobile Phone DEV\Android SDK
ANT_HOME=C:\Mobile Phone DEV\Apache Ant\apache-ant-1.7.1
CLASSPATH=.;%ANT_HOME%\lib;%ANT_HOME%\lib\ant.jar;%JAVA_HOME%\lib;%JAV
A_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JRE_HOME%\lib;%JRE_HOME%\lib\r
t.jar;%JAVA_JRE_HOME%\lib;%JAVA_JRE_HOME%\lib\rt.jar
Path=%ANT_HOME%\bin;%Android_SDK_HOME%\tools;%JAVA_HOME%\bin;%JRE_HO
ME%\bin;%JAVA_JRE_HOME%\bin;----------------------------------- Android 编程基础
② 解压 Google Android SDK
③ 解压 apache-ant-1.7.1.zip
3. HelloWorld 程序实例
解压 android-sdk-windows-1.5_r1.zip
到 C:\Mobile Phone DEV\Android SDK
解压 Apache Ant apache-ant-1.7.1.zip
到 C:\Mobile Phone DEV\Apache Ant\apache-ant-1.7.1
① 开始 -> 运
行
->cmd
② cd C:\Mobile Phone DEV\WorkSpace
③
使用
命令
行
工具来创建一个新工程
④ cd Hello
⑤ ant debug
⑥ cd bin
⑦ emulator -avd Android_SDK1.5
⑧
adb
install ./hello-debug.apk
⑨ 在模拟器中运
行
hello 程序
android create project -k zyf.hello -n HelloAndroid -t 2 -a AntActivity -p ./Hello----------------------------------- Android 编程基础
Linux Linux Linux Linux 平台:
JDK+Eclipse+Android SDK+ADT
JDK+Android SDK +Ant----------------------------------- Android 编程基础
Activity Activity Activity Activity : : : :
活动是最基本的 Android 应用程序组件,应用程序中,一个活动通常就是一个单独的屏幕。每一个活动
都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并 对
事件做出响应。大多数的应用是由多个屏幕显示组成。例如 : 一个文本信息的应用也许有一个显示发送消息 的
联系人列表屏幕,第二个屏幕用来写文本消息和选择收件人,再来一个屏幕查看消息历史或者消息设置操 作
等。这里每一个这样的屏幕就是一个活动,很容易实现从一个屏幕到一个新的屏幕并且完成新的活动。在 某
些情况下当前的屏幕也许需要向上一个屏 幕活动提供返回值 -- 比如让用户从手机中挑选一张照片返回通讯录
做为电话拨入者的头像。
当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的 前
一个屏幕。当屏幕不再
使用
时,还可以从历史堆栈中删除。默认情况下, Android 将会保留从主屏幕到每一
个应用的运
行
屏幕。
简单理解 Activity 代表一个用户所能看到的屏幕, Activity 主要是处理一个应用的整体性工作,例如, 监
听
系统
事件 ( 按键事件、触摸屏事件等 ) 、为用户显示
指定
的 View ,启动其他 Activity 等。所有应用的 Activit y
都继承于 android.app.Activity 类,该类是 Android 提供的基层类,其他的 Activity 继承该父类后,通过 Over ride
父类的方法来实现各种功能,这种设计在其他领域也较为常见。
Intent Intent Intent Intent : : : :
调用 Android 专有类 Intent 进
行
架构屏幕之间的切换。 Intent 是描述应用想要做什么。 Intent 数据结构两
个最重要的部分是动作和动作对应的数据。典型的动作类型有 :MAIN (活动的门户)、 VIEW 、 PICK 、 EDIT
等。而动作对应的数据则以 URI 的形式进
行
表示。例如 : 要查看某个人的联系方式,你需要创建一个动作类
型为 VIEW 的 Intent ,以及一个表示这个人的 URI 。
Android
使用
了 Intent 这个特殊类,实现在屏幕与屏幕之间移动。 Intent 类用于描述一个应用将会做什 么
事。在 Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有: MAIN ( a ctivity
的门户)、 VIEW 、 PICK 、 EDIT 等。而动作对应的数据则以 URI 的形式进
行
表示。例如:要查看一个人的 联
系方式,你需要创建一个动作类型为 VIEW 的 intent ,以及一个表示这个人的 URI 。
与之有关系的一个类叫 IntentFilter 。相对于 intent 是一个有效的做某事的请求,一个 intentfilter 则用于 描
述一个 activity (或者 IntentReceiver )能够操作哪些 intent 。一个 activity 如果要显示一个人的联系方式时, 需
要声明一个 IntentFilter ,这个 IntentFilter 要知道怎么去处理 VIEW 动作和表示一个人的 URI 。 IntentFilter 需
要在 AndroidManifest.xml 中定义。
通过解析各种 intent ,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时, activity 将会调用
startActivity(IntentmyIntent) 方法。然后,
系统
会在所有安装的应用程序中定义的 IntentFilter 中查
找
,
找
到最
匹配 myIntent 的 Intent 对应的 activity 。新的 activity 接收到 myIntent 的通知后,开始运
行
。当 startActivity 方
法被调用将触发解析 myIntent 的动作,这个机制提供了两个关键好处:----------------------------------- Android 编程基础
A 、 Activities 能够重复利用从其它组件中以 Intent 的形式产生的一个请求;
B 、 Activities 可以在任何时候被一个具有相同 IntentFilter 的新的 Activity 取代。
IntentReceiver: IntentReceiver: IntentReceiver: IntentReceiver:
当你希望你的应用能够对一个外部的事件 ( 如当电话呼入时,或者数据网络可用时,或者到了晚上时 ) 做出响
应,你可以
使用
一个 IntentReceiver 。虽然 IntentReceiver 在感兴趣的事件发生时,会
使用
NotificationManage r
通知用户,但它并不能生成一个 UI 。 IntentReceiver 在 AndroidManifest.xml 中注册,但也可以在代码中
使用
Context.registerReceiver() 进
行
注册。当一个 intentreceiver 被触发时,你的应用不必对请求调用 inten treceiver ,
系统
会在需要的时候启动你的应用。各种应用还可以通过
使用
Context.broadcastIntent() 将它们自己的
intentreceiver 广播给其它应用程序。
Service Service Service Service : : : :
一个 Service 是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中
播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个 activity ,让
使用
者可以选择歌曲并播 放
歌曲。然而,音乐重放这个功能并没有对应的 activity ,因为
使用
者当然会认为在导航到其它屏幕时音乐应 该
还在播放的。在这个例子中,媒体播放器这个 activity 会
使用
Context.startService() 来启动一个 service ,从而
可以在后台保持音乐的播放。同时,
系统
也将保持这个 service 一直执
行
,直到这个 service 运
行
结束。另外 ,
我们还可以通过
使用
Context.bindService() 方法,连接到一个 service 上(如果这个 service 还没有运
行
将启动
它)。当连接到一个 service 之后,我们还可以 service 提供的接口与它进
行
通讯。拿媒体播放器这个例子来 说 ,
我们还可以进
行
暂停、重播等操作。
Content Content Content Content Provider Provider Provider Provider : : : :
Android 应用程序能够将它们的数据保存到
文件
、 SQLite 数据库中,甚至是任何有效的设备中。当你想
将你的应用数据与其它的应用共享时,内容提供器就可以发挥作用了。因为内容提供器类实现了一组标准 的
方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。
数据是应用的核心。在 Android 中,默认
使用
鼎鼎大名的 SQLite 作为
系统
DB 。但是在 Android 中,
使用
方
法有点小小的不一样。在 Android 中每一个应用都运
行
在各自的进程中,当你的应用需要访问其他应用的数
据时,也就需要数据在不同的虚拟机之间传递,这样的情况操作起来可能有些困难 ( 正常情况下,你不能读 取
其他的应用的 db
文件
) , ContentProvider 正是用来解决在不同的应用包之间共享数据的工具。
� 所有被一个 Android 应用程序创建的偏好设置,
文件
和数据库都是私有的。
� 为了和其他应用程序共享数据,应用程序不得不创建一个 Content Provider
� 要回索其他应用程序的数据,它自己的 Content Provider 必须被调用
� Android 本地 Content Provider 包括:
� CallLog :地址和接收到的电话信息
� Contact.People.Phones :存储电话号码
� Setting.System :
系统
设置和偏好设置
� 等等----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
Android Android Android Android 虚拟机 Dalvik Dalvik Dalvik Dalvik
Dalvik Dalvik Dalvik Dalvik 冲击
随着 Google 的 AndroidSDK 的发布,关于它的 API 以及在移动电话领域所带来的预
期影响这些方面的讨论不胜枚举。不过,其中的一个话题在 Java 社区是一石激起千层浪,
这就是 Android 平台的基础 —— Dalvik 虚拟机。
Dalvik Dalvik Dalvik Dalvik 和标准 Java Java Java Java 虚拟机 (JVM) (JVM) (JVM) (JVM) 首要差别
Dalvik 基于寄存器,而 JVM 基于栈。,基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花 费
的时间更短。
Dalvik Dalvik Dalvik Dalvik 和 Java Java Java Java 运
行
环境的区别
Dalvik 经过优化,允许在有限的内存中同时运
行
多个虚拟机的实例,并且每一个 Dalvik 应用作为一个独立 的
Linux 进程执
行
。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭 .
Dalvik Dalvik Dalvik Dalvik 形势
Dalvik 的诞生也导致人们开始忧虑 Java 平台的第一次大规模的分道扬镳或许已经是进
行
时了 —— 有人已经 把
Davlik 和微软的 JVM 以及 Sun 对微软的诉讼联系起来,等着看 Google 身上是否也会发生类似事情;另外 一
些人则指出, Google 并没有宣称 Dalvik 是一个 Java 实现,而微软却是这样做的。 Sun 也对可能带来的阵营
分裂表达了忧虑情绪,并提出和 Google 合作来保证 Dalvik 和 JVM 之间的兼容性 —— Google 对此的解释是,
Dalvik 是对解决目前 JavaME 平台上分裂的一次尝试,也是为了提供一个拥 有较少限制许可证的平台。甚至
还有人怀疑这是否是 Sun 和 Google 两大阵营对 Java 之未来的一次大规模较量。----------------------------------- Android 编程基础
Android Android Android Android 中各种 JAVA JAVA JAVA JAVA 包的功能描述
在 Android 的应用程序开发中,通常
使用
的是 JAVA 语言,除了需要熟悉 JAVA 语
言的基础知识之外,还需要了解 Android 提供的扩展的 JAVA 功能。
在一般的 JAVA 应用中,如果需用引用基础类库,通常需要
使用
如下的方式:
import javax.swing.*;
以上代码表示了引用 JAVA 的 GUI 组件 Swing,javax.swing 即 JAVA 中的一个包。
android 提供一些扩展的 JAVA 类库,类库分为若干个包,每个包中包含若干个类。
重要包的描述:
android.app :提供高层的程序模型、提供基本的运
行
环境
android.content :包含各种的对设备上的数据进
行
访问和发布的类
android.database :通过内容提供者浏览和操作数据库
android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上 .
android.location :定位和相关服务的类
android.media :提供一些类管理多种音频、视频的媒体接口
android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口
android.os :提供了
系统
服务、消息传输、 IPC 机制
android.opengl :提供 OpenGL 的工具
android.provider :提供类访问 Android 的内容提供者
android.telephony :提供与拨打电话相关的 API 交互
android.view :提供基础的用户界面接口框架
android.util :涉及工具性的方法,例如时间日期的操作
android.webkit :默认浏览器操作接口
android.widget :包含各种 UI 元素(大部分是可见的)在应用程序的屏幕中
使用
----------------------------------- Android 编程基础
Android Android Android Android 的相关
文件
类型
Java Java Java Java
文件
----- ----- ----- ----- 应用程序源
文件
android 本身相当一部分都是用 java 编写而成 ( 基本上架构图里头蓝色的部份都是用 Java 开发的 ) , android 的
应用必须
使用
java 来开发。
Class Class Class Class
文件
------Java ------Java ------Java ------Java 编译后的目标
文件
不像 J2se , java 编译成 class 就可以直接运
行
, android 平台上 class
文件
不能直接在 android 上运
行
。由于 G oogle
使用
了自己的 Dalvik 来运
行
应用,所以这里的 class 也肯定不能在 AndroidDalvik 的 java 环境中运
行
, androi d
的 class
文件
实际上只是编译过程中的中间目标
文件
,需要链接成 dex
文件
后才能在 dalvik 上运
行
。
Dex Dex Dex Dex
文件
-----Android -----Android -----Android -----Android 平台上的可执
行
文件
Android 虚拟机 Dalvik 支持的字节码
文件
格式 Google 在新发布的 Android 平台上
使用
了自己的 Dalvik 虚拟 机
来定义,这种虚拟机执
行
的并非 Java 字节码,而是另一种字节码: dex 格式的字节码。在编译 Java 代码之 后 ,
通过 Android 平台上的工具可以将 Java 字节码转换成 Dex 字节码。虽然 Google 称 Dalvik 是为了移动设备定
做的,但是业界很多人认为这是为了规避向 sun 申请 Javalicense 。这个 DalvikVM 针对手机程式 /CPU 做过 最
佳化,可以同时执
行
许多 VM 而不会占用太多 Res ource 。
Apk Apk Apk Apk
文件
-------Android -------Android -------Android -------Android 上的安装
文件
Apk 是 Android 安装包的扩展名,一个 Android 安装包包含了与某个 Android 应用程序相关的所有
文件
。 apk
文件
将 AndroidManifest.xml
文件
、应用程序代码 (.dex
文件
) 、资源
文件
和其他
文件
打成一个压缩包。一个工
程只能打进一个 .apk
文件
。----------------------------------- Android 编程基础
Android Android Android Android 的应用程序结构分析: HelloActivity
本例以一个简单的 HelloActivity 程序为例,简单介绍 Android 应用程序的源代码结构。事实
上, Android 应用程序虽然不是很复杂,但是通常涉及了 JAVA 程序 ,XML
文件
, Makefile
多方面的内容。 HelloActivity 虽然简单,但是麻雀虽小,五脏俱全,是学习 Android 应用程
序的最好示例。
第一部分: HelloActivity HelloActivity HelloActivity HelloActivity 的源代码
HelloActivity 工程的源代码在 Android 目录的 development/samples/HelloActivity/ 中,代码的
结构如下所示:
其中 tests 是一个独立的项目,可以暂时不考虑。其他部分看作一个 Android 的一应用程序
的工程。这个工程主要的组成部分如下所示:
AndroidManifest.xml :工程的描述
文件
,在运
行
时有用处
Android.mk :整个工程的 Makefile
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----------------------------------- Android 编程基础
res :放置资源
文件
的目录
src/com/example/android/helloactivity/HelloActivity.java :这是 JAVA 类
文件
,这个
文件
的路径
表示在 Andorid 的 JAVA 包的结构中的位置, 这个包的
使用
方式为
com.example.android.helloactivity 。
第二部分: 编译的中间结果
这个 HelloActivity 工程经过编译后将生成
out/target/common/obj/APPS/He lloActivity_intermediates/ 目录, 这个目录中的内容都是
HelloActivity 工程相关的, 更具体地说都与 development/samples/HelloActivity/ 中的
Android.mk
文件
相关。
classes.dex
是一个最重要的
文件
,它是给 Android 的 JAVA 虚拟机 Dalvik 运
行
的字节码文
classes.jar
是一个 JAR
文件
, JAR 的含义为 Java ARchive ,也就是 Java 归档,是一种与平台
无关的
文件
格式,可将多个
文件
合成一个
文件
。解压缩之后的目录结构: (JAVA 标准编译得
到的类 )
out/target/common/obj/APPS/He lloActivity_intermediates/
|-- classes.dex (字节码)
|-- classes.jar ( JAR
文件
)
|-- public_resources.xml (根据 resources 结构生成的 xml )
`-- src
|-- R.stamp
`-- com
`-- example
`-- android
`-- helloactivity
`-- R.java ( resources 生成的
文件
)----------------------------------- Android 编程基础
各个以 class 为扩展名的
文件
,事实上是 JAVA 程序经过编译后的各个类的字节码。
第三部分: 目标 apk apk apk apk
文件
目标 apk
文件
是 Android 的 JAVA 虚拟机 Dalvik 安装和运
行
的
文件
,事实上这个 apk
文件
将
由编译的中间结果和原始
文件
生成。 apk
文件
的本质是一个 zip 包。这个 APK 包解压缩后的
目录结构如下所示:
值得注意的是,这里的 xml
文件
经过了处理,和原始的
文件
不太一样,不能按照文本
文件
的方式阅读。
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
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----------------------------------- 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 工程的描述
文件
,其内容如下所示:
其中 package 用于说明这个包的名称, android:labeapplication 中的内容是表示这个应用程序
在界面上显示的标题, activity 中的 android:name 表示这个 Android 的活动的名称。
----------------------------------- Android 编程基础
文件
src/com/example/android/helloactivity/HelloActivity.java 是程序主要
文件
,由 JAVA 语言
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
文件
的内容如下所示:
其中定义了一个可编辑的文本( EditText ),下面的各项其实是它的各种属性, android:text 表示这个文本 的
内 容 ,string/hello_activity_text_text 表 示
找
到 相 应 的 文 件 , 也 就 是 res/value/string.xml 文 件 中 的
hello_activity_text_text 文本。
res/value/string.xml 的内容如下所示:
hello_activity_text_text 文本被 res/layout/hello_activity.xml
文件
引用,正是应用程序运
行
时在
屏幕显示的文本。
package package package package com.example.android.helloactivity;
import import import import android.app.Activity;
import import import import android.os.Bundle;
public public public public class class class class HelloActivity extends extends extends extends Activity {
public public public public HelloActivity() {
@ Override
public public public public void void void void onCreate(Bundle savedInstanceState) {
super super super super .onCreate(savedInstanceState);
setContentView(R.layout.hello_activity);
----------------------------------- Android 编程基础
Android Android Android Android
ADB
ADB
ADB
ADB
工具
使用
adb
(Android Debug Bridge) 是 Android 提供的一个通用调试工具,借助这个工具,我妈可以管理设备或手机 模
拟器的状态。
adb
adb
adb
adb
功能操作:
� 快速更新设备或手机模拟器中的代码,如应用或 Android
系统
升级
� 在设备上运
行
shell 命令
� 管理设备或手机模拟器上预定端口
� 在设备或手机模拟器上复制、粘贴
文件
adb
adb
adb
adb
常用操作:
安装应用到模拟器
Android 没有提供一个卸载应用的命令,只能手动删除:
进入设备或模拟器的 Shell
通过以上命令,可以进入设备或模拟器的 shell 环境中,在这个 Linux Shell 中,你可以执
行
各种 Linux 的命 令 ,
另外如果只想执
行
一条 shell 命令,可以采用以下方式:
会打印出内核的调试信息
可以设置任意的端口号,做为主机向模拟器或设备的请求端口。如 :
adb
install app.apk
adb
shell
cd data/app
rm app.apk
adb
shell
adb
shell [command]
adb
shell dmesg
adb
forward tcp:5555 tcp:8000----------------------------------- Android 编程基础
复制
文件
可向一个设备或从一个设备中复制
文件
� 复制一个
文件
或目录到设备或模拟器上:
� 从设备或模拟器上复制一个
文件
或目录
搜索 / 等待模拟器、设备实例
取得当前运
行
的模拟器、设备的实例列表及每个实例的状态 | 等待正在运
行
的设备
查看 Bug 报告
记录无线通讯日志
无线通讯记录日志非常多,在运
行
时没必要记录,可以通过命令设置记录
获取设备 ID 和序列号
访问数据库 SQLite3
adb
push
adb
push test.txt /tmp/test.txt
adb
pull
adb
pull /android/lib/libwebcore.os
adb
devices
adb
wait-for-device
adb
bugreport
adb
shell
logcat -b radio
adb
get-product
adb
get-serialno
adb
shell
sqlite3----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
封面----------------------------------- Android 编程基础
Android Android Android Android 模拟器
模拟器参数
option 选项
emulator [option] [-qemu args]
-sysdir 为模拟器在 目录中搜索
系统
硬盘镜像
-system 为模拟器从
文件
中读取初始化
系统
镜像
-datadir 设置用户数据写入的目录
-kernel 为模拟器设置
使用
指定
的模拟器内核
-ramdisk 设置内存 RAM 镜像
文件
( 默认为 /ramdisk.img)
-image 废弃,
使用
-system 替代
-init-data 设置初始化数据镜像 ( 默认为 /userdata.img)
-initdata 和 "-init-data "
使用
方法一致
-data 设置数据镜像 ( 默认为 /userdata-qemu.img)
-partition-size system/data 分区容量大小 (MB)
-cache 设置模拟器缓存分区镜像 ( 默认为 零时
文件
)
-no-cache 禁用缓存分区
-nocache 与 "-no-cache"
使用
方法相同
-sdcard
指定
模拟器 SDCard 镜像
文件
( 默认为 /sdcard.img)
-wipe-data 清除并重置用户数据镜像 ( 从 initdata 拷贝 )
-avd
指定
模拟器
使用
Android 虚拟设备
-skindir 设置模拟器皮肤 在 目录中搜索皮肤 ( 默认为 /skins 目录 )
-skin 选择
使用
给定的皮肤
-no-skin 不适用任何模拟器皮肤
-noskin
使用
方法与 "-no-skin" 相同
-memory 物理 RAM 内存大小 (MB)
-netspeed 设置最大网络下载、上传速度
-netdelay 网络时延模拟
-netfast 禁用网络形态
-tarce 代码配置可用
-show-kernel 显示内核信息
-shell 在当前终端中
使用
根 Shell 命令
-no-jni Dalvik 运
行
时禁用 JNI 检测
-nojni
使用
方法与 "-no-jni" 相同
-logcat 输出给定 tag 的 Logcat 信息----------------------------------- Android 编程基础
-no-audio 禁用音频支持
-noaudio 与 "-no-audio" 用法相同
-audio
使用
指定
的音频 backend
-audio-in
使用
指定
的输入音频 backend
-audoi-out
使用
指定
的输出音频 backend
-raw-keys 禁用 Unicode 键盘翻转图
-radio 重定向无线模式接口到个性化设备
-port 设置控制台
使用
的 TCP 端口
-ports , 设置控制台
使用
的 TCP 端口和
ADB
调试桥
使用
的 TCP 端口
-onion 在屏幕上层
使用
覆盖 PNG 图片
-onion-alpha
指定
上层皮肤半透明度
-onion-rotation 0|1|2|3
指定
上层皮肤旋转
-scale 调节模拟器窗口尺寸 ( 三种: 1.0-3.0 、 dpi 、 auto)
-dpi-device 设置设备的 resolution (dpi 单位 ) ( 默认 165)
-http-proxy 通过一个 HTTP 或 HTTPS 代理来创建 TCP 连接
-timezone
使用
给定的时区,而不是主机默认的
-dns-server 在模拟
系统
上
使用
给定的 DNS 服务
-cpu-delay 调节 CUP 模拟
-no-boot-anim 禁用动画来快速启动
-no-window 禁用图形化窗口显示
-version 显示模拟器版本号
-report-console 向远程 socket 报告控制台端口
-gps 重定向 GPS 导航到个性化设备
-keyset
指定
按键设置
文件
名
-shell-serial 根 shell 的个性化设备
-old-system 支持旧版本 (pre 1.4)
系统
镜像
-tcpdump 把网络数据包捕获到
文件
中
-bootchart bootcharting 可用
-qemu args.... 向 qemu 传递参数
-qemu -h 显示 qemu 帮助
-verbose 和 "-debug-init" 相同
-debug 可用、禁用调试信息
-debug- 使
指定
的调试信息可用
-debug-no- 禁用
指定
的调试信息
-help 打印出该帮助文档
-help- 打印出
指定
option 的帮助文档
-help-disk-images 关于硬盘镜像帮助
-help-keys 支持按钮捆绑 ( 手机快捷键 )
-help-debug-tags 显示出 -debug 命令中的 tag 可选值
-help-char-devices 个性化设备说明
-help-environment 环境变量
-help-keyset-file
指定
按键绑定设置
文件
-help-virtula-device 虚拟设备管理----------------------------------- Android 编程基础
-help-sdk-images 当
使用
SDK 时关于硬盘镜像的信息
-help-build-images 当构建 Android 时,关于硬盘镜像的信息
-help-all 打印出所有帮助----------------------------------- Android 编程基础
在 Android 中,进程完全是应用程序的实现细节,不是用户一般想象的那样。
它们的用途很简单:
� 通过把不信任或是不稳定的代码放到其他进程中来提高稳定性或是安全性
� 通过在相同的进程中运
行
多个 .apk 代码来减少消耗
� 通过把重量级代码放入一个分开的进程中来帮助
系统
管理资源。该分开的进程可以被应用程序的其他 部
分单独地杀死
� 如果两个没有共享相同的用户 ID 的 .apk 试图在相同的进程中运
行
,这将不被允许,并且
系统
会为每一
个 apk 程序创建不同的进程会
� Android 让一个应用程序在单独的线程中,指导它创建自己的线程
� 应用程序组件( Activity 、 service 、 broadcast receiver )所有都在理想的主线程中实例化
� 没有一个组件应该执
行
长时间或是阻塞操作 ( 例如网络呼叫或是计算循环 ) 当被
系统
调用时,这将中断所
有在该进程的其他组件
� 你可以创建一个新的线程来执
行
长期操作----------------------------------- Android 编程基础
Android Android Android Android 释放手机资源,进程释放优先级
当
系统
资源消耗, Android 将会杀死一些进程来释放资源。
进程优先级顺序:
① 前台进程:
包含一个前台 Activity 、包含一个正在运
行
的广播接收器、正在运
行
的服务(当前用户所需的 Activity 、
正在屏幕顶层运
行
的 Activity )
② 可视进程:
包含一个可视化的 Activity ( Activity 可视的,但是不是在前台的( onPause ))、例如显示在一个前台对
话框之后的以前的 Activity )
③ 服务进程:
包含一个被开启的服务 ( 处理服务,不是直接可视,例如媒体播放器,网络上传、下载 )
④ 后台进程:
包含一个不可视的 Activity( 带有一个当前不可视的 Activity 、可以在任意时刻杀死该进程来回收内存 )
⑤ 空进程
没有持有任何应用程序组件----------------------------------- Android 编程基础
Android Android Android Android 应用开发 1 1 1 1
分析 Hello Hello Hello Hello Android Android Android Android
打开 Hello Android 工程
Main.xml
src
文件
夹 HelloAndroid.java R.java Android Library Assets
文件
夹
源
文件
主程序
文件
资源
文件
Java 库 静态
文件
打包
res
文件
夹
drawable
文件
夹 layout
文件
夹 values
文件
夹
程序图标 (ico.png) 布局 UI (main.xml) 程序用到的 String 、颜色 **(string.xml)
AndroidMainfest.xml
描述应用程序、构成、组件、权限
bin
文件
夹
classes.dex HelloAndroid.apk 自定义的包
文件
夹
编译的 java 二进制 码 Android 安装包 (APK 包 ) 存放编译后的字节码
文件
整体布局 表示线性布局
xmlns:android = "http://schemas.android.com/apk/res/android" 名字空间
android:orientation = "vertical" 控件布局 垂直往下布局
android:layout_width = "fill_parent"
android:layout_height = "fill_parent" 上层控件填充满
图形空间 派生于 View
----------------------------------- Android 编程基础
R.java
通过 res
文件
夹下的 xml
文件
定义自动生成的, main.xml ico.png string.xml 是配套的关联,进
行
修改后
R.java 自动重新生成
AndroidManifest.xml
有关版本,程序信息, java 包,程序图标,程序记录信息等。
Manifest.xml
文件
轮廓
添加编辑框与按钮
package package package package zyf.Study.AndroidSturdyByMyself;
import import import import android.app.Activity;
import import import import android.os.Bundle;
import import import import android.view.View;
import import import import android.view.View.OnClickListener;
import import import import android.widget.Button;
import import import import android.widget.EditText;
import import import import android.widget.TextView;
public public public public class class class class AndroidSturdyByMyself extends extends extends extends Activity {
private private private private EditText getNameEditText ;
private private private private Button button_Login ;
private private private private TextView show_Login_TextView ;
/** Called when the activity is first created. */
@Override
public public public public void void void void onCreate(Bundle savedInstanceState) {
super super super super .onCreate(savedInstanceState);
setContentView(R.layout. main );
getNameEditText =(EditText)findViewById(R.id. widget29_getName_EditText );
button_Login =(Button)findViewById(R.id. widget30_Login_Button );
show_Login_TextView =(TextView)findViewById(R.id. widget31_showLogin_TextView );
button_Login .setOnClickListener( new new new new OnClickListener(){
@Override
public public public public void void void void onClick(View v) {
// TODO TODO TODO TODO Auto-generated method stub
show_Login_TextView .setText( getNameEditText .getText()+ " 欢迎您进入 " );
}----------------------------------- Android 编程基础
使用
Intent Intent Intent Intent 启动另一个 Activity Activity Activity Activity
在多个 Activity Activity Activity Activity 之间切换时候,注意每个 Activity Activity Activity Activity 都应在 AndroidManifest.xml AndroidManifest.xml AndroidManifest.xml AndroidManifest.xml 中有所声
明定义(如下)
在不同 Task Task Task Task 中启动 Activity Activity Activity Activity
Intent.FLAG_ACTIVITY_NEW_TASK
Intent showNextPage_Intent= new new new new Intent();
showNextPage_Intent.setClass(UsingBundel. this this th
在
使用
Android SQLite数据库和SharedPreferences时,从DDMS的FileExplore查看数据库
文件
时会发现里面是空的什么也没有。
需要完成:需要root权限下chmod目录:/data 及 /data/data
条件:Root过的设备,不root 过就没有 root权限 ,su 或sudo 命令无效。
1 Windlos 打开 cmd ,然后cd
当然类似这个解决办法:
找
路径“c:\windows\system32\DriverStore\FileRepository\winusb.inf_x86_neutral_6cb50ae9f480775b\”,把里面的Winusb.sys
文件
复制到“c:\windows\inf”目录下,卸载原来的驱动重新插入手机,
系统
这次就能安装成功了。
(PS:如果没有以上x86路径,则
找
amd64的,即:C:\Windows\System32\DriverStore\Fi