linux(ubuntu 14.04)下编译linphone-android

首先下载源代码

linphone-android实际上很多submodules,只不过,国内访问linphone.org不太稳定,所以这里不用–recursive选项同时下载submodules。linphone-android主项目代码下载完成之后,可以用git submodule status和git submodule update来查看有哪些submodules并更新,git submodule update会(重新)下载没有下载成功、或者没有下载过的submodule,尽管不稳定,尽管会经历多次连接失败,磕磕绊绊地也能慢慢全部下载完成。

代码下载完成之后,根目录下的README文件列出了编译该项目需要安装的东西:

  1. Android sdk
    下载并解压Android sdk,然后使用SDK Manager下载最新的platform-tools和tools,以及其他安卓开发需要的组件。参考搭建linux(ubuntu 14.04)下的android开发环境
    将platform-tools和tools子文件夹目录添加到PATH环境变量中,假设Android sdk解压到/home/yanzs/android/android-sdk-linux,那么PATH的配置为再~/.bashrc下添加下面几行:
  2. 下载并解压Android NDK,将解压目录按照上述同样的方法添加到PATH环境变量中。
  3. 安装几个工具

    确保系统中有这几个工具:autoconf, automake, aclocal, libtoolize, pkgconfig(README文件的说法,应该是ubuntu系统里的pkg-config)。没有的话找到相应的软件包进行安装,我的系统里面这些工具都有了,所以也不知道是哪个软件包带的。
  4. 安装ia32-libs,参考 http://stackoverflow.com/a/23194339/1033539


    README里面提到安装下列软件包,不懂是作为ia32-libs的安装方法,还是另外的需要,我也一并装了

至此,准备工作完毕,可以直接运行make命令进行编译,保险起见make之前先clean一下

编译需要一会儿,编译成功treminal的输出是这样的

linphone-android-make-successful

所以,如果你在最后看到error,但是不相信命运往回找successful时,也许你能找到,但你只要告诉自己不能哭就行了。编译成功的话,生成的apk文件存放在bin目录下

将安卓手机用usb线连接电脑,运行make install就可以将前面编译好的apk文件安装在手机上了。

 

PS: 本文编译的linphone-android代码版本截图如下,如果你编译其他版本的代码不成功,也有可能是该版本源代码的bug,可以试试这个版本,如果编译成功,也能让自己斗志昂扬

linphone-android-gitk-revision

搭建linux(ubuntu 14.04)下的android开发环境

对于刚开始学习android开发的人来说,android开发环境的搭建还是比较复杂的,不仅在于需要理解各种概念、工具的作用,他们的关系;更是由于这些工具的开发者,google,的网站在国内是访问不了的。本文就来介绍一下如何从零开始搭建android开发环境,创建一个hello world手机app,并运行于AVM和智能手机上。

一、安装JDK

首先,安卓app使用java语言开发,因此编译app程序少不了JDK。而且,后面会提到的Android Studio也需要安装JDK(要求JDK7及以上的版本)才能启动。

虽然ubuntu的软件库里面有openjdk-7-jdk,可以很方便的安装,但android推荐使用oracle提供的JDK。Oracle版本的JDK8可以从官方页面下载,或者使用我的百度网盘分享。如果使用Oracle版本,记得把openjdk卸载掉。

下载之后解压,假设解压到/home/yanzs/java/jdk1.8.0_40。然后需要设置JAVA_HOME环境变量,方法是在~/.bashrc文件末尾添加一行:

这个设置对之后打开的terminal有效,要使其现有terminal有效,在对应的terminal窗口执行”source ~/.bashrc”命令(不包括引号)。

设置JAVA_HOME环境变量之后,Android Studio会自动使用这个版本的JDK。

二、安装SDK tools

SDK tools

开发安卓应用程序,涉及到对硬件的访问,以及界面设计中使用的控件等,这些功能都由Android API提供,并且有不同的版本。SDK tools提供了一系列工具,其中包括SDK Manager。SDK Manager可以下载、升级各个版本的Android API;并且管理一些工具,比如Platform-tools,Build-tools(有多个版本),甚至SDK tools本身。另外,SDK tools还提供了AVM(安卓设备模拟器)管理工具。

以上所说的,Android API,SDK tools,Platform-tools,Build-tools还有一些其他扩展接口,统称为Android SDK。不像其他框架的SDK,Android SDK分成各个组件,要通过SDK Manager来下载,所有没有一个下载Android SDK的页面、地址,只有SDK tools的下载地址。这也是会给初学者造成很大困扰的原因。

只不过,下载了SDK tools之后,其中的SDK manager以及通过SDK manager下载的其他组件都在SDK tools文件夹之下,可以真个拷贝到其他开发机子上,方便共享,这就是在网上能够找到的所谓”非官方版”或者”完整版”,”更新到XXX的版本”。

我们这里下载官方的SDK tools,下载地址见Android SDK下载页面末尾,SDK Tools Only部分。选择对应操作系统的版本,我这里下载linux版本,下载后解压,假设解压到/home/yanzs/android/android-sdk-linux目录。

使用SDK manager安装Android API

运行SDK tools目录下的tools/android打开SDK manager

SDK-Manager-without-proxy-setting-use-https

SDK Manager每次运行的时候,都会连接服务器,获取最新的组件列表,对比当前已经安装了的组件,以便用户进行安装、升级。从上图可以看到,SDK Manager获取组件列表的时候出错了,这很可能是因为它用https协议访问服务器,而JDK里面又没有安装对应的证书,参考http://www.java-samples.com/showtutorial.php?tutorialid=210。不过,我们这里不通过给JDK安装证书来解决问题,直接设置SDK Manager,使其强制使用http协议就行了。

通过菜单”Tools/Options…”打开配置窗口。

SDK-Manager-options

勾选”Force https://… sources to be fetched using http://…”,我这里同时设置了HTTP Proxy Server和HTTP Proxy Port,这是设置SDK Manager通过代理下载组件列表,以及下载组件本身。如果没有设置代理,会出现部分组件列表加载不了的情况,如下图。

SDK-Manager-without-proxy-setting

关于代理的设置参考AndroidDevTools,这个网站整理了很多安卓开发工具(包括本文提到要下载的所有软件包),并用百度网盘分享,值得拥有。经过这些设置之后, 就可以正常加载组件列表并下载组件了。

SDK-Manager-initially-opened

可以看到,Android SDK Tools已经安装了,这是理所当然的,因为我们下载的就是SDK Tools。

另外,可以看到SDK Manager自动帮我们勾选了一下tools和API,这些都推荐安装。需要注意的是,默认SDK Manager只会勾选最新版本的Android API,后面创建的安卓应用程序尽管是使用这个版本的API,但只要不调用新版本才提供的接口,就仍然可以在低版本的安卓手机及AVM上运行。除了默认勾选的组件之外,参考下面的两个页面,可以选择安装其他一些组件。如果有些组件没有安装,可能连Hello World程序都编译不过:

选择好后,点击”Install XX packages”按钮开始下载安装,文件比较大,看一部电影再回来。

三、安装Android Studio

Android Studio可以从Android SDK下载页面下载,从说明中可以看到,这个Android Studio集成了SDK Tools等一些组件。问题是,Android Studio运行的时候会自动下载一些SDK组件,而且在组件成功下载之前你还不能打开SDK Manager进行前面说过的https和代理设置,因此不能成功下载组件。。。这就是为什么我们前面单独下载SDK Tools Only的原因。

假设Android Studio解压到/home/yanzs/android/android-studio。运行之前,需要进行设置,使其跳过前面说过会导致问题的自动下载SDK组件这一步骤。打开bin/idea.properties文件,在末尾添加一行:

然后可以运行bin/studio.sh打开Android Studio。在创建/打开安卓项目之前,需要先配置Android SDK路径,以及JDK路径。

android-studio-configure android-studio-project-defaults android-studio-project-structure

android-studio-sdk-location

Android Studio的设置可以参考Android studio 1.1.0 Hello world!

至此,开发环境算是设置完了。 接下来就可以创建Hello World了。

四、Hello World!

在初次运行Android Studio打开的”Welcome to Android Studio”窗口,点击Start a new Android Studio project按钮创建项目,向导会指引你选择模板,选Blank Activity就可以了。创建好之后会进入Android Studio IDE,之后每次打开Android Studio也会直接进入IDE。

这样创建的App就是一个Hello World程序。

android-hello-world-run

点击工具栏的运行按钮开始执行,如果必要的组件都有安装,编译成功之后会让你选择一个AVM或者连接的Android手机进行测试,过程就不细说了。如果编译失败,返回前面使用SDK manager安装Android API一节,确保安装了需要的组件。

制作各操作系统的U盘安装盘

windows底下,可以用UltraISO工具

  1. 运行UltraISO,打开操作系统ISO文件
  2. 接入U盘
  3. 在UltraISO中,选择菜单”启动/写入硬盘映像…”
  4. “硬盘驱动器”一项选择需要制作成启动盘的U盘
  5. “写入方式”选择USB-HDD,这种方式兼容性更好,有时候选择其他方式制作的启动盘无法启动,而使用这种方式重新制作之后就可以启动了
  6. 点击”写入”按钮

UltraISO可以制作Ubuntu 14.04系统

linux底下,可以使用Startup Disk Creator(terminal命令是usb-creator-gtk,安装usb-creator-gtk软件包)工具制作启动盘

  1. Source disk image中选择操作系统ISO文件
  2. Disk to use中选择目标U盘
  3. 点击Erase Disk清空U盘现有文件,也可以用分区工具(比如GParted)先将U盘格式化。即便制作的是linux系统,也可以将U盘格式化为FAT32格式。

Startup Disk Creator可以制作Windows 7 ultimate,以及Ubuntu 14.04系统

linux下用c语言实现UPnP设备检测

UPnP 是一个用于查找、控制网络设备的协议,一般的IP设备,比如打印机、网络摄像机都有支持UPnP协议。当一个支持UPnP协议的设备添加到网络中的时候,它会像网络通知它的存在。我们也可以在应用程序主动搜索当前网络中的UPnP设备。UPnP协议的说明可以参考 UPnP Device Architecture 1.0 

pupnp 项目是linux下对UPnP协议(V1.0)的一个实现,它提供了一个C语言的API。由于我只是想查找局域网内的网络摄像机,而pupnp没有提供一个工具让我测试一下它是否能够帮我找到,所以我没有去研究。

相反的,gupnp 项目提供了一个gssdp-discover命令行工具(安装gupnp-tools),可以搜索局域网内的upnp网络设备()。并且,gupnp的API文档看起来不会那个吓人,研究了一两个小时也写出了一个类似于gssdp-discover的工具,能够搜索到局域网的打印机和IP摄像机。我的C语言水平,只限于学过语法,还有就是前几个星期研究过一个星期左右GStreamer开发,与gupnp类似,GStreamer也是使用gnome的GObject, GLib,所以多少有些相似之处。

首先来看看gssdp-discover的运行情况:

我的局域网内有一台打印机和一个网络摄像机,gssdp-discover搜出了5个设备和服务,其中网络摄像机占4个,应该是包含了内嵌的设备和服务。使用upnp搜索设备的时候,可以指定需要搜索哪些类型的设备,下面列出的代码中可以看到这个参数。

下面是我使用gupnp API写的类似与gssdp-discover功能的一个C程序。

假设这个程序保存为文件detect.c,那么可以使用如下命令进行编译:

可以看到,这个程序依赖两个库,gssdp-1.0和gtk+-3.0,因此需要先安装这两个程序库。gssdh-1.0是gupdp项目的一部分,包含在软件包libgssdp-1.0-dev中。gtk+-3.0不记得是在哪个软件包中的了,后面我会在一个新的系统中试一下。

关于这个程序的几点说明:

  1. 第1行, 引用”libgssdp/gssdp.h”头文件,这个是 gssdp-1.0的一部分,包含GSSDPClient,GSSDPResourceBrowser等类型的定义。因此编译的时候需要指定”gssdp-1.0″库,其官方网站及API文档见https://developer.gnome.org/gssdp/unstable/
  2. 第24行,第二个参数NULL,表示自动检测该使用哪个网络接口。使用的网络接口可以用gssdp_client_get_interface函数获取。
  3. 第30行,criteria参数指定需要搜索哪些设备,API 文档中有关于这个参数的说明。
  4. 第32行,监听GSSDPResourceBrowser上的resource-avaiable信号,gssdp会为每个找到的upnp设备触发这个信号。监听信号的方法是GObject开发中通用的,即采用g_signal_connect方法实现监听,调用这个方法需要在编译的时候引用”gtk+-3.0″库。
  5. 第35-36行,创建并执行GLib主循环。很多GNome项目的程序都得通过GLib主循环来执行,比如这里的gssdp,还有我前段时间研究过的GStreamer。

 

 

 

vim用法

plugin

filetype

vim自带了一些filetype plugin,你可以在$VIMTUNTIME/../ftplugin/中找到。VIMTUNTIME环境变量只有在vim编辑器中才有设置,要查看它的值,先打开vim,命令模式下输入:e $VIMRUNTIME/,然后按tab键就可以看到了。

需要安装某个文件类型的plugin,只需要将上面目录中对应的文件拷贝到~/.vim/ftplugin/中

linux下制作debian usb安装盘

一般说来,在linux下制作linux系统的usb安装盘,可以直接用”bootable usb creator”。比如我在ubuntu上就用这个工具成功制作过ubuntu和debian的usb安装盘。

可这个工具虽然方便,但由于整个过程全自动,除了问题也不懂怎么解决。比如我的一个u盘制作了多次安装盘之后就不能用bootable usb creator制作新的usb安装盘了,写入的时候报一个类似“invalid version number”的错误。

这里就介绍一种比较复杂的,手动步骤比较多的制作debian usb安装盘的方法。

partition

如果你的u盘比较大,整个u盘用来制作安装盘有点浪费,因此可以先将U盘分区,一个分区用于制作安装盘,另一个分区存储其他数据。如果之后需要制作其他启动盘,还可以再分区。

linux下可以用GParted来分区,Debian系统iso文件只有600多M,因此分1G就够用了。下面假设将U盘分成两个fat32分区,并将第一个作为debian启动盘。分区的时候为启动盘分区设置boot属性(同样可以再GParted里面设置)。

detec usb device name

在linux下运行fmesg命令检测连接的各磁盘名称,如果你只有一块硬盘,U盘一般会被命名为sdb。下面假设U盘名称就是sdb,我们要将系统文件安装在它的第一分区,也就是sdb1,如果你的U盘不是这个名称,请对应修改。

install MBR on the USB device

将sdX替换为你的U盘的设备名,比如sdb。

install-mbr来源于mbr 包,如果找不到该命令,请安装mbr。

create filesystem on the partition

将sdX替换为你要安装启动盘的U盘分区名,比如sdb1。

mkdosfs来源于dosfstools 包。

install a bootloader on the partition

我们使用syslinux bootloader,先确保你的系统安装了syslinux 和mtools 

安装bootloader之前确保该分区已经unmount,可以再GParted里面做这个操作。

将sdX替换为你要安装启动盘的U盘分区名,比如sdb1。

”This procedure writes a boot sector to the partition and creates the file ldlinux.sys which contains the boot loader code.“

add installer image to the partition

首先确保已经mount该分区(mount /dev/sdX1 /mnt)。

从 http://http.us.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/hd-media/ 下载两个文件:vmlinuz和initrd.gz。如果使用直接在这个目录下这两个文件,那么制作的debian安装盘是用键盘操作的,不识别鼠标。如果要用鼠标操作,改用gtk子目录下的两个同名文件。

下载后将这两个文件放在分区根目录下

create a syslinux.cfg configuration file on the partition

在分区根目录下创建一个名为syslinux.cfg的文件,至少包含以下两行:

如果上一步下载的installer image是gtk目录下的文件,那么上面第二行最后要添加“ vga=788”(不包括引号)。

如果要在U盘启动的时候等待按回车键继续,在文件末尾添加一行:

 copy the ISO file of a Debian ISO image to the partition

接下来就可以将Debian系统文件(iso格式)拷贝到分区根目录下了。

Debian cd文件有好几个,一般命名为XXXcd1.iso, XXXcd2.iso 之类的,我们安装系统只要下载第一个就可以了,其他的估计是一些软件包,我们可以根据需要直接在系统里面联网安装就行了。

完成之后unmount分区,usb系统安装盘就制作完成了。

使用wget下载百度网盘共享文件

百度网盘分享的文件,并没有一个永久的下载链接,每次通过浏览器点击下载按钮的时候,实际上是向一个临时的下载地址发送数据请求,同时上传cookie数据。

在没有安装桌面的linux服务器下,没有可视化的界面去访问百度网盘下载文件。我们可以使用wget来下载文件,不过需要指定发送的cookie数据。cookie数据可以在一台桌面主机上生成,方法是通过浏览器访问该下载页面(或者只需要访问百度网盘就行了),然后chrome有一个叫cookies.txt(发布者是shaney.net)的扩展程序可以将同一个域名(比如baidu.com)的cookie保存成一个cookies.txt文本文件。

将生成的cookies.txt文件上传到需要使用wget下载的linux服务器。然后使用如下命令进行下载:

-c用于断点续传,–load-cookies指定下载的时候要向网盘服务器传输的cookie数据文件,-O指定保存的文件名。比如:

 

grub2

我在一台主机上先后安装了3各操作系统,Windows 7,以及32位和64位的ubuntu 14.04。安装完64位ubuntu之后发现启动菜单变得很乱,于是进入Windows用一个叫EasyBCD的工具修改启动菜单。结果导致整个MBR里面没有启动项,重启之后任何系统都进不了了。

我的解决方法是用之前制作的ubuntu系统的USB启动盘进入ubuntu试用系统,以便安装grub2 boot loader。grub boot loader的文档请参考官方资料

安装grub2

首先查看各物理硬盘及其分区:

挂载要安装grub2的分区:

安装grub菜单

接下来我直接重启进入grub boot loader。不过我看到的grub是命令行方式的。接下类可以通过命令来进入安装在硬盘上的各系统:

启动系统

  1. 进入32位ubuntu系统

     
  2. 64 ubuntu

    安装在sda7分区上的64位ubuntu系统也可以通过类似的方式启动
  3. 进入windows 7系统

     

==============关于BIOS、 boot loader、MBR的知识碎片,待整理=================

PC开启的时候,先会运行BIOS。BIOS可以根据优先级启动各种设备(U盘,硬盘,光驱)中的一个,优先级可以在BIOS(开机的时候按DEL或者F12键进入)中进行设置。BIOS启动某一个设备的时候,执行该设备MBR(Master Boot Record)里面的boot loader。

MBR是一个512字节的block,位于存储设备的第一个sector,MBR中存储了分区表和boot code(boot loader)。MBR之后,才是该设备的各分区。在MBR的512字节中,boot code占了446字节,4个主分区记录各占16字节,还有两个字节是MBR signature。

boot loader的作用是选择并加载操作系统内核,然后将控制权交给操作系统。每个操作系统都会带一个可以加载该系统的boot loader,有些boot loader可以启动多种操作系统。

Window系统中,XP及更早的版本使用NTLDR boot loader,Windows Vista及之后的系统使用BOOTMGR。linux系统有更多支持的boot loader,包括ISOLINUXLILOGRUB

前面说过,MBR中只有4个主分区记录,这就是为什么存储设备(比如硬盘)分区的时候只能有4个主分区的原因。如果分区的时候,创建3个主分区和一个扩展分区(extended partition, logitical partition),那么MBR中的最后一个主分区记录实际上是一个分区表(扩展分区表)。扩展分区表存储各逻辑分区(logical volumes)的信息。

一个存储设备除了有MBR之外,每个分区(主分区或者逻辑分区)都有自己的boot sector,叫做volumne boot record(VBR)。由于MBR中的boot loader可能不知道如何加载一个操作系统的内核,因此它需要通过VRB中的boot loader来加载这个操作系统,比如GRUB不懂如何(直接)加载Windows系统,就得先加载Windows自身的boot loader(比如BOOTMGR),然后由BOOTMGR负责加载Windows系统。这个过程就是所谓的chain-loader。

GRUB Boot loader –> Windows Boot loader –> Load Windows Kernel

Windows的boot loader只能加载主分区的Windows操作系统,因此Windows必须得安装在主分区,否则windows boot loader无法启动Windows;GRUB可以加载主分区和逻辑分区的多种操作系统,包括直接加载linux系统,通过chain-loader加载Windows系统。接下来我们重点说一下GRUB2。

很多linux系统本身集成(安装)了GRUB2,这里说安装是指在操作系统中安装了相关的软件包,但操作系统安装过程中一般允许你选择是否需要将GRUB写入到MBR中。系统中安装的软件包提供了一系列命令行工具,用于检测硬盘中的各操作系统,生成启动菜单,更新MBR中的boot loader,更新VBR中的boot loader。这些命令会用到的一些相关文件包括:

  1. /etc/default/grub,这个文件设置一些变量的值。
    GRUB_TIMEOUT:等待这么多秒之后自动加载默认系统,我在Ubuntu 14.04 LTS系统的GRUB中配置这个值为0(直接加载默认操作系统),发现生成的grub.cfg中有那么一项检查,如果TIMEOUT为0就改成10。所以可能要使GRUB直接加载默认操作系统出了改这个值之外还需要做其他设置。
  2. /etc/grub.d,这个文件夹包含一些脚本和模块

以下是一些GRUB命令的说明:

  1. sudo update-grub,或 sudo mk-config
    根据前述的/etc/default/grub文件中的变量设置,生成grub.cfg文件。update-grub命令等同于mk-config -o /boot/grub/grub.cfg,也就是说将生成的文件直接存放在/boot/grub文件夹中,下次启动的时候就能看到效果。
  2. sudo grub-install /dev/sda
    这条命令将grub boot loader安装到MBR中,当前MBR中的boot loader会被替换。安装过程中会创建/boot/grub文件夹(如果之前没有安装过的话)。如果/boot/grub文件夹下没有grub.cfg文件,重启进入的GRUB2是命令模式的,需要通过输入命令来启动各系统。因此,正常流程是先运行grub-install安装GRUB到MBR中,然后运行udpate-grub生成grub.cfg文件,这个grub.cfg包含当前磁盘中存在的各操作系统,并且会生成一个菜单供选择。

以上说的是GRUB2,前面说过,GRUB2能够能够加载包括逻辑分区在内的任意分区里的操作系统。不过它chain-loader加载Windows系统的时候可能会出现橙色屏幕的情况。

另一种选择是在MBR中通过EasyBCD写入Windows boot loader。EasyBCD操作界面如下:

EasyBCD

  1. “View Settings”或者”Edit Boot Menu”里面能够看到当前的启动菜单设置。
  2. “Add New Entry”可以将某个系统添加到启动菜单中,在Linux/BSD tab中,Drive选项可以选择该系统在哪个分区,注意这里可以选择逻辑分区。前面说过Windows boot loader只能加载主分区里面的操作系统,不懂EasyBCD是怎么实现加载逻辑分区的,不过有一点可以肯定,就是通过EasyBCD加载linux操作系统的时候,也是使用chain-loader。
  3. “Edit Boot Menu”能调整各系统在菜单中的顺序,设置默认操作系统,等待时间等等。

在我的Windows 7系统中,EasyBCD的boot loader会安装在硬盘第一个分区(100M的系统保留分区,应该是安装Windows 7的时候创建的),”Add New Entry”及”Edit Boot Menu”里面所做的改动直接生效(当然,”Edit Boot Menu”里面还得点击”Save Settings”按钮)。如果MBR中是Windows boot loader,那么直接在第一个启动菜单就能看到;如果MBR中是其他boot loader(比如GRUB2),那么选择启动Windows之后,chain-loader会加载EasyBCD在100M系统保留分区的启动boot loader。

如果也需要将boot loader写入到MBR中,只需在”BCD Deployment”中,选择”Install the Windows Vista/7 bootloader to the MBR”并点击”Write MBR”。这一步骤只需要做一次,以后Add New Entry,Edit Boot Menu的修改直接生效。如果使用EasyBCD之前MBR中本来就是Windows bootloader,连这一步骤都不需要做了。

针对EasyBCD,我的理解是,无论是MBR还是VBR(100M系统保留分区)中的boot loader,都只是boot loader的一小部分,剩下的boot loader代码以及配置就是EasyBCD中”Add New Entry”及”Edit Boot Menu”修改的部分。

域名解析相关

万网的域名解析:

显性URL/隐性URL

以下红字部分是来自万网的警告

【注意】根据工信部关于域名跳转服务的政策要求,URL转发功能目前只支持网站有备案号且接入商是万网的域名转发需求,网站无备案号或接入商不是万网的域名转发需求暂不支持。

也就是说,只有你的域名通过备案之后,才能为其设置域名转发,不管是转发到这个域名的子域名,还是转发到其他域名。