- 浏览: 3016242 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
上次摸Google Android的模拟器已经是去年这玩意刚发布没多久的时候了。嘛,本来我也没太着急在Android上做开发。这个学期开学之后,我们这边的毕业设计也正式开始了。
邵栋老师带了几个组是做Android应用程序开发的课题的。正好附近两个宿舍都有人是做这个课题的。语仔他们组想做的是一个*个人理财软件*,之前就在国内的一些Android开发论坛到处看啊找啊,在学习相关技术知识。不过前几天碰到了很奇怪的NullPointerException,问我怎么办。这样我也就又摸出Android来玩了。
正好3月3号Google更新了Android SDK到m5-rc15,而我之前用的SDK都不记得是m多少的了(m3?),干脆就连SDK和Eclipse+ADT都一并更新过来。
到Eclipse官网去看,现在的版本已经到3.3.2了。正好连机上的别的Eclipse也一起更新。先是下了Eclipse Classic 3.3.2,结果到安装ADT的时候出现require "org.eclipse.wst.sse.ui"的错误。很明显是要装WTP了。以前装过的老版本的ADT明明不需要的……
装WTP就得连什么GEF啊之类的一堆东西都分别装上。嫌麻烦,就重新下了个Eclipse IDE for Java Developers。然后安装ADT就没问题了。
顺带记下官网对于安装ADT插件的说明:
===========================================================================
关于某NPE问题
OK,东西都装上了,开始解决问题。之前语仔遇到的NPE是基于这样的代码:
/src/com/my/MyActivity.java:
/res/layout/main.xml:
这代码看起来似乎没什么问题。我之前又没怎么看过Android的教程或者文档之类的东西,觉得不知道该从何入手。总之第一能想到的就是看看stack trace;但当在Android里遇到异常时,它就这么在屏幕上显示个简单的提示:
(这图是我另外开的一个project,故意引发了一个NPE而已……)
感觉好可怜,啥也看不出来。
然后查了下如何向输出写自定义的log,发现android.util.Log类可以做这件事。用Log.v(/*String*/tag, /*String*/message, /*Throwable*/obj)就能把日志写出来。这个静态的Log.v()方法用于输出VERBOSE级日志,其中包括了stack trace。输出的目标是logcat。
那么把前面的Java代码中onCreate()方法里的内容整个用try-block包起来,然后catch Exception并将异常状况写到log里。然后运行……没看到NPE了,但那个按钮里的代码却没起作用。在Eclipse里的output窗口也没看到任何log,超郁闷。
没办法,又查了下如何查看日志。发现在android_sdk/tools目录有一个叫DDMS的程序。执行它,并且执行其中的logcat就能看到日志。于是终于看到了那个NPE的位置:在onCreate()方法中的confirm.setOnClickListener(o);这行。
接下来,在onCreate()方法里另外加了句log,当o为null的时候输出一句话;然后没看到输出。这才发现confirm是null……觉得超诡异,大家都是这么findViewById()来得到layout中指定的UI组件的引用,这里怎么会null了呢。
然后才发觉在M3到M5的变化的文档中有提到,原本在layout的XML文件里的id的属性,要改为使用前缀的android:id。于是把main.xml改过来,就好了
T T
更详细的API变化,看这里:http://code.google.com/android/migrating/m3-to-m5/changes.html
===========================================================================
关于模拟器总是disconnect的问题
语仔从Eclipse运行Android模拟器的时候总是会出现disconnected现象,非得多run几次才好。我也不知道是为什么。
不过后来发觉实在不行的话就干脆不要从Eclipse启动模拟器了……直接“热安装”就是
在Eclipse里把代码写好,保存了之后,这么做:
1. 任意启动一个Android模拟器进程,在“热安装”之前最好让它处于home状态
2. 在命令行,转到项目的/bin目录,然后用adb直接把程序装上去:
3. 程序已经“热安装”完成。可以从Android界面里的ALL那边运行新装的程序看看
装新的apk或者更新旧的apk都可以这样……至少,只要有一次能正常从Eclipse启动模拟器的话,就让它一直开着,然后不停把修改过的apk文件这么“热安装”上去就行了……
=_=|||
===========================================================================
关于log的问题
前天给语仔找NPE的原因时,傻乎乎的另外开了一个DDMS来监视logcat的日志。我应该更加信赖ADT的……
实际上在Eclipse装了ADT之后,在Windows > Preferences > Android > DDMS > Advanced里就可以设置监听log的等级。把等级设到Verbose就能看到全部的log了。我是用Log.v()来输出的,所以不调到这个等级就看不到之前写的那log。诶,果然还是应该多看看文档再说的。
===========================================================================
关于Notepad Tutorial
Google Android官网上有个不错的教程,Tutorial: A Notepad Application。跟着这个教程走就能了解到Android开发中的许多重要方面,像是Activity的使用(包括sub activity的使用),Intent的使用,SQLite的使用,使用XML的layout、resource、manifest,整个应用程序的流程/生命周期(life-cycle)等。我也跟着这个教程做了一遍,做到Notepad v3。下面这张是运行的截图:
关于life-cycle,这几个方法很重要:
当然这个地方说得更详细一些:Life Cycle of an Android Application
===========================================================================
关于卸载Android模拟器中已经安装了的程序
在启动了一个Android模拟器进程之后,在命令行使用adb来卸载已经安装的程序:(一定要启动至少一个模拟器实例)
这样就把前面装的Notepad v1和v2都卸载了。清爽。
===========================================================================
其它
不知道实际的Dalvik VM在手机上跑速度如何呢,在模拟器上感觉还可以。只是模拟器的启动时间总是很长……
不过在我的机上跑模拟器明显比在语仔机上要快。不知道是不是因为我这边没怎么装游戏的缘故……
呵呵,开发机与游戏机总是无法并存的,除非开发的就是游戏……|||
邵栋老师带了几个组是做Android应用程序开发的课题的。正好附近两个宿舍都有人是做这个课题的。语仔他们组想做的是一个*个人理财软件*,之前就在国内的一些Android开发论坛到处看啊找啊,在学习相关技术知识。不过前几天碰到了很奇怪的NullPointerException,问我怎么办。这样我也就又摸出Android来玩了。
正好3月3号Google更新了Android SDK到m5-rc15,而我之前用的SDK都不记得是m多少的了(m3?),干脆就连SDK和Eclipse+ADT都一并更新过来。
到Eclipse官网去看,现在的版本已经到3.3.2了。正好连机上的别的Eclipse也一起更新。先是下了Eclipse Classic 3.3.2,结果到安装ADT的时候出现require "org.eclipse.wst.sse.ui"的错误。很明显是要装WTP了。以前装过的老版本的ADT明明不需要的……
装WTP就得连什么GEF啊之类的一堆东西都分别装上。嫌麻烦,就重新下了个Eclipse IDE for Java Developers。然后安装ADT就没问题了。
顺带记下官网对于安装ADT插件的说明:
引用
To download and install the ADT plugin, follow the steps below.
[list]Start Eclipse, then select Help > Software Updates > Find and Install....
In the dialog that appears, select Search for new features to install and press Next.
Press New Remote Site.
In the resulting dialog box, enter a name for the remote site (e.g. Android Plugin) and enter this as its URL:
Press OK.You should now see the new site added to the search list (and checked). Press Finish.
In the subsequent Search Results dialog box, select the checkbox for Android Plugin > Developer Tools. This will check both features: "Android Developer Tools", and "Android Editors". The Android Editors feature is optional, but recommended. If you choose to install it, you need the WST plugin mentioned earlier in this page.
Now press Next.
Read the license agreement and then select Accept terms of the license agreement, if appropriate. Press Next.
Press Finish.
The ADT plugin is not signed; you can accept the installation anyway by pressing Install All.
Restart Eclipse.
After restart, update your Eclipse preferences to point to the SDK directory:
1. Select Window > Preferences... to open the Preferences panel. (Mac OS X: Eclipse > Preferences)
2. Select Android from the left panel.
3. For the SDK Location in the main panel, press Browse... and locate the SDK directory.
4. Press Apply, then OK.[/list]
[list]
https://dl-ssl.google.com/android/eclipse/
Press OK.
1. Select Window > Preferences... to open the Preferences panel. (Mac OS X: Eclipse > Preferences)
2. Select Android from the left panel.
3. For the SDK Location in the main panel, press Browse... and locate the SDK directory.
4. Press Apply, then OK.[/list]
===========================================================================
关于某NPE问题
OK,东西都装上了,开始解决问题。之前语仔遇到的NPE是基于这样的代码:
/src/com/my/MyActivity.java:
package com.my; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MyActivity extends Activity { private EditText edAdmin = null; private EditText edPassword = null; private Button confirm = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); edAdmin = (EditText) findViewById(R.id.Admin); edPassword = (EditText) findViewById(R.id.Password); confirm = (Button) findViewById(R.id.confirm); confirm.setOnClickListener(o); } private OnClickListener o = new OnClickListener() { public void onClick(View v) { //... } }; }
/res/layout/main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, MyProject" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Admin1" /> <EditText id="@+id/Admin" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Admin2" /> <EditText id="@+id/Password" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button id="@+id/confirm" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="confirm" /> </LinearLayout>
这代码看起来似乎没什么问题。我之前又没怎么看过Android的教程或者文档之类的东西,觉得不知道该从何入手。总之第一能想到的就是看看stack trace;但当在Android里遇到异常时,它就这么在屏幕上显示个简单的提示:
(这图是我另外开的一个project,故意引发了一个NPE而已……)
感觉好可怜,啥也看不出来。
然后查了下如何向输出写自定义的log,发现android.util.Log类可以做这件事。用Log.v(/*String*/tag, /*String*/message, /*Throwable*/obj)就能把日志写出来。这个静态的Log.v()方法用于输出VERBOSE级日志,其中包括了stack trace。输出的目标是logcat。
那么把前面的Java代码中onCreate()方法里的内容整个用try-block包起来,然后catch Exception并将异常状况写到log里。然后运行……没看到NPE了,但那个按钮里的代码却没起作用。在Eclipse里的output窗口也没看到任何log,超郁闷。
没办法,又查了下如何查看日志。发现在android_sdk/tools目录有一个叫DDMS的程序。执行它,并且执行其中的logcat就能看到日志。于是终于看到了那个NPE的位置:在onCreate()方法中的confirm.setOnClickListener(o);这行。
接下来,在onCreate()方法里另外加了句log,当o为null的时候输出一句话;然后没看到输出。这才发现confirm是null……觉得超诡异,大家都是这么findViewById()来得到layout中指定的UI组件的引用,这里怎么会null了呢。
然后才发觉在M3到M5的变化的文档中有提到,原本在layout的XML文件里的id的属性,要改为使用前缀的android:id。于是把main.xml改过来,就好了
T T
更详细的API变化,看这里:http://code.google.com/android/migrating/m3-to-m5/changes.html
===========================================================================
关于模拟器总是disconnect的问题
语仔从Eclipse运行Android模拟器的时候总是会出现disconnected现象,非得多run几次才好。我也不知道是为什么。
不过后来发觉实在不行的话就干脆不要从Eclipse启动模拟器了……直接“热安装”就是
在Eclipse里把代码写好,保存了之后,这么做:
1. 任意启动一个Android模拟器进程,在“热安装”之前最好让它处于home状态
2. 在命令行,转到项目的/bin目录,然后用adb直接把程序装上去:
adb install yourProject.apk
3. 程序已经“热安装”完成。可以从Android界面里的ALL那边运行新装的程序看看
装新的apk或者更新旧的apk都可以这样……至少,只要有一次能正常从Eclipse启动模拟器的话,就让它一直开着,然后不停把修改过的apk文件这么“热安装”上去就行了……
=_=|||
===========================================================================
关于log的问题
前天给语仔找NPE的原因时,傻乎乎的另外开了一个DDMS来监视logcat的日志。我应该更加信赖ADT的……
实际上在Eclipse装了ADT之后,在Windows > Preferences > Android > DDMS > Advanced里就可以设置监听log的等级。把等级设到Verbose就能看到全部的log了。我是用Log.v()来输出的,所以不调到这个等级就看不到之前写的那log。诶,果然还是应该多看看文档再说的。
===========================================================================
关于Notepad Tutorial
Google Android官网上有个不错的教程,Tutorial: A Notepad Application。跟着这个教程走就能了解到Android开发中的许多重要方面,像是Activity的使用(包括sub activity的使用),Intent的使用,SQLite的使用,使用XML的layout、resource、manifest,整个应用程序的流程/生命周期(life-cycle)等。我也跟着这个教程做了一遍,做到Notepad v3。下面这张是运行的截图:
关于life-cycle,这几个方法很重要:
// Called when the activity is first created. public void onCreate(Bundle icicle) // called by Android if the Activity is being stopped and may be killed before it is resumed! // complement of onCreate() protected void onFreeze(Bundle outState) // called when the Activity ends // should release any resources that can be released protected void onPause() // complement of onPause() protected void onResume()
当然这个地方说得更详细一些:Life Cycle of an Android Application
===========================================================================
关于卸载Android模拟器中已经安装了的程序
在启动了一个Android模拟器进程之后,在命令行使用adb来卸载已经安装的程序:(一定要启动至少一个模拟器实例)
D:\android\android-sdk_m5-rc15_windows\tools>adb shell # cd /data/app cd /data/app # ls ls Notepadv3.apk ApiDemos.apk Notepadv1.apk Notepadv2.apk # rm Notepadv1.apk rm Notepadv1.apk # rm Notepadv2.apk rm Notepadv2.apk # exit exit
这样就把前面装的Notepad v1和v2都卸载了。清爽。
===========================================================================
其它
不知道实际的Dalvik VM在手机上跑速度如何呢,在模拟器上感觉还可以。只是模拟器的启动时间总是很长……
不过在我的机上跑模拟器明显比在语仔机上要快。不知道是不是因为我这边没怎么装游戏的缘故……
呵呵,开发机与游戏机总是无法并存的,除非开发的就是游戏……|||
评论
4 楼
RednaxelaFX
2008-03-08
惭愧,一开始没想debug,一个是因为对Andriod SDK/ADT还不熟悉,另一个是很多时候看看log也就能解决问题了...
可能是被这样的习惯害的吧: 平时写Java应用的时候,如果不确定会出现些什么问题,可能会直接throws Exception,然后跑一下看看会不会出现异常,出现的话就直接会看到stack trace了;而有时候即使确定会出现些什么问题,还是可能会习惯性用e.printStackTrace()来看看stack trace.习惯了这样,而Android的模拟器里只给出那么句错误信息,就不习惯了...然后习惯性的想看看stack trace,就这样 ^ ^
可能是被这样的习惯害的吧: 平时写Java应用的时候,如果不确定会出现些什么问题,可能会直接throws Exception,然后跑一下看看会不会出现异常,出现的话就直接会看到stack trace了;而有时候即使确定会出现些什么问题,还是可能会习惯性用e.printStackTrace()来看看stack trace.习惯了这样,而Android的模拟器里只给出那么句错误信息,就不习惯了...然后习惯性的想看看stack trace,就这样 ^ ^
3 楼
mwjian
2008-03-08
呵呵,遇到问题干嘛不debug呢?直接就找到出错的位置。如果不能,模拟器也提供了一个工具来定位出错的代码,DevTools > Exception Browser
2 楼
seya
2008-03-05
那个模拟器效率真是底,慢的不行。
1 楼
seya
2008-03-05
有时候在启动模拟器的情况下,用adb devices命令,显示出的emulator-list却为空。
发表评论
-
Pro Android笔记
2010-01-16 15:50 0Pro Android, Chap 1, "Delv ... -
Dalvik的类装载与运行时结构
2009-04-10 11:02 0dalvik/libdex/DexClass.h /* exp ... -
Dalvik的指令集与其执行
2009-04-10 10:56 0Dalvik的指令集与其执行 Java .class文件中的 ... -
关于Dalvik的一些笔记
2009-03-31 02:36 0引用Dalvik The Android platf ... -
关于Google Android,第一印象
2007-11-16 12:38 2654Android - An Open Handset Allia ...
相关推荐
极力推荐初学安卓的入门上手程序!很简单,一看就懂。包括点击、触摸、以及快捷键动作的捕捉。希望作为Hellow word 以外你的第一个程序,玩的愉快!
基于Android opengles的魔方小游戏。在看见apidemo中自带的魔方例子后就一直想做一个可以触摸旋转的魔方,没事可以玩玩,于是在网上查找了大量的资料,根据自己的理解把魔方例子进行了改良,增加了贴图、触摸扭转、...
> Android 系统的触摸事件分发总是从父布局开始分发,从最顶层的子 View 开始处理,这种特性有时候会限制了我们一些很复杂的交互设计。 > > TouchEventBus 致力于解决非嵌套的滑动冲突,比如多个 在同一层级 的...
这是我自己做的一款在桌面显示的宠物小程序。 运行方式为安装之后双击打开应用。然后活灵活现的小狗就闪亮登场了。 点击小狗提示:我们来玩玩把, 移动小狗提示:别摸我 不关闭该应用的话切换到桌面小狗也会存在。
Pie Noon 是一个简单的游戏用于演示多个 Nexus 玩家和 Android TV 设备上同时玩的游戏。支持最多 4 个玩家通过蓝牙控制器和触摸设备玩游戏。该游戏使用 FlatBuffers 用于数据序列化,使用 WebP 用于图像压缩和用于...
支持嵌套滑动,完整实现了NestedScrollingChild2,NestedScrollingParent2 接口,玩转CoordinatorLayout. 直接继承自ViewGroup,拥有卓越的性能,支持类FameLayout的特性(Gravity、Margin). 支持自动刷新、自动上拉加载...
QtScrcpy 可以通过 USB / 网络连接Android设备,并进行显示和控制。无需root权限。 同时支持 GNU/Linux ,Windows 和 MacOS 三大主流桌面平台。 它专注于: 精致 (仅显示设备屏幕) 性能 (30~60fps) 质量 (1920×1080...
类似于windows7那个球球屏保一样的一个android屏保,但是只有一个小球,不论你在什么应用下,小球都会在屏幕上跑,但是你的触摸响应并不会被小球接收,挺好玩的一个应用,大家玩玩吧
最近在玩3g体育门户客户端的时候,看到这样个效果: 轻触赛事图标,会有一个图标变大浮出的效果.,蛮有意思的.于是就把仿照它做了一个. 这个是原图: 实际上是给图标的触摸事件中添加了一个缩放的动画,代码如下....
在游戏中有暂停功能,开启暂停后可以继续、返回主页面、重玩三大功能。游戏过程中具有白天到黑夜的渐变过程。当小暴龙的生命值为0时,游戏结束,会弹出一个dialog提示你是否记录本次成绩,可以将你的成绩写入数据库...
锁定手机界面,使无法正常操作,让您暂时离开手机,而专注于眼下比玩手机更重要的事。 本应用是作者系统研究安卓的 Window 的阶段性总结 使用须知 本应用通过一点并不复杂的技术实现锁定手机主屏幕,使主屏幕区域...
但与 Android Beam 不同的是,NfcSocket 允许设备在无需用户干预的情况下自动通信。 NfcSocket 还允许开发人员在 HCE 服务和他们自己的类中处理传入消息。 主要特点 以简单的方式玩 Nfc 通信。 无需用户触摸的多轮...
疯狂android讲义7.2中有个pinball游戏,需要手机支持实体按键控制左右才能玩,看到这里想把游戏改成触摸控制。
免触式飞扬的小鸟这是使用 python 语言编写的著名 android 飞扬小鸟应用程序的无触摸克隆。 它可以让您在不使用任何硬件(如键盘、鼠标等)或使用任何触摸动作的情况下移动蓬松的小鸟。 该应用程序是使用图像处理...
启用后,您可以使用键盘和鼠标作为PC版本玩游戏。 或者您可以使用向上/向下/向左/向右方向键来模拟向上/向下/向左/向右滑动。 您还可以根据为其他游戏编写自己的映射文件。 默认的键映射如下: 这是添加新的自定义...
java源码屏幕刷新安卓 突围 v1.0.2 (这以前托管在 上。) 这是经典破砖游戏的 Android 实现。 这主要用作示例代码,提供...该游戏在平板电脑上运行良好,但由于显示屏尺寸较小,在手机上很难玩。 有关代码的一些信息可
大部分Android手游能够在Android系统的电视终端上运行,其中有少数手游是原生支持手柄(例如MOGA手柄),这部分游戏可以作为电视游戏。但其他手游(射击,赛车,动作等游戏)若要在电视上玩,就需要修改操控模式,把...
BlueStacks 可以让你在Windows系统下玩各种Android 的APP应用,相比Google 官方提供的Android SDK 开发用的模拟器,BlueStack 对非程序员的普通用户来说显得更加简单易用。如果你没有安卓手机,可以比以前更轻易地...
QtScrcpy QtScrcpy通过USB(或通过TCP / IP)... 启用后,您可以使用键盘和鼠标作为PC版本玩游戏。 或者您可以使用向上/向下/向左/向右方向键来模拟向上/向下/向左/向右滑动。 您还可以根据为其他游戏编写自己的映射