June 16th, 2010

如何建立android的C/C++交叉编译环境

  Android的底层是纯粹的linux内核,可以简单的理解为上面跑了个Dalvik Java虚拟机而已。因此,构建android上C/C++的交叉编译环境也就成为了一个很大的需求。特别是对于已经取得root权限的机器,如果能直接运行按需编译的二进制文件,那么将可以做很多有意义和有趣的事情。

  很不幸,Google没有直接给出如何建立这个交叉编译环境,但是我们可以借助Google提供的强大的NDK (Native Development Tools)来达到这一目的。NDK的本来目标是编译得到.so动态链接库文件,然后通过JNI提供给上层的Java调用,从而实现C/C++程序的简易迁移。而编译.so和编译成二进制可执行文件的过程是完全一样的,这就给了我们可以发挥的空间。

  有两种方式获取交叉编译所需的工具链:git下prebuilt这个project或者直接去下载NDK,我这里arm-eabi的版本是最新的4.4.0。

1
git clone git://android.git.kernel.org/platform/prebuilt.git

  然后创建一个helloworld.c文件。

1
2
3
4
5
6
//// root@delleon:~/android/myapp# cat helloworld.c
#include <stdio.h> 
int main() { 
  printf("HelloWorld!n"); 
  return 0; 
}

  接下来创建Makefile文件。注意修改其中的NDK_DIR和SDKTOOL为自己的目录,修改APP为自己的待编译程序主文件名。另外注意自己的arm-eabi的版本,若有变化则也需要修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#### root@delleon:~/android/myapp# cat Makefile 
APP=helloworld
 
NDK_DIR := ~/android/android-ndk-r4
NDK_HOST := linux-x86
SDKTOOL := ~/android/android-sdk-linux_86/tools
 
TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/bin/arm-eabi-
CC := $(TOOLCHAIN_PREFIX)gcc
CPP := $(TOOLCHAIN_PREFIX)g++
LD := $(CC)
 
COMMON_FLAGS := -mandroid -ffunction-sections -fdata-sections -Os -g 
	--sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm 
	-fPIC 
	-fvisibility=hidden 
	-D__NEW__
 
CFLAGS := $(COMMON_FLAGS)
 
CFLAGS += -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -DNDEBUG
 
CFLAGS += -UDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -ffunction-sections -funwind-tables -fstack-protector -fmessage-length=0 -Bdynamic
 
CPPFLAGS := $(COMMON_FLAGS) 
	-fno-rtti -fno-exceptions 
	-fvisibility-inlines-hidden 
 
LDFLAGS += --sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm 
LDFLAGS +=  -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc   
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0 
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc 
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/arm-eabi/lib 
LDFLAGS += -nostdlib -lc -llog -lgcc 
	--no-undefined -z $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtend_android.o 
 
OBJS += $(APP).o 
 
all:    $(APP) 
 
$(APP):    $(OBJS) 
	$(LD) $(LDFLAGS) -o $@ $^ 
 
%.o:    %.c 
	$(CC) -c $(CFLAGS) $< -o $@ 
 
%.o:    %.cpp 
	$(CPP) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ 
 
install: $(APP) 
	$(SDKTOOL)/adb push $(APP) /data/local/bin/$(APP) 
	$(SDKTOOL)/adb shell chmod 755 /data/local/bin/$(APP) 
 
run: 
	$(SDKTOOL)/adb shell /data/local/bin/$(APP) 
 
clean: 
	@rm -f $(APP).o $(APP)

  最后直接make,然后make install进手机里看一下吧。通过adb shell和手机里的Terminal等软件执行的结果是一样的。

toolchain

  后记:还有一个叫Codesourcery的工具链,下载下来有130多M,我使用它来编译helloworld时无误但是放到手机上则运行不起来。不想细究了,我认为NDK提供的工具链已经非常优秀。感兴趣的朋友可以自己试试Codesourcery。

Tags: , , , , , ,

June 8th, 2010

Linode 360 VPS BenchMark

  昨天帮实验室买了个Linode 360的VPS,梦寐以求哇,迫不及待的去折腾。选在了加州的fremont机房,北京网通的ping值大概在210ms左右,很极品的速度了,ssh上去交互只有一点点地小卡。装的CentOS 5.5,然后配了几个shell账号,通过he.net提供的tunnel broker增加了IPv6的支持,最后装了个启用passenger-ruby模块支持的nginx。明天继续折腾。

  下班前顺便跑了一下Unix Bench 5.1.2,硬件配置上是一颗Intel Xeon L5520 2.27GHz四核的CPU, 8M Cache, Xen虚拟化,360M RAM,16GB Hard Drive。结果如下。

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.2)

   System: li165-73: GNU/Linux
   OS: GNU/Linux -- 2.6.32.12-linode25 -- #1 SMP Wed Apr 28 19:25:11 UTC 2010
   Machine: i686 (i386)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Xeon(R) CPU L5520 @ 2.27GHz (4533.5 bogomips)
          Hyper-Threading, MMX, Physical Address Ext
   CPU 1: Intel(R) Xeon(R) CPU L5520 @ 2.27GHz (4533.5 bogomips)
          Hyper-Threading, MMX, Physical Address Ext
   CPU 2: Intel(R) Xeon(R) CPU L5520 @ 2.27GHz (4533.5 bogomips)
          Hyper-Threading, MMX, Physical Address Ext
   CPU 3: Intel(R) Xeon(R) CPU L5520 @ 2.27GHz (4533.5 bogomips)
          Hyper-Threading, MMX, Physical Address Ext
   18:35:04 up 1 day,  2:19,  1 user,  load average: 0.00, 0.00, 0.00; runlevel 3

------------------------------------------------------------------------
Benchmark Run: 二  6月 08 2010 18:35:04 - 19:03:21
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        9671772.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1914.6 MWIPS (10.5 s, 7 samples)
Execl Throughput                               1259.3 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        302168.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           77339.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        880748.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                              425294.5 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  22283.7 lps   (10.0 s, 7 samples)
Process Creation                               2188.1 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3003.2 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    846.0 lpm   (60.0 s, 2 samples)
System Call Overhead                         437322.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    9671772.5    828.8
Double-Precision Whetstone                       55.0       1914.6    348.1
Execl Throughput                                 43.0       1259.3    292.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     302168.6    763.1
File Copy 256 bufsize 500 maxblocks            1655.0      77339.6    467.3
File Copy 4096 bufsize 8000 maxblocks          5800.0     880748.9   1518.5
Pipe Throughput                               12440.0     425294.5    341.9
Pipe-based Context Switching                   4000.0      22283.7     55.7
Process Creation                                126.0       2188.1    173.7
Shell Scripts (1 concurrent)                     42.4       3003.2    708.3
Shell Scripts (8 concurrent)                      6.0        846.0   1410.0
System Call Overhead                          15000.0     437322.7    291.5
                                                                   ========
System Benchmarks Index Score                                         433.5

------------------------------------------------------------------------
Benchmark Run: 二  6月 08 2010 19:03:21 - 19:31:52
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       34776757.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     7017.4 MWIPS (10.3 s, 7 samples)
Execl Throughput                               4465.6 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        279935.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           73559.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        993067.5 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1545852.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 153438.0 lps   (10.0 s, 7 samples)
Process Creation                               4991.3 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   6503.9 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    985.1 lpm   (60.1 s, 2 samples)
System Call Overhead                        1479565.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   34776757.0   2980.0
Double-Precision Whetstone                       55.0       7017.4   1275.9
Execl Throughput                                 43.0       4465.6   1038.5
File Copy 1024 bufsize 2000 maxblocks          3960.0     279935.4    706.9
File Copy 256 bufsize 500 maxblocks            1655.0      73559.9    444.5
File Copy 4096 bufsize 8000 maxblocks          5800.0     993067.5   1712.2
Pipe Throughput                               12440.0    1545852.2   1242.6
Pipe-based Context Switching                   4000.0     153438.0    383.6
Process Creation                                126.0       4991.3    396.1
Shell Scripts (1 concurrent)                     42.4       6503.9   1533.9
Shell Scripts (8 concurrent)                      6.0        985.1   1641.9
System Call Overhead                          15000.0    1479565.4    986.4
                                                                   ========
System Benchmarks Index Score                                         999.7

Tags: , ,

June 7th, 2010

[MOD]屏蔽Sprint Hero黑屏时MENU键的解锁功能

本MOD功能:

  1. 原先手机黑屏后,不小心按下MENU键也会触发屏幕解锁。刷了这个补丁后则不会触发。这样手机放在兜里再也不用担心不小心碰到MENU键了。
  2. 除了修改MENU键屏幕解锁外,本补丁不影响原rom的其他任何功能。

适用机型:

  Sprint HTC HERO200

适用rom:

  基于Sprint官方1.5 / 2.1 RUU制作的所有rom(不适用于基于eris制作的rom)

安装方法:

  1. 下载附件,更名为update.zip复制到sd卡上
  2. 重启手机,按住小房子+挂机键进入Recovery模式,保险起见建议做个Nand Backup备份
  3. 不需要Wipe,直接刷这个update.zip

下载地址:

  keylayout.zip

PS. 感谢阿土伯、老梁为本补丁做的测试。刷机有风险,本人不对刷机失败负责。

Tags: , ,

June 4th, 2010

Sprint HTC Hero 2.1 Release成功提权到root

root

  从Sprint 5月19号发布官方2.1升级,到今天获取root,一共用了整整半个月的时间,期间我和其他朋友尝试过各种方法来试图获取都失败,怪不得Sprint发布2.1时老是跳票,其实绝大多数时间都是去给kernel打补丁去了。期间跟regaw讨论过好几次,都进展不佳,要找kernel版本为2.6.29的提权漏洞并且最好是5月份以后泄露的,这真是一件困难的事情。

  Regaw最后使用的办法是通过修改matt写的一个EVO 4G提权漏洞进而使帮助CDMA Hero也获取了提权。感谢大家的努力!

  另外在root的过程中我没有刷boot.img。昨晚我帮regaw重新打包了一遍boot.img,这个新boot.img与官方ruu版本中的boot.img唯一差别就是其kernel中的build.prop文件ro.security的值从1改为0。刷与不刷的区别就是,新的boot.img可以使得开机时即进入root,而保留原来的boot.img则需要开机后手动之行su命令才可以切换到root。

  历史会永远记住伟大的这一天(你们懂的)。需要获取root的请check这个连接:[GUIDE] How to Root Sprint 2.1 Release for CDMA Hero

Tags: , , , ,

December 31st, 2009

搬家到theplanet

  感谢Paveo曾经提供的高速而为稳定的CPH/LampDrive,永远会记住这一美好的时光。

  在国内继续待下去真的太纠结了。这次选择了出国,位于Dallas的theplanet机房。提供ssh账号。ping值在230~300之间,速度不是特别理想,但比蜗居在国内要强得多。

  搬出来的第一件事情就是删除首页的备案号。备案备案,备你个头。

Tags: , , ,

December 25th, 2009

Merry Christmas & Happy New Year

  收到了医生mm亲手缝做的抱枕,兔斯基也是mm自己画的。软软的,晚上抱着特别暖和^_^

mm送的抱枕

  还有一根骨头,民以食为天,我想mm的意思大概是让饿了就啃吧。这样温饱问题就都解决了,真周到啊,哈哈。可以啃的骨头

  觉得特别幸福,恩,谢谢亲爱的,Merry Christmas & Happy New Year !

Tags: ,

December 18th, 2009

5KB搞定wp-cumulus中文3D Tag问题

  wp-cumulus是我很久之前就推荐的一款3D Tag显示插件。效果非常cool。不过由于Flash本身的问题,3D标签云中不能显示中文。解决方案无非1.嵌入中文字体,不过这样导致swf文件的体积异常庞大;2.只在swf中嵌入常用的已有的标签文字,这样的话有新的Tag时也显示不出来。

  借鉴yujj同学和awflasher师兄的启示,通过修改wp-cumulus的源代码实现了对中文3D标签的支持,效果见右侧。

  yujj同学后来做了一个付费版本的中文3D Tag,不过这似乎不太符合wp-cumulus所声明的GPL协议。反正我把它破了,并且做了优化和小小的修改。现在无限制免费下载版本在这里http://www.lostleon.com/blog/wp-content/plugins/wp-cumulus/tagcloud.swf,只需要覆盖掉原来的swf文件即可。这个swf文件只有4.79kb,太完美了。

Tags: , , ,

December 14th, 2009

GTK 2.18.3与Linphone 3.2.1编译记录

  实验室有一个SIP相关的项目,客户端选用linphone。因为涉及到音频视频还有图形界面,所以依赖的包很杂,特别是GTK的编译安装。

1.环境:Fedora 7,内核版本2.6.21

2.需要编译的linphone版本3.2.1

3.GTK 2.18.3与Linphone 3.2.1的依赖关系如下:

linphone3.2.1依赖

linphone3.2.1依赖

Read the rest of this entry »

Tags: , , , , ,