我创建了一个关于libsvm库+Android的开源项目 Libsvm-androidjni. 这个项目的目的是让当今最流行的SVM支持向量机机器学习库Libsvm被移植到Android平台中。当然官方提供了Java库,但用Java来进行大规模的SVM计算还是太低效了,所以这个项目是要把c/c++版本的库移植到JNI环境下。 目前的code状态是svm的training和prediction功能皆可正常运行。具体的使用方式请参考README。虽然是c++环境,但主体code还是c的风格,这和我个人喜好有关,不影响使用。 目前还有一些高级功能不完善,比如完整的参数传递和误差计算。 项目代码请到https://github.com/cnbuff410/Libsvm-androidjni下载。
Posts tagged android
Hackborn的吐槽和Munn的剖析: Android graphics低性能背后的真像
Google+上有意思的讨论从未间断,几乎已是Google+的标志性特色了。最近两天,移动领域的爱好者都被Dianne Hackborn的一则吐槽所吸引。吐槽要火,两大因素不可缺少,一是该话题乃众人关注,却无统一意见。二是吐槽中有大料或者干货爆出,引人入胜。此番吐槽吸引人的地方,正是因为此吐槽是关于饱受争议的Android graphics性能的,自从Android推出的第一天起,graphics的渲染,动画切换等就为人诟病,到后来几乎成了果粉安粉大战的必备话题。而吐槽之人呢?是Android团队中比较senior的架构工程师Dianne Hackborn,相信关注Android开发的朋友,都不会对此女陌生。 为什么Dianne Hackborn身为Android内部人士,会突然公开讨论如此敏感的一个话题呢?用她自己的话说,就是“受够了外界谣传的关于Android图形渲染的不实信息”。我把她吐槽的大概重点归纳如下:
谈谈Android 4.0
昨天刚拿到Galaxy Nexus,把玩了差不多一天了。这篇文章并不想花大篇幅介绍这款机器的硬件和软件,如果你好奇,可以看一下下面这些知名网站的评测,再详细不过了 Engadget The Verge: 8.6/10(和iPhone4s同分) SlashGear Boy Genius Report TechRadar PhoneArena: 9.5/10 GigaOM:一个iPhone用户的评测 Gizmodo GigaOM 如果真要总结,那只有一句话,这是Android有史以来第一款能和苹果手机并肩的机器。这篇文章里,我就谈谈,在我眼里,Android的后续发展,和ICS的意义,当然都是结合了我在Google4个月的所见所闻以及感想。很多朋友希望看到我有一篇专门的实习总结,我想了想还是算了,首先我实习做的东西比较保密,没法说,其次也没什么写的,Google工作环境好,条件好,牛人多,大家都知道,没必要再吹一次。
如何对Android的本地代码进行profiling
现在用Android native code写程序库的人越来越多。对于那些需要写的库实时性要求特别强的应用,通过profiling来进行优化是一个非常有用的特性,因为它能帮你理解程序编译后的本质,比如多少instruction,哪些method调用多少次,多长时间,等等。 Android开发环境提供了Traceview这样一个工具,可以点到这个链接里面去看官方对他的介绍。总的来说,就是它提供给程序开发者目标程序的执行日志,以此帮助你调试程序和优化性能。有两种方法能够声称traceview所需的log,一种是利用DDMS的profiling特性,通过控制什么时候开始和结束logging来获得log。这个方法在你没有程序源代码的时候有用,因为只需要Run程序就能获得log信息,但是没有精准的起始中止控制。另一种是通过将Android自带的Debug类加到code中,然后调用里面的method来开始和中止trace信息的纪录。这个方法能让开发者非常精准地控制什么时候开始纪录,什么时候结束纪录,因为开始和技术都是在code中执行的。
Android Native 代码NDK开发学习笔记
本文提供排版更佳的PDF版本下载。 JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁。代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用Java代码。这样,编程人员可以将低阶的代码逻辑包装到高阶的程序框架中,获得高性能高效率的同时保证了代码框架的高抽象性。 在Android中,仅有以下类库是允许在JNI中使用的: libc (C library) headers libm (math library) headers JNI interface headers libz (Zlib compression) headers liblog (Android logging) header OpenGL ES 1.1 (3D graphics library) headers (since 1.6) A Minimal set of headers for C++ support JNI本身仅仅是一个把两者融合的工具,作为编程者需要做的,就是在Java代码和Native代码中按照固定的格式告诉JNI如何调用对方。在Android中,有两种方式可以调用JNI,一种是Google release的专门针对Android Native开发的工具包,叫做NDK。去Android网站上下载该工具包后,就可以通过阅读里面的文档来setup一个新的包含Native代码的工程,创建自己的Android.mk文件,编译等等;另一种是完整的源码编译环境 ,也就是通过git从官方网站获取完全的Android源代码平台。这个平台中提供有基于make的编译系统。更多细节请参考这里。不管选择以上两种方法的哪一个,都必须编写自己的Android.mk文件,有关该文件的编写请参考相关文档。 下面通过一个简单的使用例子来讲解JNI。Android给C和C++提供的是两套不同的Native API,本文仅以C++举例说明。假设这么一个需求,Java代码需要打印一个字符串,而该字符串需要Native代码计算生成。对应的JNI流程是这样的:
聊聊电脑性能测试的演变–看Android评测有感
这两年,Android的浪潮是一波接着一波,导致的现象就是每隔三五天就有新的手机出来。HTC,MOTO,三星,LG,你不一个月推一款,出门都不好意思和别人打招呼。各个评测网站也就甩开膀子搞评测,出来一款跑一款分,简直有点病态的趋势。各种各样的评测软件也层出不穷,基于Pi的,基于Linpack的,等等等等。对于消费者来说,这可就难办了,乱花渐欲迷人眼,这么多款,选谁好呢?今天看这里用x软件评测说a>b>c>d,明天就在那里看用y标准评测说a<b<c<d。该信谁呢。 如果想要从这些林林总总的测试中跳出来,搞清楚到底它们测试的是什么性能,就要理解这些测试到底都干了些什么,这些分数背后的本质是什么。实际上,不管是电脑也好,手机也好,这些跑分测试,本质上都是选择某一种workload,然后让机器去执行,然后通过某些执行后得到的结果,比如耗费的时间,总共执行的指令等,转换成分数。所以,workload是所有测试的本质决定者。
Android上Tcpdump的使用
前几天在看如何在Android上实时抓到ap的beacon的RSSI信息,而不是通过调用wifiscan的方式,所以研究了一下tcpdump在Android上的使用。可惜最后发现不可用,不过在这里,还是把过程记录下来,拱别人参考。说明一下,这个方法只适用于破解了的ROM。 要使用tcpdump,首先当然是下载可在Android上运行的二进制执行文件,下载地址包括这里和这里。你要是蛋疼想自己交叉编译一个呢,那就参考这个文章吧。 之后的事情就简单了 adb push ./tcpdump-arm ./any-place-you-want chmod 777 tcpdump-arm
Samsung Galaxy S上手感受
先说一下配置 4 inch capacitive Super AMOLED Display 1GHz Hummingbird processor 1500mAh lithium ion battery 5MP camera with 720p video recording 2GB microSD card preloaded 在最新一代Android手机中做出选择时,由于EVO和DroidX都缺少移动计算研究中一个杀手级的部件:陀螺仪,所以,硬件配置不相上下的Sumsang Galaxy S就成了我的唯一选择。我是从Tmobile买的Sumsang Vibrant,实际上和原版Galaxy S是一模一样的,区别就是多了一坨我用不着的程序。 直入主题吧,先来一张包装照
Gingerbread,向左走还是向右走?
今天网上广为流传的消息,是来自TechCrunch的,Android团队正在努力解决用户体验的问题。伴随而来的,是Google正在考虑停止厂商自定义UI的权利,包括Sense UI、Moto Blur、Ninja Blur等等,原因是Google认为这些界面实际上是拖慢了系统速度,却没有带来什么实质性好处,还给升级平添一道障碍。如果消息属实的话,Android还说Gingerbread的用户体验能接近iPhone。 刚读到这个消息时,我的第一感觉是,这是一个代表Android发展分叉口的版本,成败,可能就在此一役,而且,一旦消息属实,Android是在进行一个大的赌博。
Android机器人T-shirt情侣衫照
个人觉得很好看,颜色搭配不错,夏天穿也给人清爽的感觉:)
Android并不伟大,但丝毫不令人沮丧
自从Google IO大会之后,Android单挑iPhone OS的新闻甚嚣尘上。人们开始真正对这场所谓的战争感兴趣,并不厌其烦一次又一次地去将所有的细节放在放大镜下分析。昨天在twitter上看到朋友分享的cnbeta的一篇文章—为什么说Android令人沮丧,看完之后的感想就是,很多观点实在无法认同,并且,文章中充满了自己的想象,然后把自己的想象以事实的口吻说出。举两个例子。该文说 Google控制社区的核心手法就是频繁升级Android的同时少量修改API,造成兼容性问题。 我不明白没有API的升级的话,一个新系统如何保证竞争力。Android目前的发展阶段决定了每一次major update都必然伴随API的改动,原作者却想当然认为这是Google控制社区的核心手法,是Google为了“故意造成兼容性”的手段。我们国家的人民现在对什么事情估计都能联想到“阴谋论”了。 当年Windows Mobile就是死在三方ROM之上,Android不过是在重复Windows Mobile的老路。 我不知道作者有什么证据说当年Windows Mobile就是死在三方ROM之上的,难道他统计过Windows Mobile用户自己刷ROM的比例?实际上,这个衰落的原因主要在于下面几点 Windows Mobile可靠性差,可用性差,反应奇慢,用户体验差得发指。 Windows Mobile的一些常用软件很难让人满意,比如以前的IE。 Windows Mobile的创新太少太慢。这个是关键点。Windows Mobile早期手机很贵,面向的是比较小众的高端市场,又没有好的系统表现,不过由于MS的影响力和推广,总算还是有不错的份额。iPhone和Android崛起的时候,微软没有想过问题的严峻性,继续不紧不慢躺在老版本上做小改动,而且release一个几乎没啥创新的新版本都要按年来计。随着iPhone和Android就像赛跑一样发布一个个重量级的新版本系统时,微软开始着手这些问题的改进了,可惜的是,iPhone和Android已经吸引走了大批开发者,而且从系统本身性能和特性来讲,Windows Mobile再也不占任何优势。 所以,Windows Mobile之衰败,主要是自己系统的原因,归咎于第三方ROM实在不公平。事实上,除了Geek和有不浅的电脑知识的人,大部分普通用户在购买手机之后都不会去刷ROM。 回到正题。这里,我展开谈谈,为什么Android不仅不令人沮丧,反而可以算是表现优异。
目前最好的Android2.1 ROM之一 for Hero
http://forum.xda-developers.com/showthread.php?t=622468 推荐一下,这个ROM我用了一段时间了,没啥大问题才写这个post推荐。Sense UI,2.1ROM,基本功能都有,用着很流畅,一点都不慢。缺点在上面连接中也有讨论,基本都是我用不上的功能,所以不care。 要刷机的朋友最好把radio镜像升级到6.35.09.26。做好备份。步骤其参考我之前的文章。 BTW: 如果这个网址国内被wall了,或者下载的网址被wall了,留言说一声,我可以把这个ROM上传到我的空间。
彩色的Android debugging logcat term
Andorid的logcat通常都会输出无数多的信息,至少对于我来说,经常把眼睛看花。Jeff Sharkey针对此写了一个python脚本,专门负责整理logcat的输出流并给不同的tag信息加上对应的颜色。如图 怎么用呢?很简单,或者直接执行 $ ~/coloredlogcat.py 或者用管道 $ adb logcat | ~/coloredlogcat.py 这个脚本需要你的terminal是 ANSI-compatible的。脚本在此下载: 下载1 下载2 下载完后自己改后缀
Android 2.0上使用蓝牙通信的代码片断
服务器端: UUID uuid = uuid.fromString(“27648B4D-D854-5674-FA60E4F535E44AF7″); //generate your own UUID at http://www.uuidgenerator.com BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); BluetoothServerSocket serverSocket = adapter.listenUsingRfcommWithServiceRecord(“MyBluetoothApp”, uuid); BluetoothSocket socket = serverSocket.accept(); // blocks until a connection is accepted serverSocket.close(); // close the listening socket – does not close the connected client socket
如何切换Hero的Sense UI和普通UI
进入设置–程序–管理程序 界面 找到HTC Sense或者Touch FLO程序。不同的机器名字可能不一样,反正肯定是这两个中的一个。然后点击进去 按下Clear Defaults(取消默认)按钮 按下HOME按钮。此时机器应该会出线让你选择Home界面的对话框。你可以继续选Sense,也可以选Android默认界面。 如果想返回,把刚才的设置反着做一遍就行了。Android默认的Home界面也可以在程序管理中找到 即使你选择Android界面,你只是享受不到Sense的Widget而已,速度不会提高很多,因为新版的ROM已经极大提升了Sense的速度。不过考虑到有些朋友就是喜欢折腾,或者有些人有不同审美观,所以写下来供参考。 我是在这个网站上看到的,并且自己试验成功