博客统计信息

51cto博客之星
用户名:terry_龙
文章数:108
评论数:283
访问量:277064
无忧币:2692
博客积分:4522
博客等级:7
注册日期:2010-06-21

我最近发表的评论

【WP7进阶】——X.. 回复
监听上下左右键。然后改变精灵的坐..
Android Ap 开发 .. 回复
求包养呀。。。
Windows Phone 7 .. 回复
高抬了。
转载:创业型公司.. 回复
哇。。这么牛呀。。我是从博客园弄..
创业型公司或发展.. 回复
http://blog.csdn.net/terryyhl/arc..
 在为Android 增加多分区的支持时,可能会需要获得当前 USB 连接的挂载口,可能标准的Android 框架并未提供这样的接口给开发者,这时就需要我们自己为它提供接口了。先来看一下上层(应用)如何得到一个IMountService 的。

复制代码
 private synchronized IMountService getMountService() {

       if (mMountService == null) {

           IBinder service = ServiceManager.getService("mount");

           if (service != null) {

               mMountService = IMountService.Stub.asInterface(service);

           } else {

               Log.e(TAG, "Can't get mount service");

           }

       }

       return mMountService;

    }
复制代码

 关于Binder 可以参考下这篇文章:Android深入浅出之Binder机制 。
Android 2.2新增接口 
Android 2.2为IMountService 新增接口非常容易,在frameworks/base/core/java/android/os/storage 有一个IMountService.aidl 文件,可以直接在这个文件里面新增一个接口提供给上层,如:
/*add by terry*/

    String getUsbMountPointPath();


该文件负责生成IMountService.java文件,接着进入frameworks/base/services/java/com/android/server ,打开MountService.java 该文件继承于IMountService.aidl生成的类
class MountService extends IMountService.Stub
在这个类里面实现我们为IMountService.aidl 新增的接口
public String getUsbMountPointPath(){

       return usbMountPointPath;

    }
OK。通过上面的操作, StorageManage  就可以很方便的得到这个为其新增的接口,上层便可以访问了。
编译步骤:
1):编译framework/base (生成IMountService.java)
 2):编译framework/base/service (编译MountService)
3):编译framework/base  (编译StorageManage以提供给上层调用)
 
Android 4.0 以上新增接口
相比于Android 2.2,在Android 4.0框架层 为IMountService 新增一个接口就显得比较复杂了。
 按照Android 2.2 新增接口的方法,我们会先进入frameworks/base/core/java/android/os/storage 查找IMountService.aidl文件,进入目录,ls 一下,会发现并没有该文件,取而代之的是IMountService.java。这是怎么回事?打开该文件:映入眼帘首先会看到该警告:
 

复制代码
 /**

 * WARNING! Update IMountService.h and IMountService.cpp if you change this

 * file. In particular, the ordering of the methods below must match the

 * _TRANSACTION enum in IMountService.cpp

 *

 * @hide - Applications should use android.os.storage.StorageManager to access

 *       storage functions.

 */
类别:Android|阅读(179)|回复(1)|(2)阅读全文>>
    清明节清51CTO的程程联系了我,问我是否有兴趣在深圳举办一次Windows Phone 7的技术沙龙。当时刚好手头上公司分配了个比较棘手的任务,怕会影响到工作,也就一口回绝了,另外还有一个原因是Windows Phone 7 是去年自己学习了,不过因为工作的原因,很久没有再去弄Windows Phone7,怕自己菜鸟水平不能胜任。
    回去自己想了一下,联系了Frankie 问他是否有兴趣,当时Frankie 刚从腾讯离职,恰好有时间可以预订场地什么的,两人一拍即合,决定一起合作组织。
    结果活动现场气氛比自己想象中的..
上一篇关于Mount的分析,分析了main的作用和一些挂载系统的分析。下面深入分析Mount的流程走法。
 
Mount流程分为两个部分
 

主动挂载(插入SDCARD或者USB硬盘时系统自动挂载)
手动挂载(卸载SDCARD或者USB硬盘后,再点击加载设备的手动挂载) 

不同挂载走的流程并不相同,比如手动挂载是由上层发命令给vold 执行挂动作,而主动挂载是由kernel 分命令给vold 再由vold 发挂载消息给上层,上层得到挂载消息和状态后再发命令给vold 执行挂载。主动挂载较之复杂些。不过虽然流程不一样,但最终还是要调..
类别:Android|阅读(117)|回复(1)|(1)阅读全文>>
 前段时间对Android 的SDCard unmount 流程进行了几篇简短的分析,由于当时只是纸上谈兵,没有实际上的跟进,可能会有一些误导人或者小错误。今天重新梳理了头绪,针对mount的流程再重新分析一次。

 本篇大纲
 

android 系统如何开机启动监听mount服务
默认挂载点在Android 系统的哪个目录
vold.fstab 配置文件的分析 
vold 里面启动页面main做了些什么

android 系统如何开机启动监听mount服务
android sdcard 热插拔监测和执行操作是由一个启动文件vold  所统领的,系统开机..
类别:Android|阅读(256)|回复(1)|(1)阅读全文>>
 
前篇地址
Android SDCard UnMounted 流程分析(一)
Android SDCard UnMounted 流程分析(二)
 
 前一篇讲到SDCard unmout onEvent 发送socket 到框架层,接下来分析框架层得到数据后的流程。
 MoutService
当android 系统启动时,system将MountService 添加到启动服务里面,而MountService 会开启一个线程来运行NativeDaemonConnector,由它来监听vold的消息,代码:
 mConnector = new NativeDaemonConnector(this, "vold", MAX_CONTAINERS * 2,&..
 上一篇讲到通过NetlinkManager发送uevent 命令到NetlinkHandler 的onEvent,代码如下:

void NetlinkHandler::onEvent(NetlinkEvent *evt) {

    VolumeManager *vm = VolumeManager::Instance();

    const char *subsys = evt->getSubsystem();



    if (!subsys) {

        SLOGW("No subsystem found in netl..
 
Android SDCard框架 
Android SDCard框架,我们修改一般涉及到四大模块
 

Linux Kernel 用于检测热拔插,作为框架开发者来说,这者不用涉及
Vold 作为Kernel 与 Framework 之间的桥梁
Framework 操作Vold ,给Vold 下发操作命令
UI 与Framework 交互,用于挂载/卸载SD卡

 
框架涉及的源码位置
Vold :System/vold
        为vold 提供接口:System/Netd
        其他涉及的部分:System/core/libsysutils/src
      &n..
类别:Android|阅读(106)|回复(3)|(3)阅读全文>>
 这是一个关于RenderScript如何使用 Struct 的文章,是学习RenderScript 一个必须要掌握的基础知识点。

大纲

如何定义Struct
如何得到指针长度并循环为指针赋值
整体DEMO代码

 如何定义Struct
 RenderScript 里面定义结构有两种定义方法,参考如下:
1.
typedef struct tempArray

 {

    float2 position;

    float size;

} Array_T;



Array_T *myArray;
复制代码

2.
 //定义一个struct..
 RenderScript 不仅可以用来画图,而且可以用来做密集的计算操作。目前的API可以使用到的是利用CPU的核心优势来帮我们做计算。在未来,可能会包括GPU和DSP处理器上做精密计算。
创建一个Compute  的RenderScript
   下面有一张图详细的介绍了勾划了一个Compute 的 RenderScript:
 
图解:Andriod 有一个RenderScript Compute 的引擎来支持做精密计算,后期google 会不断扩展这个引擎让其支持更多的精密计算如上面提到的GPU、DSP等等,创建Compute RenderScript 同样的也必须写一个.rs 文件,做运行时生成对象读取调用。之后在Android 上层实现计算功能。另,(必须显示在应用上调用forEach_root或者在RenderScript 运行时运件中.rs,调用rsForEach(),Compute 才会自动调用硬件支持核心来计算) .
 
 参照DEMO
 

 在上层调用forEach_root 计算的DEMO
在RenderScript 运行时调用rsForEach计算的DEMO

 
 
其实,两个DEMO都实现了同一样的功能,就是将一张图片使用滤镜效果将其变颜色RGB值变成灰尘色,而另一张则原样显示,该DEMO参考了SDK中的HelloWorldCompute DEMO,而唯一与SDK中不一样的地方是在:SDK是在于上层调用forEach_root方法进行计算,而我使用的是在.rs 中调用rsForEach方法进行计算。两者功能相同,实现效果不一样而已。
 
 在上层调用forEach_root 计算的DEMO
区别的代码在于: 
SDK DEMO 
.rs文件 :
#pragma version(1)

#pragma rs java_package_name(com.example.android.rs.hellocompute)



const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};



void root(const uchar4 *v_in, uchar4 *v_out) {

    float4 f4 = rsUnpackColor8888(*v_in);



    float3 mono = dot(f4.rgb, gMonoMult);

    //dot:[0]*[0]+[1]*[1]+[2]*[2]

    *v_out = rsPackColorTo8888(mono);


复制代码

 createScript方法:
private void createScript() {

        mRS = RenderScript.create(this);

        



        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,

                                                    Allocation.MipmapControl.MIPMAP_NONE,

                                                    Allocation.USAGE_SCRIPT);

        mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());



        mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);



        mScript.forEach_root(mInAllocation, mOutAllocation);//通知RenderScript Compute Runtime 

        mOutAllocation.copyTo(mBitmapOut);

    } 
复制代码

 
 在RenderScript 运行时调用rsForEach计算的DEMO
 .rs文件:
#pragma version(1)

#pragma rs java_package_name(com.xuzhi.renderScriptCompute)



rs_allocation gIn;

rs_allocation gOut;



rs_script gScript; 



const static float3 gMonoMult={0.299f,0.587f,0.114f};



void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y){



//将一个uchar4 的颜色解压为float4

    float4 f4=rsUnpackColor8888(*v_in);

    

    //dot:[0]*[0]+[1]*[1]+[2]*[2]

    float3 mono=dot(f4.rgb,gMonoMult);

    //打包uchar4,alpha 默认为1.0

    *v_out=rsPackColorTo8888(mono);

    

}



void filter(){

//调用RenderScript 进行处理(操作输入的图片然后把处理的结果放到输出结果中),最后把处理完的数据存回bitmap ,在ImageView显示出来

     rsForEach(gScript, gIn, gOut);


复制代码

 createScript方法:
    private void createScript() {

        mRS = RenderScript.create(this);

        //从一个bitmap 创建一个allocation

        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,

                Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);

        

        mOutAllocation=Allocation.createTyped(mRS, mInAllocation.getType());

        

        mScript=new ScriptC_mono(mRS, getResources(), R.raw.mono);

        mScript.set_gIn(mInAllocation);

        

        mScript.set_gOut(mOutAllocation);

        

        mScript.set_gScript(mScript);

        

        mScript.invoke_filter();//通知RenderScript Compute Runtime 

         

        mOutAllocation.copyTo(mBitmapOut);

        

        

    } 
复制代码

 
总结
两种方法无论怎么变化,最终的上的都是要通知RenderScript Compute 运行时做计算功能。 运行效果:
 
 
代码下载:
 RenderScript->Compute[/img]..
 准备上4.0项目,最近接触API 的时候看到了RenderScript 。通过运行google 那几个项目发现这个真是一个非常不错的API,但是google 所提供的文档非常少,有助于了解计算机图形计算,虽然我们做应用编程的不一定要涉及这块,但涉猎一下总是不错的。

RenderScript 是Android 平台上的一种类C脚本语言。要在我们程序上实现RenderScript 渲染功能,最少需要实现的几个功能如下,以一个Hello Wold 为例:
 

helloworld.rs 实现RenderScript 的代码

RenderScriptRS.java 一个辅助类,简化操作RenderScri..
 <<   1   2   3   4   5   >>   页数 ( 1/11 )

订阅我的博客


google reader 鲜果 QQ邮箱 有道 抓虾