Menu Home

ffmpeg常用命令

把mpg文件转换成一系列JPG图片 ffmpeg -i video.mpg image%d.jpg 其他支持的格式: PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI … MP4转换MOV 这里只是转换了包装格式,不改变视频和音频编码格式。 -vcodec copy:拷贝源视频编码格式 -acodec copy:拷贝源音频编码格式 ffmpeg -i inputfile.mp4 -vcodec copy -acodec copy output.mov 其它常用参数: -s:设置视频大小 ffmpeg -i inputfile.mp4 -vcodec copy -acodec copy -s 1920×1080 output.mov -r:设置视频帧率 ffmpeg -i inputfile.mp4 -vcodec copy -acodec copy […]

jsoncpp的简单使用

OS:ubuntu 12.04 JSONCPP : 0.5.0 关于JSONCPP JSONCPP是一个比较流行的C/C++用来解析json的库,最新的版本是0.5.0,源代码下载地址点击 这里 JSONCPP的编译需要使用scons(ubuntu的用户直接apt-get install scons即可),编译成功后会在jsoncpp-src-0.5.0/libs/linux-gcc-4.7/ 下生成一个libjson_linux-gcc-4.7_libmt.so,开发头文件在include文件夹下。在编译自己的项目时需要加入-ljson_linux-gcc-4.7_libmt编译参数。 JSON结构 Value String Number Object json中的object是“名称/值”对的无序集合,类似于STL中的map。一个object以左大括号'{‘开始,右大括号结束’}’,名称和值之间使用冒号’:’分割,“名称/值”对与“名称/值”对之间使用逗号’,’分割。object可以被嵌套,可以作为其他类型的子元素。 一些例子: {“id” : 1} {“id” : 1, “name” : “lnmcc”, “age” : 100} Array json中的数组,以左方括号'[‘开始,右方括号’]’结束,元素跟元素之间以逗号’,’分割。 一个例子: { “teacher” : [ {“name” : “lnmcc”}, {“name” : “word”} ] } 使用JSONCPP解析json文件 文件test.json内容: { “id”:7, […]

Linux线程的调度策略与优先级

调度策略有3种: SCHED_OTHER: 分时调度策略。线程的默认策略。此策略不能设置线程优先级。 SCHED_FIFO: 实时调度策略,先到先服务。一旦线程占用cpu则一直运行。直到有更高优先级任务到达或自己放弃。此策略可设置线程优先级。 SCHED_RR: 实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。保证了所有具有相同优先级的RR任务的调度公平此策略可设置线程优先级。 这3个宏在 sched.h 中定义。 线程优先级: 不同操作系统的优先级范围是不相同的,所以在设置线程优先级的时候需要先使用下面2个函数来查询其最大值和最小值: int sched_get_priority_max(int policy); int sched_get_priority_min(int policy); 参数policy是上面介绍的调度策略中的SCHED_FILO或SCHED_RR,注意不能是SCHED_OTHER,因为SCHED_OTHER不支持优先级。 查询和设置调度策略: int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param); 查询和设置线程优先级: 查询: struct sched_param param; //首先查询线程的调度策略,赋给param //参数attr是create线程时所使用的线程属性 pthread_attr_getschedparam(attr, &param); //从sched_param结构中获取线程优先级 param.__sched_priority; 设置: pthread_attr attr; struct sched_param param; […]

ubuntu使用Fn调节屏幕亮度

OS: ubuntu 12.04 NVIDIA: 319.37 笔记本在ubuntu下更新了NVIDIA显卡驱动后,Fn快捷键调节屏幕亮度的功能失效了,可以使用下面的方法重新启用: 在 /etc/X11/xorg.conf的”Device”段加入一行: Option “RegistryDwords” “EnableBrightnessControl=1” 现在xorg.conf看起来可能是这样: Section “Device” Identifier “Device0” Driver “nvidia” VendorName “NVIDIA Corporation” Option “RegistryDwords” “EnableBrightnessControl=1” EndSection

MediaPlayer(一)——处理网络音频文件

Android MediaPlayer状态转换图 activity_main.xml: <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <TextView android:id=”@+id/TV01″ android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Status :” /> <TextView android:id=”@+id/statusTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Unknown” /> <TextView android:id=”@+id/bufferPercentTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Buffer Percentage : ” /> <ProgressBar android:id=”@+id/bufferSB” android:layout_width=”fill_parent” android:layout_height=”wrap_content” style=”@android:style/Widget.ProgressBar.Horizontal” android:max=”100″ /> <Button android:id=”@+id/startBtn” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Start” /> <Button android:id=”@+id/stopBtn” android:layout_width=”wrap_content” android:layout_height=”wrap_content” […]

android音乐文件搜索和播放

main_activity.xml <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <Button android:id=”@+id/returnBtn” android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”return” /> <!– 如果在代码中需要使用simple_list_item布局,那么这里的id必须为list –> <ListView android:id=”@android:id/list” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> </LinearLayout> Main_activity.java public class MainActivity extends ListActivity implements LoaderCallbacks<Cursor> { //设置俩种选项状态:选择专辑或者选择歌曲 public static int STATE_SELECT_ALBUM = 0; public static int STATE_SELECT_SONG = 1; //默认当前状态为选择专辑 int currentState = […]

Android使用多点触摸(二)——绘图板

activity_main.xml <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.MainActivity” > <ImageView android:id=”@+id/imageView” android:layout_width=”fill_parent” android:layout_height=”fill_parent” /> </RelativeLayout> MainAvtivity.java public class MainActivity extends Activity implements OnTouchListener{ ImageView imageView; Bitmap bitmap; Canvas canvas; Paint paint; float startx = 0f; float starty = 0f; float endx = 0f; float endy = 0f; […]

repo 1.12.4 gpg key错误

自从repo升级到 1.12.4后,repo init的时候就一直报错: repo 1.12.4 gpg: Signature made Wed Oct 2 00:44:27 2013 CST using RSA key ID 692B382C gpg: Can’t check signature: public key not found error: could not verify the tag ‘v1.12.4’ 查了半天原来是android doc没有更新,解决方法是不要使用 curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo 下载的repo,使用下面的网址即可: curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

Android Activity布局(layout)介绍

LinearLayout LinearLayout——线性布局,顾名思义,LinearLayout中的组件按照线性排列,每一个组件都位于前一个组件的后面。LinearLayout又可以分为水平线性布局和垂直线性布局。 垂直线性布局 在垂直线性布局中,组件从上至下依次排列。可以使用android:layout_weight属性来控制组件占据空间的比例:当layout_width或layout_height设置为0dp的时候,数值越高占据的比例越大;当layout_width或layout_height设置为match_parent时,数值越高占据的比例越小。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” > <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”2″ android:text=”TextView 1″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 2″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 3″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”TextView 4″ /> 水平线性布局 水平线性布局中的组件按照水平方向平铺排列,组件所占空间的比例跟layout_weight的值成正比。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”horizontal” > <TextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” […]

Android Use Camera (一) : 捕捉图像并修改图像属性

git clone https://github.com/lnmcc/CameraExample.git 下面的例子将展示如何通过Camera Intent捕捉图像并修改图像属性的方法。 activity_main.xml: <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <ImageView android:id=”@+id/imgView” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/TitleTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Title” /> <EditText android:id=”@+id/TitleET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/DescriptionTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Description” /> <EditText android:id=”@+id/DescriptionET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <Button android:id=”@+id/TakePictureBT” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Take Picture” /> <Button android:id=”@+id/SaveDataBT” […]

MAC OS 利用WIFI共享网络

MAC OS : 10.7.5 应用情景: 华为3G网卡负责外网,利用本机的wifi为其他设备提供共享网络。 打开系统 System Preferences界面,找到Sharing项     Sharing配置界面左侧选择Internet Sharing,只选中,不要打勾。在界面右侧的”Share your connection from”的下拉菜单中选择你需要共享的外网连接(我这里是HUAWEIMobile),然后在”To computers using:”下拉菜单中选择你用来发送共享网络的设备(我这里是Wi-Fi)     在左侧栏的”Internet Sharing”复选框中打勾,弹出下面的对话框后点击”Start”     完成后的状态

让人目瞪口呆的三位世界级电脑大师

公元1998年 在我读高二那年,那还是我用Windows 98的时候有次我系统崩溃了, 因为我那时还是个电脑白痴,我同学帮我介绍了一个电脑高手来帮我修电脑。 他看了一下电脑,问我有没有Windows 98 的光盘?我说没有。 他想了一下,叫我把家里电话拿给他,我心里想说修电脑要电话干什么? 但人家是电脑高手,我也不好意思说什么,就把电话拔下来给他了。 他把电话线空着的一头接在主机版的一个插孔内,然后进入了 DOS, 然后就开始在电话上不停的按着键,他按键的速度非常快,但是他都只按电话的0,1两个键。 我搞不懂这有什么用? 但也不敢问,看了半个多小时,他还是不停的按这两个键。 我渐渐的有些困,我问他这东西要搞多久? 他说还要几个小时,我给他倒了杯咖啡,就一个人去隔壁书房睡觉了。 醒来的时候,一看已经过了5个多小时,我起身到隔壁,看见他正在 Windows 98 里面调试。 过了一会儿,他说,你试试,我坐上椅子用了一下,真的好了。 我当时也不懂电脑,谢过人家就走了。 后来我慢慢对电脑有了一些概念才了解到, 原来当时那位电脑高手是使用机器语言编了一个Windows 98系统从我给他的电话直接输入到硬盘。 我后来问我同学那位高手的下落,我同学说前几年去了美国之后,杳无音讯…. 公元2000年 在我读大一那年,那还是我用Windows Me的时候有次我系统崩溃了, 因为我那时还是个电脑入门,我朋友帮我介绍了一个电脑高手来帮我修电脑。 他看了一下电脑,问我有没有Windows Me 的安装盘?我说没有。 他想了一下,叫我把一张空的DVD刻录盘和一根奈米细针拿给他, 我心里想说修电脑要刻录盘和奈米细针干什么?但人家是电脑高手,我也不好意思说什么。 於是我就把DVD刻录盘拿一张来给他了。 他把奈米细针头对着刻录盘戳,他戳的速度非常快,但是只戳深或浅。 我搞不懂这有什么用?但也不敢问,看了半个多小时,他还是不停的戳着DVD刻录盘。 我渐渐的有些困,我问他这东西要搞多久?他说要几个小时,我给他倒了杯葡萄酒, 就一个人去隔壁客厅沙发上睡觉了。 醒来的时候,一看已经过了6个多小时,我起身到隔壁,看见他正在 Windows Me 里面调试, 还装上了 Office、Photoshop、迅雷、魔兽世界等软件……过了一会儿他说, 你试试,我坐上椅子用了一下,真的好了。 我当时也不懂电脑,谢过人家就走了。 后来我慢慢对电脑有了一些基础,终于明白了,原来当时那位电脑高手是用奈米细针头刻了一个单面双层的DVD , […]

adb常用命令

设置标准输出和标准错误输出 Android系统默认把标准输出和标准错误输出(system.out和system.err)定向到/dev/null。使用下面的命令更改: $ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 查看内存分配情况 $ adb shell dumpsys meminfo <package name> 重新安装apk adb install -r 包名 卸载apk adb uninstal 包名 注意这里的参数是包名,即AndroidManifest中package的属性值。

使用Android接口描述语言(AIDL)

AIDL简介 Andorid提供了一种轻量级的进程间通信机制:接口描述语言(Android Interface Definition Language),简称AIDL。进程间使用AIDL通信跟使用Intent通信的最大区别在于:前者是同步通信,而后者是异步通信。AIDL的语法与JAVA中的Interface十分相似,对数据类型的支持方面有一些差别,目前AIDL支持的数据类型有: Java中的基本数据类型 String List CharSequence Map 其他AIDL生成的接口 实现了Parcelable接口并通过值传递的自定义类型 使用AIDL的步骤 创建.aidl文件,在文件中声明远程服务的接口 在.java文件中实现.aidl中声明的方法 在AndroidMainifest中注册上面创建的服务 客户端请求绑定服务成功后就可以调用.aidl中声明的方法了 示例解析 项目目录结构: 在项目src文件夹下创建IAddService.aidl文件,在aidl声明了一个addOne方法,这个方法简单的把传入的值加上一。 IAddService.aidl: package net.lnmcc.aidltest.aidl; interface IAddOneService { int addOne(int value); } 保存.aidl文件后,Eclipse将会自动在gen/文件夹下生成一个IAddService.java文件,在后面实现远程服务的时候会使用到其中的抽象类Stub。 创建AddService,AddService是一个bound服务,需要实现onBind()方法,它将返回一个IAddService.Stub实例。IBinder简单的理解成进程间通信的通道,可以通过这个通道来实现数据传输。 AddService.java: public class AddService extends Service { IAddService.Stub mBinder; @Override public void onCreate() { super.onCreate(); mBinder = new […]

Android增加Happy Touch触摸屏支持

1、在hid-ids.h中加入vid pid #define USB_VENDOR_ID_HAPPYTOUCH 0x0416 #define USB_DEVICE_ID_HAPPYTOUCH_SCREEN 0x5030 2、在hid-multitouch.c->mt_devices[] 中加入 { .driver_data = MT_CLS_DEFAULT, HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH, USB_DEVICE_ID_HAPPYTOUCH_SCREEN) } 3、在hid-core.c->hid_have_special_driver[]中加入HID_USB_DEVICE(VID,PID) { HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH,USB_DEVICE_ID_HAPPYTOUCH_SCREEN)} 4、设置kernel编译变量 $ export ARCH=arm $ export SUBARCH=arm $ export CROSS_COMPILE=arm-eabi- 5、在内核的config文件中,确认驱动中是否添加了hid-multitouch模块 运行make menuconfig后,将HID Multitouch panels选上。 $ make clear $ make mrproper $ make menuconfig Device Drivers —> HID Devices —> […]

sqlite的基本用法

介绍 SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。 数据库操作 查询已有数据库 $ sqlite > .databases 创建数据库 $ sqlite test.db 如果数据库已经存在了,则打开数据库。 创建表 sqlite> create table mytable(id integer primary key, value text); sqlite>为sqlite的命令行提示符 查看数据库中存在的表 $ sqlite .tables 往表中插入数据 sqlite> insert into mytable(id, value) values(1, ‘Micheal’); sqlite> insert into mytable(id, value) values(2, ‘Jenny’); sqlite> insert into […]

为Android app添加最终用户许可协议(EULA)

对一个android app来说,加入EULA已经是一个必不可少的内容了。下面将演示如何创建一个通用的Eula类。任何一个app都可以使用Eula.show()来显示自己的EULA,也可以通过实现Eula.OnEulaAgreedTo接口做进一步处理。 Eula.java /** 最终用户协议文件名由ASSERT_EULA定义,存放位置为项目的assets目录 */ public class Eula { private static final String ASSERT_EULA = “EULA”; private static final String PREFERENCE_EULA_ACCEPTED = “eula.accepted”; private static final String PREFERENCE_EULA = “eula”; /** 当用户选择同意后的回调函数。 */ static interface OnEulaAgreedTo { void onEulaAgreedTo(); } private static void accept(SharedPreferences preferences) { preferences.edit().putBoolean(PREFERENCE_EULA_ACCEPTED, true).commit(); } […]

Android音频之SoundPool

Android提供了两种不同的框架来处理音频,分别是: MediaPlayer / MediaRecoder:处理音频的标准方法,但数据源必须是文件或者基于流的数据。使用这个类处理音频文件的时候须有创建自己的线程运行。本文要说的SoundPool类就是使用了这个框架。   AudioTrack / AudioRecoder:该框架支持直接访问原始音频文件。用于在内存中处理音频文件,或者开始播放音频的同时写入缓冲区,或者在其他不需要文件和数据流的场合中使用。运行过程中不需要创建新线程。 SoundPool 和MediaPlayer主要用来播放一些长音频不同,SoundPool一般用来处理一些短的但是带有重叠,回放等特效的音频。这是因为SoundPool带有一个音频缓冲区,可以很方便的支持音频的回放、快放和慢放。 使用SoundPool的基本步骤 初始化 加载资源 播放 释放资源 测试SoundPool 我在测试过程中发现不能播放大于1M的音频文件,所以这里使用一个900K的sound.wav做测试。在点击Play后,音乐将重复播放5次(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第5个参数指定),每重复点击Play按钮,音乐会降低一半速率播放(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第6个参数指定)。测试程序同时最大可以叠加10个音频(SoundPool(10, AudioManager.STREAM_MUSIC, 0)中的第1个参数指定)。 public class AudioExamplesSP extends Activity { static float rate = 2f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button playButton […]

ubuntu下编译ImageMagick使支持JPEG

OS : ubuntu 12.04 (32bit) ImageMagick ver : 6.8.4 ubuntu 12.04默认使用的是JPEG-8,但是ImageMagick-6.8.4需要JPEG-9。使用默认configure编译ImageMagick后,每当需要处理jpeg文件时,IMageMagick报错: Magick: Wrong JPEG library version: library is 80, caller expects 90 解决方法如下: 下载编译安装JPEG-9,下载地址http://www.ijg.org/ 。编译并安装到默认位置:/usr/local/ 使用下面的配置,重新编译ImageMagick-6.8.4,并且安装 $ ./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib –disable-static –with-quantum-depth=8 进入/usr/local/lib/下,查看一下libMagickCore-6.Q8.so的依赖库: $ ldd libMagickCore-6.Q8.so | grep -i jpeg 输出: libjpeg.so.9 => /usr/local/lib/libjpeg.so.9 (0xb711f000) libjpeg.so.8 => /usr/lib/i386-linux-gnu/libjpeg.so.8 (0xb67cb000) 结果显示ImageMagick已经正确连接到jpeg-9。 […]

Android使用多点触摸(一)

Android触摸事件分类 事件名 动作 ACTION_DOWN 按下第一个点 ACTION_POINTER_DOWN 按下第二个点 ACTION_MOVE 手势发生移动 ACTION_POINTER_UP 释放第二个点 ACTION_UP 释放第一个点 简单示例 activity_multitouch.xml <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.Multitouch” > <ImageView android:id=”@+id/imageView” android:contentDescription=”@string/DESC” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:src=”@drawable/aywdhz8u” android:scaleType=”matrix” > </ImageView> </RelativeLayout> Multitouch.java public class Multitouch extends Activity implements OnTouchListener{ Matrix matrix = new Matrix(); Matrix […]

mac os下编译android源代码

Mac OS: 10.7.5 在MacOS上编译android源码的前提是你所使用的文件系统必须是 大小写敏感 的。下面的内容旨在说明如何在不破坏原有文件系统的基础上建立一个供编译android使用的文件系统。 检查你现有的文件系统 依次打开 GO —-> Utilities —-> Disk Utility.app查看当前磁盘的格式,如下图: 在左侧栏中选中你希望在上面编译android的那块磁盘,查看右侧栏中的“Format”一项,如果format格式中带有“Case-sensitive”字样,那么恭喜你,你不需要再做任何操作即可开始编译android源码了,否则,继续往下操作。 确定磁盘空间 当然最方便的方法是把整个磁盘都重新格式成大小写敏感的文件系统,然后重新安装系统。但那样做的成本比较高并且很浪费时间。这里要谈的是不破坏原有系统的前提下,创建一块只供编译android的文件系统。首先需要确保你磁盘的剩余空间在30G以上,编译整个android大概会使用掉25G空间(Google官方显示至少25G)。 创建磁盘镜像 打开一个Terminal,输入如下命令: $ hdiutil create -type SPARSE -fs ‘Case-sensitive Journaled HFS+’ -size 60g YOU_FOLDER/android.dmg 这条命令在你所指定的文件夹中(YOU_FOLDER)创建了一个大小写敏感的可以自增长的最大为60GB的镜像。查看你的文件夹出现了新文件android.img.sparseimage。接下来把这个镜像挂载到系统: $ hdiutil attach ./android.dmg.sparseimage -mountpoint /Volumes/android 这条命令把上一步中创建的android.dmg挂载到了/Volumes/android下,以后这里就是我们编译android的地方。如果你希望每次开机的时候系统自动挂载这个镜像,你可以把下面的命令放到你的~/.profile中。 $ hdiutil attach YOU_FOLDER/android.dmg.sparseimage -mountpoint /Volumes/android 接下来就是把down下来的android源码拷贝到/Volumes/android目录下进行编译。