ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划 (六)

Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划 (六)

原创 Linux操作系统 作者:broadviewbj 时间:2012-10-31 09:25:53 0 删除 编辑
相关的字符串定义在res/values/strings.xml文件中:

  1. xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="app_name">Ashmemstring>  
  4.     <string name="value">Valuestring>  
  5.     <string name="hint">Please input a value...string>  
  6.     <string name="read">Readstring>  
  7.     <string name="write">Writestring>  
  8.     <string name="clear">Clearstring>  
  9. resources>  
  1. xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="app_name">Ashmemstring>  
  4.     <string name="value">Valuestring>  
  5.     <string name="hint">Please input a value...string>  
  6.     <string name="read">Readstring>  
  7.     <string name="write">Writestring>  
  8.     <string name="clear">Clearstring>  
  9. resources>  
        这样,界面的相关配置文件就介绍完了。

       我们还要再来看程序描述文件AndroidManifest.xml的相关配置,它位于Ashmem目录下:

  1. xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="shy.luo.ashmem"  
  4.       android:sharedUserId="android.uid.system"  
  5.       android:versionCode="1"  
  6.       android:versionName="1.0">  
  7.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  8.         <activity android:name=".Client"  
  9.                   android:label="@string/app_name">  
  10.             <intent-filter>  
  11.                 <action android:name="android.intent.action.MAIN" />  
  12.                 <category android:name="android.intent.category.LAUNCHER" />  
  13.             intent-filter>  
  14.         activity>  
  15.         <service   
  16.             android:enabled="true"   
  17.             android:name=".Server"  
  18.             android:process=".Server" >  
  19.             <intent-filter>  
  20.                 <action android:name="shy.luo.ashmem.server"/>  
  21.                 <category android:name="android.intent.category.DEFAULT"/>  
  22.             intent-filter>  
  23.         service>  
  24.     application>  
  25. manifest>  
  1. xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="shy.luo.ashmem"  
  4.       android:sharedUserId="android.uid.system"  
  5.       android:versionCode="1"  
  6.       android:versionName="1.0">  
  7.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  8.         <activity android:name=".Client"  
  9.                   android:label="@string/app_name">  
  10.             <intent-filter>  
  11.                 <action android:name="android.intent.action.MAIN" />  
  12.                 <category android:name="android.intent.category.LAUNCHER" />  
  13.             intent-filter>  
  14.         activity>  
  15.         <service   
  16.             android:enabled="true"   
  17.             android:name=".Server"  
  18.             android:process=".Server" >  
  19.             <intent-filter>  
  20.                 <action android:name="shy.luo.ashmem.server"/>  
  21.                 <category android:name="android.intent.category.DEFAULT"/>  
  22.             intent-filter>  
  23.         service>  
  24.     application>  
  25. manifest>  
        这里我们可以看到,下面的配置项把服务名称"shy.luo.ashmem.server"和本地服务类Server关联了起来:

  1.    <service   
  2. android:enabled="true"   
  3. android:name=".Server"  
  4. android:process=".Server" >  
  5. <intent-filter>  
  6.             <action android:name="shy.luo.ashmem.server"/>  
  7.             <category android:name="android.intent.category.DEFAULT"/>  
  8.        intent-filter>  
  9.    service>  
  1.    <service   
  2. android:enabled="true"   
  3. android:name=".Server"  
  4. android:process=".Server" >  
  5. <intent-filter>  
  6.             <action android:name="shy.luo.ashmem.server"/>  
  7.             <category android:name="android.intent.category.DEFAULT"/>  
  8.        intent-filter>  
  9.    service>  
        这样,我们就可以通过startService(new Intent("shy.luo.ashmem.server"))来启动这个Server了。不过,在Android中,启动服务是需要权限的,所以,下面这一行配置获取了启动服务需要的相应权限:

  1. android:sharedUserId="android.uid.system"  
  1. android:sharedUserId="android.uid.system"  
        最后,我们来看工程的编译脚本文件Android.mk,它位于Ashmem目录下:
  1. LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_MODULE_TAGS := optional  
  5.   
  6. LOCAL_SRC_FILES += $(call all-subdir-java-files)  
  7.   
  8. LOCAL_PACKAGE_NAME := Ashmem  
  9.   
  10. LOCAL_CERTIFICATE := platform  
  11.   
  12. include $(BUILD_PACKAGE)  
  1. LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_MODULE_TAGS := optional  
  5.   
  6. LOCAL_SRC_FILES += $(call all-subdir-java-files)  
  7.   
  8. LOCAL_PACKAGE_NAME := Ashmem  
  9.   
  10. LOCAL_CERTIFICATE := platform  
  11.   
  12. include $(BUILD_PACKAGE)  
        这里又有一个关键的地方:

  1. LOCAL_CERTIFICATE := platform  
  1. LOCAL_CERTIFICATE := platform  
        因为我们需要在程序中启动Service,所以要配置这一行,并且要把源代码工程放在Android源代码平台中进行编译。

        这样,整个例子的源代码实现就介绍完了,接下来就要编译了。有关如何单独编译Android源代码工程的模块,以及如何打包system.img,请参考如何单独编译Android源代码中的模块一文。

        执行以下命令进行编译和打包:

  1. USER-NAME@MACHINE-NAME:~/Android$ mmm packages/experimental/Ashmem  
  2. USER-NAME@MACHINE-NAME:~/Android$ make snod  
  1. USER-NAME@MACHINE-NAME:~/Android$ mmm packages/experimental/Ashmem  
  2. USER-NAME@MACHINE-NAME:~/Android$ make snod  
       这样,打包好的Android系统镜像文件system.img就包含我们前面创建的Ashmem应用程序了。

       再接下来,就是运行模拟器来运行我们的例子了。关于如何在Android源代码工程中运行模拟器,请参考在Ubuntu上下载、编译和安装Android最新源代码一文。

       执行以下命令启动模拟器:

  1. USER-NAME@MACHINE-NAME:~/Android$ emulator  
  1. USER-NAME@MACHINE-NAME:~/Android$ emulator  
       模拟器启动起,就可以在Home Screen上看到Ashmem应用程序图标了:


       点击Ashmem图标,启动Ashmem应用程序,界面如下:


        这样,我们就可以验证程序的功能了,看看是否实现了在两个进程中通过使用Android系统的匿名共享内存机制来共享内存数据的功能。

        通过这个例子的学习,相信读者对Android系统匿名共享内存子系统Ashmem有了一个大概的认识,但是,这种认识还是停留在表面上。我们在文章开始时就提到,Android系统匿名共享内存子系统Ashmem两个特点,一是能够辅助内存管理系统来有效地管理不再使用的内存块,二是它通过Binder进程间通信机制来实现进程间的内存共享。第二个特点我们在上面这个例子中看到了,但是似乎还不够深入,我们知道,在Linux系统中,文件描述符其实就是一个整数,它是用来索引进程保存在内核空间的打开文件数据结构的,而且,这个文件描述符只是在进程内有效,也就是说,在不同的进程中,相同的文件描述符的值,代表的可能是不同的打开文件,既然是这样,把Server进程中的文件描述符传给Client进程,似乎就没有用了,但是不用担心,在传输过程中,Binder驱动程序会帮我们处理好一切,保证Client进程拿到的文件描述符是在本进程中有效的,并且它指向就是Server进程创建的匿名共享内存文件。至于第一个特点,我们也准备在后续学习Android系统匿名共享内存子系统Ashmem时,再详细介绍。

        因此,为了深入了解Android系统匿名共享内存子系统Ashmem,在接下来的两篇文章中,围绕上面提到的两个特点,分别学习:

       1. Android系统匿名共享内存子系统Ashmem是如何够辅助内存管理系统来有效地管理不再使用的内存块的?

       2. Android系统匿名共享内存子系统Ashmem是如何通过Binder进程间通信机制来实现进程间的内存共享的?

       学习完这两篇文章后,相信大家对 Android系统匿名共享内存子系统Ashmem就会有一个更深刻的认识了,敬请关注。

 

原博客链接:http://blog.csdn.net/luoshengyang/article/details/6651971

本文节选自《Android系统源代码情景分析》

电子工业出版社出版

罗升阳 著

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13164110/viewspace-747976/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-02-22

  • 博文量
    1029
  • 访问量
    1730605