档案

作者存档

向Android SDK中添加自定义的库 (Addon)

12月 4, 2012 留下评论

一般情况下, Android中的第三方应用程序SDK都由开发者直接打包发布,在使用SDK的时候,将所需要的文件(jar、native共享库)加入到项目中 ,这是最通用的方式。不过对于每个应用程序而言,都需要引入包含独立的SDK的库文件,这使得应用程序的大小难以控制,尽管如此,这是对于不能修改Android ROM的前提下发布SDK的唯一可行方式。

如果可以自定义Andoid ROM或者独立控制ROM的发布(通常对于Android手机厂商而言),则可以将这些SDK库放到Android ROM的system下面,使得应用程序可以共享SDK库。在Android的源代码(AOSP)中,包含了PlatformLibrary这样一个例子
($ANDROID_SRC/device/sample/frameworks/)。

1. 编译PlatformLibrary并将其集成进Android ROM

在编译完成Android的Source Code之后, 删除生成的system.img,然后编译PlatformLibrary并将之集成进新的system.img中。
阅读更多…

分类:Android

Mac OS X中编译Android(AOSP)

12月 3, 2012 留下评论

在Mac OS X中编译Android(AOSP),基本步骤在AOSP的帮助文档中都有说明:
http://source.android.com/source/initializing.html
http://source.android.com/source/building.html

有一些细节问题需要注意:

  1. 新版本的XCode去除了SDK 10.6,需要设置额外的环境变量:
  2. $export UILD_MAC_SDK_EXPERIMENTAL=1
    $lunch full-eng
    
  3. 如果安装了MacPorts中的Bison,则需要注意在编译过程中避免使用它
    • 1, MacPorts中的Bison版本过新,会导致在编译WebKit的时候出现变异错误
    • external/webkit/Source/WebCore/xml/XPathParser.cpp:480:39: error: too many arguments to function 'int WebCore::XPath::xpathyyparse()'
      
    • 使用XCode自带的Bison而非MacPorts中的
    • $bison --version
      bison (GNU Bison) 2.3
      
    • 在WebKit中打上新的Patch用来解决这个编译问题:http://trac.webkit.org/changeset/124099
分类:Android

Chrome for Android的sandbox机制

11月 26, 2012 留下评论

与其他大部分浏览其不同的是,Chrome采用的是多进程框架(http://www.chromium.org/developers/design-documents/multi-process-architecture),多进程框架除了稳定、快速之外一个非常重要的特点是可以方便的提供Sandbox机制来隔离网页渲染以及不安全脚本,使得浏览器更加安全。关于Linux下面的Chrome的Sandbox机制前面的文章已经经过相应的分析,本篇主要分析Chrome for Android中的Sandbox机制的实现。
阅读更多…

分类:Browser

关于Chrome for Android

11月 25, 2012 留下评论

1, Chrome for Android与Chromium for Android

Chrome是google的一个商标, 所以我们谈及Chrome的时候特指由Google发布的Chrome浏览器,而Chromium则是Chrome浏览器的对应的开源项目(http://www.chromium.org/)。 简单的说Chrome即是在Chromium的源代码基础上做一些产品化的工作并由Google发布出来的浏览器。Chrome for Android亦是如此。

2, Chromium for Android的源代码

目前,Chromium for Android的源代码并没有完全开放出来。 开放出的元带埋在Chromium的源代码目录树中,只需要很少的配置即可变异出Android版本的Chromium所需要的核心模块。 在Chromium的源代码中, 主要的部分已经开源并可以工作(WebKit、多进程框架、页面渲染、基本的事件处理、单元测试模块以及一个用于测试的基本的浏览器Shell程序)。 可以采用Git来检出所有的源代码:
http://code.google.com/p/chromium/wiki/UsingNewGit

3, 编译Chromium for Android及测试运行Shell程序(Content Shell)

关于编译,具体可参照官方的链接:
http://code.google.com/p/chromium/wiki/AndroidBuildInstructions
有几点需要注意的是:
阅读更多…

分类:Browser

源代码中插入断点以方便调试

11月 21, 2012 留下评论

主要利用中断int 3:

#define DEBUG_BREAK do {asm volatile ("int3"); } while(0)

但是, 在没有attach调试器的情况下直接调用int3触发SIGTRAP会导致进程退出, 因此需要再这之前检查进程是否已经被调试器attach。
1,在OSX/BSD上可以使用sysctl来检测;
2,在Linux中可以通过读取/proc/self/status文件的TracerPid字段来检查进程是否被attach (如果未被attach, 则TracerPid:0);
3, Windows上则直接有IsDebuggerPresent API可以使用。
阅读更多…

分类:C/C++

Chromium相关的零碎

2月 7, 2012 留下评论

GPU硬件加速相关

  1. 可以通过”chrome://gpu”查看硬件加速相关的信息
Canvas: Hardware accelerated
HTML Rendering: Hardware accelerated
3D CSS: Hardware accelerated
WebGL: Hardware accelerated
WebGL multisampling: Hardware accelerated
  1. 对于特定硬件平台, 可能现在在chromium的blacklist中,通过”–ignore-gpu-blacklist”参数强制打开硬件加速
  2. 对于2D HTML5 cavas,通过”–enable-accelerated-2d-canvas”选项启用硬件加速, 对于WebGL, 通过”–enable-webgl”启用。
  3. “chrome://flags”中包含了更细化的选项,跟GPU相关的包括:”GPU Accelerated Painting”, “GPU Accelerated SVG and CSS Filters”, “Compositing with GPU”等等

阅读更多…

分类:Browser

合并不同的git仓库

2月 2, 2012 留下评论

“How to megre two git repository?”

假设有两个不同的git代码仓库repoA和repoB, 而我们希望将其在本地合并到一个git仓库”Code”,该如何完成呢?
我们期望将repoA的代码checkout到”Code/sourceA”中, repoB中的代码在”Code/sourceB”中。
在本地的git repository中开一个新的branch:

git checkout -b merged

首先,先检出repoA的代码:

git remote add -f repoA url_to_repoA
git merge -s ours --no-commit repoA/master
git read-tree --prefix=Code/sourceA -u repoA/master
git ci -m "merge repoA into our local repo"

然后,再检出repoB的代码

git remote add -f repoB url_to_repoB
git merge -s ours --no-commit repoB/master
git read-tree --prefix=Code/sourceB -u repoB/master
git ci -m "merge repoA into our local repo"

这样,本地的git仓库中的merged分支即合并了repoA和repoB的master

特别地, 在本地repoB作为repoA的子目录,即repoA的代码在Code中, 而repoB的代码在Code/sourceB中:

cd Code
git clone url_to_repoA
git remote add -f repoB url_to_repoB
git merge -s ours --no-commit repoB/master
git read-tree --prefix=Code/sourceB -u repoB/master
git ci -m "merge repoB into repoA"
分类:Git, Linux

gdb的远程调试

12月 23, 2011 留下评论

gdb的远程调试通过gdbserver和gdb配合完成, 在目标主机上运行gdbserver,宿主主机上通过gdb与gdbserver通信进行调试。

例如,需要调试目标机器上的chromium。
首先通过gdbserver来attach到需要被调试的chromium进程。gdbsever需要指定gdb与server通信的方式,通常采用TCP的方式,假设gdbserver在目标主机上的监听地址为”:8899″ (127.0.0.1:8899),下面的命令完成这一步周:

target$gdbserver :8899 --attach 13506
Attached; pid = 13506
Listening on port 8899
Remote debugging from host 127.0.0.1

阅读更多…

分类:Linux

Chromium浏览器中的Sandbox机制与实现(3)Seccomp sandbox

12月 20, 2011 留下评论

安全计算模式Seccomp(Secure Computing Mode) 是自Linux 2.6.10之后引入到kernel的特性,在进程进入了seccomp之后,它只能调用exit(), sigreturn(), read()和write()这几个系统调用(对应的文件描述符是在进入seccomp之前打开),其他的任何的系统调用都会引起内核发送SIGKILL信号结束进程。进程通过下面的代码进入Secure Computing模式:

prctl(PR_SET_SECCOMP, 1, 0, 0, 0);
//after this point, any system call other than exit,signreturn, read, write shall cause SIGKILL

在Chromium中,Seccomp Sandbox是Linux平台sandbox的另外一个重要的机制,它独立于上一篇讲的SUID Sandbox。在Chromium中,可以通过”–disable-seccomp-sandbox”和”–enable-seccomp-sandbox”来关闭或者打开Seccomp Sandbox。Chromium 15以后的版本都是默认打开seccomp sandbox, 通过ps,可以看到在打开一个tab的情况下,有如下几个chrome进程。
阅读更多…

分类:Browser

Chromium浏览器中的Sandbox机制与实现(2) SUID sandbox

12月 18, 2011 Comments off

本篇主要探讨Chromium中的SUID sandbox的实现。

1. Chromium中的Zygote机制

首先介绍一下Chromium中的zygote机制, 我们知道Chromium是多进程架构的,主要由一个UI进程(Browser),和多个渲染进程(Renderer)组成。 在一个新Tab中打开URL,chromium会创建一个新的Renderer进程对应于这个tab, 同时在UI进程(Browser)中创建Render Host对象负责与该Renderer进程交互。在Linux中,创建新的Renderer进程是通过Zygote来完成的。
执行”ps ax |grep chrome”, 我们可以看到下面几个进程

21696 pts/0    Sl+    0:15 /chromium/src/out/Debug/chrome
21736 pts/0    Sl+    0:00 /chromium/src/out/Debug/chrome
21738 pts/0    S+     0:00 /chromium/src/out/Debug/chrome --type=zygote
21761 pts/0    Sl+    5:03 /chromium/src/out/Debug/chrome --type=renderer --lang=zh-CN

阅读更多…

分类:Browser