Android Framework
文章平均质量分 61
a345017062
这个作者很懒,什么都没留下…
展开
-
NDK的研究总结
由于公司最近要搞跨平台,而平台的核心是用C++,所以着实研究了两个月的NDK和JNI。经过资料的阅读和兄弟几个的测试,总结了几个结论,可能对想在项目当中使用NDK的有所帮助:第一、调用效率方面的测试结构。我们测完以后,NDK环境下的JNI和SUN的官方文档中说的差不多: 1、Java调用C/C++。单纯函数调用花费的时间上面,和Java之间的调用相差无几。 2、C/C++调用Java。是Java调用C/C++花费时间的10~20倍。第二、适用范围。NDK的官方文档中说过的,原创 2010-09-12 16:29:00 · 2786 阅读 · 4 评论 -
ADB和DDMS简介
源文地址:http://blog.csdn.net/zysee/archive/2010/08/05/5791270.aspxADB是一个CS结构的程序,由三部分组成。通过它们,可以管理Android设备的状态。1、Client端Client端运行在PC上,可以由ADT插件、DDMS、Shell命令等方式调用。2、Daemon端(ADBD)作为后台进程运行在Android设备上。ADBD通过jdwp与VMDebugger交互获取VM中的调试信息。2、Server端作为后台进程运行在PC上,它负责Clie翻译 2011-03-10 09:11:00 · 10878 阅读 · 0 评论 -
/system/core/init/readme.txt对init.rc的解释
init.rc由许多的Action和Service组成。每一个语句占据一行,并且各个关键字被空格分开。c规范中的(如 /n)反斜杠将被忽略(backslash escapes)而被认为是一个空格 ,双引号用来保证空格不会把一个文字串分分为多个关键字。行最后的反斜杠用作续行。由 # (前面允许有空格)开始的行都是注释行(comment)一个actions 或 services 的开始隐含声明了一个新的段,所有commands 或 options 属于最近的声明。在第一个段之前的 commands 或 opti翻译 2011-03-11 09:30:00 · 8302 阅读 · 0 评论 -
Android自带的toolbox分析及扩展
折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心。看一下怎么把渺小的toolbox替换成伟大的busybox吧。先大致描述一下Android系统中的shell程序部分。shell实现分为两部分:一、shell解释器和内置命令源码位于system/core/sh目录下,主要完成shell命令的解释查找,对于builtins.c中包含的内置命令,直接执行,对于toolbox的扩展命令,间接调用toolbox程序完成。二、toolbox扩展命令主要完成扩展命令的执行,原创 2011-03-15 14:04:00 · 26045 阅读 · 1 评论 -
关于adbd进程的ROOT权限问题
<br /><br />adbd源码位于system/core/adb/目录下,可执行文件位于/sbin/adbd。通过adb执行ps命令,结果如下:<br />USER PID PPID VSIZE RSS WCHAN PC NAME<br />root 1 0 296 212 c00b0124 0000d9ec S /init<br />... ...<br />shell 2183 1 3372 1原创 2011-03-16 18:56:00 · 39313 阅读 · 2 评论 -
Android的framework层是如何对铃声的音量进行调整的
android.media.AudioManager中包含了对android.media.AudioService的跨进程AIDL调用封装。因此,调整音量是通过AudioManager间接调用AudioService.adjustStreamVolume方法完成。音量调整分为两步:先查看模式(Ring mode)是否需要调整,如果不需要调整模式,当前模式一定是正常模式(Normal mode),那就需要调整音量。调整模式通过调用checkForRingerModeChange(oldIndex, direc原创 2011-04-11 17:15:00 · 5341 阅读 · 0 评论 -
Android的fastboot协议
<br /><br />fastboot协议是PC通过USB与手机上的bootloader通信的协议。适用于Linux,Windows,OSX等平台。<br /> <br />基本配置要求:<br />1、USB连接PC与手机。<br />2、对于high-speec USB,包的最大尺寸必须是512byte.对于full-speed USB,包的最大尺寸必须是64byte。<br />3、协议由PC端驱动。<br /> <br />协议传输过程如下:<br />1、PC向手机发送一个命令,命令由ASCII翻译 2011-04-13 11:24:00 · 10991 阅读 · 1 评论 -
Android中,SD卡上的媒体文件(图片、视频)的改变与通知
<br /><br />MediaProvider相当于一个数据中心,SD卡上所有的数据在这里都有记录,而Gallery的什用就是展示和操作这个数据中心,每次用户启动Gallery时,Gallery只是读取MediaProvider里面的记录并显示用户。如果用户在Gallery里删除一个媒体时,Gallery通过调用MediaProvider开放的接口来实现。<br />MediaProvider和Gallery的大致关系就是这样的了。我现在碰到的问题要解决的话,必须要搞清楚一件事才能继续往下走:<br /原创 2011-04-13 19:39:00 · 12640 阅读 · 0 评论 -
打开Android系统中的JNI调试
VM启动时需要一些启动参数,包含标准参数和非标准参数。这里涉及到两个标准参数:-Xcheck:jni和-verbose:jni。这两个参数都设置的话,JNI调用路径就可以由dalvikvm打印出来,并通过logcat看到。可以在下面这个文件中控制是否为VM添加这两个启动参数。/frameworks/base/core/jni/AndroidRuntime.cpp先看一下第一个代码片段property_get("dalvik.vm.checkjni", propBuf, ""); if (strcmp(原创 2011-04-28 14:29:00 · 12550 阅读 · 2 评论 -
Android2.3中Webkit引擎导致VM崩溃的问题
Android2.2,2.3,2.3.3都存在的一个bug,在这里有详细的描述。http://code.google.com/p/android/issues/detail?id=12987其中,楼主的代码可以下来运行一下,我在2.2和2.3模拟器和2.3的真机上都存在这个问题。问题的核心在于这样一句话:JNI WARNING: jarray 0x4074f6e0 points to non-array object (Ljava/lang/String;)也就是进行JNI调用时,把一个Java中的Stri原创 2011-05-04 18:40:00 · 11363 阅读 · 24 评论 -
Android JIT带来的虚拟机崩溃问题及解决方案
Android自从2.2开始加入了JIT技术,号称速度提高了3~5倍。不过JIT的稳定性有待考证。。。看一下这个issue:http://code.google.com/p/android/issues/detail?id=9281我的系统是2.3的,我把楼主的代码放在模拟器和板子上运行时候,倒是都好着呢。但我自己从网上下载的一个含有3D调用的APK,运行时VM崩溃了。这是我的板上报出的系统LOGI/DEBUG ( 71): signal 7 (SIGBUS), code 128 (?), faul原创 2011-05-05 16:56:00 · 15623 阅读 · 0 评论 -
在Android源码的JavaScriptCore引擎中添加LOG
<br /><br />在源码中添加LOG的话,使用下面的两种方式<br /><cutils/log.h>或<br /><utils/Log.h><br />using namespace android;<br />然后再Android.mk中添加liblog就可以了。<br /> <br />在调试Webkit中的JavaScriptCore时,发现有些.cpp文件使用上面这两种方式时,编译可以通过,但LOGW等方法打印不出来。<br /> <br />搜索了一下,发现一篇文章提到了另外的方法,稍做更改原创 2011-05-04 18:55:00 · 4922 阅读 · 0 评论 -
Android调试.so库常用工具
readelf显示目标ELF文件的信息,比如信赖库,头信息,段信息等。addr2line用户进程崩溃时内核会记录一些基本的调试信息,如果进程执行的ELF文件包含调试符号,就可以通过addr2line找到源文件中哪一行出问题。我在调试Android的VM崩溃问题时使用到了这个工具(详细过程参考这里http://blog.csdn.net/a345017062/archive/2011/05/04/6394864.aspx)nm列出目标文件的符号清单,当没有输入文件名时,默认为a.out。size显示一个目标文原创 2011-05-05 18:12:00 · 6066 阅读 · 1 评论 -
关于使用SurfaceFligner进行绘图的具体实现方法
SurfaceFligner是Android画形化的核心,网上有几篇关于这个C/S系统的分析,着实不错,我在文章最后的参考文章中都列出来了,大家可以先看一下那些文章从原理上对SurfaceFlinger系统的分析再看我这篇文章。我这篇文章偏重于具体代码上的实现,最后汇总成一个小的应用程序来演示如何与SurfaceFlinger交互,例子中使用的2D图形引擎。使用的SurfaceFlinger系统可以分为这么几步:建立连接、创建Surface、取得Canvas、绘制、提交Canvas。下面来具体分析一下1、建原创 2011-05-09 13:08:00 · 6283 阅读 · 2 评论 -
Android兼容性测试框架(CTS)手册
本文翻译自Android官方的CTS手册android-cts-manual-r4.pdfAndroid兼容性测试框架手册1、为什么需要兼容性测试(以下称CTS)?1.1、让APP提供更好的用户体验。用户可以选择更多的适合自己设备的APP。让APP更稳定。1.2、让开发者设计更高质量的APP。1.3、通过CTS的设备可以运行Androidmarket。另外,CTS是免费的,而且很简单。2、怎么样才能让我的设备变成兼容的。2.1、与AndroidCompatibility Definition文档(以翻译 2011-05-10 13:05:00 · 19060 阅读 · 8 评论 -
CTS概述
<br /><br />看了几天CTS相关的东西,翻译了两篇文档,终于把这一块儿搞明白了,顺便记录一下。<br />众所周知,Android版本分化严重,各个厂商各做各的,硬件标准乱七八糟。为了让开发者的程序运行在更多设备上,也为了让用户有更多可选的APP,也为了给厂商一个生产规范,这才有了CTS一说。只有过了CTS的设备才算是Android兼容设备,才能使用Android Market。<br />让你的设备做到Android兼容的话,需要做四步:<br />1、获取Android系统的源码,移植到你的硬原创 2011-05-12 09:43:00 · 3209 阅读 · 0 评论 -
Android源码的层次结构分析
<br /><br />bionic,整个系统的基础类库,Android系统就是基于这个类库开发的,<br /> <br />system,Android系统类库,基于bionic类库开发,包含工具类库(libcutils),LOG类库(liblog),压缩类库(libzipfile)类。<br />主要功能有:<br />一、完成Android初始化(init)。<br />解析init.rc并开启系统初始化时需要加载的程序(parser.c),初始化设备(devices.c),开启属性服务(proper原创 2011-03-11 15:58:00 · 4357 阅读 · 0 评论 -
Android权限之二packages.xml解析
<br /><br />/data/system/packages.xml这个文件由PackageManagerService.java生成,里面记录了系统当中安装的APK的所有属性,权限等信息。当系统中的APK安装、删除、升级时,文件就会被更新。<br /> <br /><permissions>标签定义了目前系统中定义的所有权限。主要分为两类:系统定义的(package属性为android)和APK定义的(package属性为APK的包名)。<br /> <br /><package>代表一个APK的属原创 2011-03-10 09:08:00 · 20637 阅读 · 2 评论 -
Android权限之一APK对文件的访问控制
/data目录权限:drwxrwx--x system system 2011-01-03 23:41 data这种情况下,用ES Explorer查看/data时,目录为空。File("/data")对象的canRead/canWrite方法测试,不可读不可写文件存在。说明默认情况下APK的gid中没有system。/system目录权限:drwxr-xr-x root root 2011-03-05 19:23 system这种情况下,ES E原创 2011-03-08 21:42:00 · 6017 阅读 · 1 评论 -
apk调用so库的问题
为了方便说话,先来几个定义。用户自己手动安装的程序,称为第三方程序。编译系统时,源码放在packages下面生成的程序,称为系统程序。/system/lib/下的so库称为系统库/data/data/包名/lib/下的so库称为第三方库系统程序只能调用系统库,即使在编译时packages下面的源码中放入jni代码,也不会编译生成so库。观察了一下packages/apps/下面内置程序,发现只有res/,src/,Android.mk,AndroidManifest.原创 2010-11-10 15:14:00 · 9874 阅读 · 2 评论 -
内置程序升级
/system/app/下面内置了程序A,如果用户手动安装一个新的版本号时,apk会被安装在/data/app下,同时新版本的数据会覆盖老版本。但/system/app/下面的老版本程序不会被覆盖。原创 2010-11-10 16:57:00 · 2516 阅读 · 0 评论 -
Activity生命周期与状态保存
看API的时候,零零散散的记录下来的,看完了总算对Activity的生命周期有了一个全面的了解。相信会对大家有些帮助的。onCreate->onRestart->onStart->onResume->onPause->onStop->onDestroy正常启动一个ActivityonCreate->onStart->onResume弹出系统对话框,程序仍部分可见onPause对话框消失时onResume调用一个新的Activity,老的Activity不可见时onPause->onStop从新的Activi原创 2010-11-25 11:23:00 · 5966 阅读 · 1 评论 -
Android Wifi简单的梳理
WifiConfiguration:代表一个已经配置过的网络。包含网络ID(networkId)、该网络ID代表的网络的BSSID和SSID、加密机制、密码等信息。WifiInfo:代表一个正在建立或者已经建立的网络连接。该网络的BSSID、IP地址、连接速度(以Mbps为单位)、Mac地址等。ScanResult:代表一个扫描结果。描述该接入点的BBSID、SSID、认证机制、密钥管理机制、加密协议、信道频率(以为MHz单位)、信号水平等。DhcpInfo:设置是以动态IP的方式与AP连接时,负责描述网络原创 2010-11-29 17:33:00 · 2807 阅读 · 1 评论 -
关于动态桌面
<br /><br />其实很简单,通过这个文件就可以看到设置动态桌面背景的整个流程:<br />/packages/LivePicker/src/com/android/wallpaper/livepicker/LiveWallpaperPreview.java<br /> <br />这个类通过调用PackageManager.queryIntentServices获取系统当中已经安装的动态墙纸的列表。<br />其实,每一个动态墙纸就是一个WallpaperService,当用户点击其中某一项时,就会原创 2011-01-04 09:17:00 · 2989 阅读 · 0 评论 -
VideoPlayer从休眠状态返回时不再继续播放的问题
<br /> <br />系统自带的VideoPlayer正在全屏播放时,这时闹钟响,或者按下电源键让设备休眠,当返回到播放界面时,VideoPlayer会黑屏,不会继续播放。<br /> <br />原因分析:VideoPlayer的实现类MovieView中,只实现了onPause方法,并在onPause中调用了mControl.onPause()。当返回到播放程序时,系统调用onResume方法,但VideoPlayer并没有实现这个方法。<br /> <br />解决方案:<br />1、在Movi原创 2011-01-04 09:20:00 · 4234 阅读 · 0 评论 -
WebView输入框实现机制带来的bug
<br />http://code.google.com/p/android/issues/detail?id=5596<br />这里提出了一个问题,并在18楼有人给出了解决方案。是在Android2.0/2.1两个平台上出现的framework层的BUG。如果一个应用程序嵌入了WebView,那么用户使用这个程序打开一个Web页面输入密码时,密码的上半部分显示不出来。而输入普通的文本输入框和浏览器页面中的文本和密码输入框都不存在这样的问题。现在这个链接已经打不开了,大家可以打开手机内置浏览器,打开人人网原创 2011-01-04 20:18:00 · 5663 阅读 · 0 评论 -
如何修改Android系统内置的桌面图标
<br /><br />/packages/apps/Launcher/res/xml/default_workspace.xml中记录了系统初始化或者恢复出厂设置时桌面上图标的排列。Launcher程序第一次运行完毕以后,会在/data/data/com.android.launcher/databases/launcher.db中创建记录,里面有所有当前的桌面图标。以后每次启动只会从这里读取桌面图标。<br /> <br />下面简单分析一下default_workspace.xml:<br />def原创 2011-01-05 19:55:00 · 24699 阅读 · 2 评论 -
Android输入法框的梳理
<br /><br />/frameworks/base/services/java/InputMethodManagerService.java<br />这是整个系统当中,一切与输入法有关的地方的总控制中心。它通过管理下面三个模块来实现系统的输入法框架。<br />1、/frameworks/base/services/java/WindowManagerService<br />负责显示输入法,接收用户事件。<br />2、/frameworks/base/core/java/android.inpu原创 2011-01-06 20:41:00 · 26298 阅读 · 42 评论 -
LatinIME输入法分析
<br /><br />输入法的设置在res/xml/method.xml的<input-method>标签中,主要设置两个属性:<br />android:settingsActivity,输入法的设置程序入口。<br />android:isDefault,这个输入法是不是系统的默认输入法。<br /> <br />另外,如果输入法的apk直接push到/system/app/下面的话,算是系统输入法,如果是以第三方程序的方式安装到/data/app/下面的话,算是第三方输入法,两个输入法目前来看,最大原创 2011-01-12 08:49:00 · 19868 阅读 · 7 评论 -
Android.mk文件分析
<br /><br />从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解。了解了标准的Makefile后,发现Android.mk其实是把真正的Makefile包装起来,做成了一个对使用者来说很简单的东西。使用它来编译程序时,不管是动态库、可执行的二进制文件,还是Jar库、APK包,只要沿着一个简单的思路来做三大步就可以了:清除旧变量,设置新变量,调用编译函数。<br /> <br />明白了以后,发现Makefile语法不是问题,有很多教程和高手。编译模块原创 2011-01-12 08:50:00 · 30564 阅读 · 6 评论 -
battery信息的获取
<br /><br />这里一位仁兄写的文章,讲得比较透。<br />http://blog.sina.com.cn/s/blog_66a6a5ec0100n6ej.html<br /> <br />我这里就关注怎么去获取几个核心信息:电量、电压、温度等。<br />先看一下/frameworks/base/services/jni/com_android_server_BatteryService.cpp的register_android_server_BatteryService方法。可以看到,每个信息原创 2011-01-25 15:13:00 · 3050 阅读 · 0 评论 -
Binder框架在Framework层的C++中的使用
<br /><br />关于Binder在C++层的使用,搜过几篇文章,讲得比较多,也比较复杂,除非是想对OpenBinder这个开源项目深入研究,否则的话,用不了那么多的知识。我因为需要移植Android调些Framework层的Bug,一般跟踪程序时只要能找到谁调用的谁就可以了。接触过这部分一段时间后,就整理出了Android中在Framework层的C++中使用Binder时的框架。很简单,借此可以很容易理清Framework部分代码的结构而不必深入研究OpenBinder实现机制,就把它记录下来了。原创 2011-02-09 14:29:00 · 4144 阅读 · 2 评论 -
修改Android的开机画面
<br /><br />Android系统开机显示画面分成两个过程,第一个过程从按电源键到Frameworks启动为止。第二个过程从Frameworks启动完成到Launcher程序启动完成。<br />第一个过程显示的画面是一张图,第二个过程显示的是一个动画。分别简要记录一下怎么样在源码中修改这两个地方。<br /> <br />第一个过程的修改比较简单,找到/system/core/init/init.h中的宏定义:<br />#define INIT_IMAGE_FILE"/initlogo.rle"原创 2011-03-04 12:38:00 · 12050 阅读 · 2 评论 -
Android应用程序中用Java创建本地进程来执行C/C++程序
<br /><br />大致分为五步:创建环境、建立连接、发送数据、读取结果、释放资源。<br />下面我们以打开一个shell进程,在进程中执行pwd命令,然后退出为例,来看一下整个过程。<br /> <br />1、创建环境<br />主要有两个:执行程序和当前目录。这个和在命令行下执行一个普通的Linux程序一样,先有一个当前目录,然后在当前目录下面调用要执行的程序。我们运行pwd的话,就需要在一个目录下启动shell进程。当前目录我们可以随便选一个。这里选根目录。<br />ProcessBuild原创 2011-03-08 12:59:00 · 2631 阅读 · 5 评论 -
Android中KeyEvent的生命周期
<br /><br />1、生成<br />存在这样一个线程,它不断地从driver读取Event,并把它放到RawEvent队列中。这个队列中的RawEvent既有按键,也有触摸、轨迹球等事件。<br />RawEvent队列中的每个RawEvent最后都会通过一系列转化,最终变为KeyEvent被发送给另外一个线程,即输入线程,也就是一个Activity的主线程。<br /> <br />2、传递<br />KeyEvent传递过程主要可以划分为三步:过滤器、View树、Activity<br />过滤原创 2011-03-08 15:01:00 · 7052 阅读 · 3 评论 -
ACD系列翻译之一
<br /> <!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } A:link { so-language: zxx } --><br />本文档的原名是AndroidCompatibilityDefinition,以下简称ACD。以下对文档的重点进行了翻译,省略了一些图表和细节规范。如果想大致了解ACD的话,可以浏览该文档,但具体进行某一项CTS的时候,请参考原文档。<br /><br翻译 2011-05-12 09:53:00 · 2877 阅读 · 0 评论 -
ACD系列翻译之二
<br /><br />4 APK兼容<br />定制必须可以安装和运行由aapt工具生成的.apk文件。系统绝对不能因为扩展.apk,AndroidManifest.xml,Dalvik字节码而导致.apk文件不能在其它系统上运行。<br /><br /><br />5 多媒体兼容<br />定制系统必须能支持官方列出的所有codec,必须支持一种方式的音频输出(扬声器等)<br />5.1 Media Codec<br />默认情况下,所有的codec都是软实现的,现在的硬件不必支持标准要求的速率。不过翻译 2011-05-12 09:58:00 · 2091 阅读 · 0 评论 -
Android反编译工具apktool
<br /><br />这个工具是个开源项目,地址是:<br />http://code.google.com/p/android-apktool/<br /> <br />我的是Ubuntu平台,下载apktool-install-linux-r04-brut1.tar.bz2原创 2011-05-30 12:30:00 · 37269 阅读 · 3 评论 -
传感器点滴
<br /><br />SensorThreadRunnable这个线程启动后进入循环,不停地读取传感器的值,并通过ListenerDelegate.onSensorChangedLocked传入已经注册的SensorListener集合sListeners。<br />onSensorChangedLocked负责把读取到的值传递给SensorListener,所以,如果读到的值需要校正的话,可以在onSensorChangedLocked里面进行。<br /> <br />其中有一个比较特殊的Liste原创 2011-05-31 19:37:00 · 2907 阅读 · 0 评论 -
陀螺仪、加速计、磁力计等传感器汇总
<br /> <br />陀螺仪就是内部有一个陀螺,它的轴由于陀螺效应始终与初始方向平行,这样就可以通过与初始方向的偏差计算出实际方向。手机里陀螺仪实际上是一个结构非常精密的芯片,内部包含超微小的陀螺。<br />加速计是用来检测手机受到的加速度的大小和方向的,而手机静置的时候是原创 2011-06-01 16:43:00 · 77478 阅读 · 2 评论