源码编译已root的android rom

世界上所谓的root,其实就是用修改过的su,替换系统中受限制的su,达到为所欲为的效果。 这个修改过的su,由ChainsDD大神提供,慷慨地在github中开源了,由于su的权利太大,他同时提供了一个权限管理软件Superuser.apk,通常需要一并装入系统。 如果你有android系统源码,并且想编译一个原生带root的系统,可以按照以下步骤进行。 在源代码的system/extras目录,很容易可以找到su这个文件夹,这就是我们需要替换的地方,上这个网址https://github.com/ChainsDD/su-binary,下载源码替换之,编译后会在system/xbin生成su,但是程序通常会在system/bin查找su,所以我们需要在init.rc做一个链接到system/xbin/su :::sh symlink /system/xbin/su /system/bin/su 再把Superuser.apk,放到system/app里面,通常我的做法是在源码device目录的指定型号里面编写mk来达到这个目的。例如: :::sh PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/apk/Superuser.apk:system/app/Superuser.apk 编译并烧写系统,你会发现你的系统已经root了。 如果不太明白什么是root,可以到这个大神的FAQ页面:http://androidsu.com/superuser/faq/

April 29, 2013

如何在局域网搭建git服务器

在创业公司,什么东西都要自己搞定,除了开发android系统和研究内核,还要自己来搭建一个代码管理服务器。 其实搭建一个服务器非常简单,尤其只需要在局域网内搭建,网上已经提供好了我们需要的一切。 ##服务器的搭建 首先我们需要一个装有linux系统的计算机充当服务器,我这里是一台ubuntu12.04的系统。里面默认安装了perl和bash作为shell。 然后需要安装git-core,openssh-server等必备软件,在ubuntu 安装这些软件比较方便。 :::sh sudo apt-get install git-core openssh-server 创建一个叫做git的用户。创建步骤和可能出现的问题可以参见这里:http://lingavin.com/blog/2013/04/27/add-new-user/ ##gitolite3.0 安装环境后,就可以使用gitlote来搭建一个服务器了。首先是下载gitolite源码。网址是:https://github.com/sitaramc/gitolite 安装这个软件,首先要保证$HOME/bin文件夹存在,然后准备好客户机的xxx.pub文件。 这里会涉及到一个问题,什么是xxx.pub和为什么需要用这个文件。xxx.pub是客户端用sshkeygen生成的公钥。至于为什么需要初始化的时候提供这个文件,那是因为初始化后,这个提供公钥的客户机将成为gitolite的管理员,在客户机里管理各个版本库,所以需要在初始化的时候提供。 具体步骤就是: :::sh git cloen git://github.com/sitaramc/gitolite #下面这一步其实是在/home/git/bin做了一个软连接 gitolite/install -ln export PATH=/home/git/bin:$PATH gitolite setup -pk xxx.pub 完成了这几步,服务器的设置就算完成了。 ##客户端 客户端需要保证的是能够ping通服务器端,然后就是下载gitolite-admin这个仓库。命令如下: :::sh #请把host_ip替换为服务器的真实ip git clone git@host_ip:gitloite-admin.git 可以发现clone下来的版本库里面有两个文件夹,分别是conf keydir。 现在我们就通过添加一个开发者wang和添加一个仓库android4_0_3.git来演示如何操作这两个文件夹。 ###增加一个开发者 首先需要wang的公钥,不会生成公钥的话这里有个参考:https://help.github.com/articles/generating-ssh-keys 把wang的公钥改名为wang.pub放到keydir文件中,然后git add git commit git push 收工。 ##增加一个仓库 增加仓库需要到conf目录下,修改gitolite.conf :::java repo android4_0_3 RW+ = xxx RW = wang R = @all 加上上面内容,同样是git add git commit git push 就可创建一个名叫android4_0_3的仓库了。...

April 28, 2013

ubuntu增加新用户遇到的问题

使用useradd新增用户后使用su [用户名],结果只有一个$,显然不是熟悉的bash,只好自己配了。 用root用户来改变新增用户的终端为bash :::sh sudo passwd su usermod -s /bin/bash [username] 使用echo $SHELL看看是否修改成功。 然后你想在新用户里面使用sudo,结果跳出错误xx is not in the sudoers file. This incident will be reported 这时候还是需要请出root用户来解决。 :::sh chmod u+w /etc/sudoers gedit /etc/sudoers #在root ALL=(ALL) ALL 下面添加 [username] ALL=(ALL) ALL chmod u-w /etc/sudoers

April 27, 2013

自编写程序作为android系统app的编译记录

本blog记录了把自己编译的软件当做系统的app随着android的编译而加入到系统。 主要还是编写Android.mk 的问题,还有资源存放问题,这点系统编译比sdk编译要严格。 ##关于资源 有些人喜欢在xml里面写硬编码,例如android:text="hello world",这些在系统编译的时候一定会报错的,为了养成良好的习惯,方便以后做国际化,字符串应该放到strings.xml里面,而诸如style,color,甚至常用的数字常量都应该放入相应的文件夹。 虽然能够编译了,可能还会发生资源找不到的错误。大多是因为图片资源乱放的原因,例如 drawable drawable-ldpi drawable-mdpi drawable-hdpi 这几个常用的文件夹,android的图片加载策略是先看屏幕密度究竟是ldpi还是mdpi,又或者是hdpi,然后在该文件夹下找图片资源,找不到的话,再到drawable里面找图片资源,再找不到的话就报错,它不会遍历所有文件夹来寻找图片的,这就要求我们图片要方正确了,要兼容好的话最好每个文件夹都放上对应分辨率的图片。 ##Android.mk 系统编译脚本可以参考其他的系统应用程序,例如Setting。其中有一个注意的地方是如果引用了第三方的包,可以使用BUILD_MULTI_PREBUILT来把包引进编译流程,下面就是一个例子,其中还有aidl的参考编译方法。 还有一点就是如果需要系统权限,加上LOCAL_CERTIFICATE := platform。 :::java LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_STATIC_JAVA_LIBRARIES := \ android-common \ guava \ android-support-v13 \ android-support-v4 \ android-log4jlib \ jcifslib \ LOCAL_SRC_FILES := \ $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := package-test #LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-log4jlib:libs/android-logging-log4j-1.0.3.jar \ jcifslib:libs/jcifs-krb5-1.3.17.jar \ include $(BUILD_MULTI_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := src/com/xx/xx....

April 24, 2013

运行sudo出现command not found

在使用ubuntu时发现一些奇怪的现象,明明定义了PATH,而且普通用户也可以调用,sudo却调用不了,报command not found的错误。 google之后知道是编译sudo的时候加入了–with-secure-path,这个选项。 –with-secure-path[=PATH] Path used for every command run from sudo(8). If you don’t trust the people running sudo to have a sane PATH environment variable you may want to use this. Another use is if you want to have the “root path” be separate from the “user path.” You will need to customize the path for your site. NOTE: this is not applied to users in the group specified by –with-exemptgroup....

April 24, 2013

ubuntu简单安装bcompare

介绍一个简单在ubuntu上安装beyond compare的方法 最新的bcompare 不是3.3.5 ,但是懒得找新版本的序列号,所以就下这个版本了。 下面是下载的64位 3.3.5 版本的bcompare :::sh wget http://www.scootersoftware.com/bcompare-3.3.5.15075_amd64.deb 双击运行即可,可能需要下载依赖库,所以安装时间稍长 附送cd-key :::sh HmB5oANygQOhaStTHNa+zOKgOeWHOkeAp6d1+QwIebz6z9kwYCm9-O0jF9F79zvzed9v5UVC4VrDkDMmTM8nB+ 完毕

April 23, 2013

第六章:多文件操作

##概念 vim可以同时操作多个文件,缓存列表让我们知道我们打开了什么文件。vim允许我们在同一个窗口中同时查看两个文件,或者以tab的形式来操作文件。我们需要知道如何利用好它。 ##用缓存列表跟踪打开的文件 我们可以在一个vim中打开多个文件,vim允许我们使用缓存列表来管理这些打开的文件 文件和缓存之间的关系 像其他编辑器一样,我们可以使用vim来读文件,编辑文件和存储文件。我们可能以为我们编辑的是文件本身,其实我们是在编辑vim在内存中的缓存,这个就是vim术语上的缓存。而文件是存储在硬盘上的。当我们用vim打开一个文件,文件里的内容会读入内存中,开始的时候,缓存和本地磁盘中的文件内容是一样的,但是随着我们的编辑,缓存中的内容就会和磁盘的内容有所不同。当我们想保存修改时,我们需要输入命令来把缓存中的文件写入磁盘,命令为:write或者是:w。 在打开多个文件后,我们可以使用:ls来查看我们究竟打开了哪些文件, 我们可以看到#和%,其中%表示正在屏幕显示的文件,#表示当你按下<C-^>时可以切换到的文件,+表示该文件已被修改,但是还没有被存储,也就是缓存和磁盘的文件不一样。 :bnext,这个命令是跳转到下一个缓存,也就是跳到下一个已打开的文件。 :bprev,跳到上一个已打开的文件 :bdelete N1 N2或者**:bd**,可以删除指定序号的缓存。 :w[rite],保存文件 :e[dit]!,重置文件 :qa[ll]!,不保存退出 :wa[ll],保存所有打开的文件 ##同屏显示多文件 之前说过vim可以在同一个屏幕显示多个文件,如何做到的,很简单,通过下面的命令就可以了。 命令 影响 <C-w>s 分裂本文件 <C-w>v 纵向分裂本文件 :sp[lit] {file} 分裂打开指定文件 :vsp[lit] {file} 纵向分裂打开指定文件 <C-w>w 在同屏文件件转移 <C-w>h 向左转移 <C-w>j 向下转移 <C-w>k 向上转移 <C-w>l 向下转移 :on[ly] <C-w>o 只保留本窗口 <C-w>= 等分所有窗口 <C-w>_ 最大化本地高度 <C-w> [N]<C-w>_ 设置高度为N [N]<C-w>

April 22, 2013

第五章:命令行模式

##一个笑话 有人说,想快速生成一串无序字符串,就让新手来关闭vim吧,-_-!!!。 的确,在一开始接触vim的时候我也不会关闭,只是简单地按叉叉了事,可是第二次打开该文本,却有提示,很是不爽。一切都只能怪自己无知了。 那么究竟如何才是正确的关闭vim呢?这个问题涉及到这篇文章要讨论的vim另一个经常要用到的模式–命令行模式。进命令行模式的方法是在普通模式下按:,没错,是冒号。你会看到光标跳到最下面,这就对了。 除了按冒号,还记得之前的用vim做计算机吗?在编辑模式按<C-r>=,还有就是普通模式按下/也算是特殊的命令行模式了,这个主要用来搜索文本用的。 在冒号下的命令行模式我们可以做什么吗?答案是我们可以做很多事情,你会发现这又是vim强大的另一个原因。现在我们看看下面这个表 命令 效果 :[range]delete [x] 删除指定的行 [放到寄存器x中] :[range]yank [x] 复制指定的行 [放到寄存器x中] :[line]put [x] 把寄存器x的内容放到指定的行后面 :[range]copy {address} 复制特定行到指定的地址 :[range]move {address} 移动特定的行到指定的地址后 :[range]join 合并特定的行 :[range]normal {commands} 在特定的行运行命令 :[range]substitute/{pattern}/{string}/[flags] 把指定行的pattern替换为string :[range]global/{pattern}/[cmd] 匹配pattern的行运行命令 可能你会有疑问,range是什么,address是什么? 好,让我们来看看。 range and address range是范围的意思,在这里的范围,可以是一行,例如12,可以是连续几行,例如12,18表示12到18行(中间用逗号隔开),也可以是.即当前行,又或者$最后行,具体可看表格。 符号 含义 1 文件的一行 $ 文件最后一行 0 文件第0行(虚拟的) . 当前光标行 ’m 标记为m的行 ‘< 选择模式的开始 ‘> 选择模式的结束 % 整个文件(相当于:1,$) ##使用:t和:m命令来复制和移动文本 :t相当于:copy,我们可是使用这个命令来复制。例如下面的文本 :::java Shopping list Hardware Store Buy new hammer Beauty Parlor Buy nail polish remover Buy nails 我们想把第六行复制到第二行下面,我们就使用这个命令:6t....

April 15, 2013

第四章:可视模式

##遇见可视模式 什么是可视模式,那是一种可以让你任意选择文本的模式。最其他编辑器中,我们可能很习惯地用鼠标选择一段文本,复制,粘贴。但是在vim中,你会看到选择文本,可以玩出很多花样。 怎么进入可是模式?我们可以在普通模式使用v进入,然后用h j k l来移动。然后可以用c来删除选择的文字并进入编辑模式,或者可以y来复制这一段文字,或者只是d来删除。 除了普通的v,还有其他的可视快捷键,分别如下: 命令 效果 v 字符选择模式 V 整行选择模式 <C-v> 列选择模式 gv 重选上次选过的字符 我们可以在这几种模式之间切换,只要在选择模式下直接按那种模式的快捷键就可以了。而且我们可以用o来切换光标的位置。 现在我们可以来实践一下,相关命令如下 :::java vbb o e ##可以的话请使用操作符 可视模式对于点操作有短板,这个短板可以使用操作符来解决。例子如下: 假设我们需要把标签里面的小写转为大写 :::java <a href="#">one</a> <a href="#">two</a> <a href="#">three</a> 我们可以使用vit来选择one这样的被标签包围的字符。详细可以使用:h it来看到其详细的介绍。 接着,我们可以使用U来把选中的小写变大写,就像下面的操作那样 :::java vit U j. j. 看到了吗,在大三行的three,执行.只是把三个字符变成了大写。 使用普通模式操作符 看来可视模式解决不了问题,这个时候我们可以使用普通模式的操作符来解决这个问题。 在普通模式,使用gU来把小写变成大写,结合it,就可以改变标签包围着的字符的大小了。 :::java gUit j. j. ##用列模式来格式化表格 列模式是我最喜欢的模式之一,这个模式估计其他编辑器很难模仿,就让我们来看看它可以做什么神奇的事情吧。 有下面一个表格,我们想把它变得好看一些,如何做? :::java Chapter Page Normal mode 15 Insert mode 31 Visual mode 44 可以使用下面的命令,看好了。 :::java <C-v>3j x... gv r| yyp Vr- 相信这里所有的命令都会用,但是将它们组合起来需要熟练和灵感了。...

April 11, 2013

第三章:vim-编辑模式

##编辑模式下的快速改正 当我们使用vim编写文章的时候难免会打错字,除了按下退格键,在编辑模式下,我们可以使用其他方式来快速改正错误。 盲打的意A思并不仅仅是不看键盘打字,而是用感觉去打字(你觉得我走火入魔了么-_-!)。当盲打的时候,手指的感觉会比眼接收信息的速度快。我们不希望这时候节奏被打断,但是错误是在所难免的,如何快速改正错误变得非常重要。 在vim里面,可能你知道,在编辑模式下,除了使用退格键删除正在编辑的字符,还可以退回到普通模式,改正错误,再回到编辑模式。但这两种方法都感觉不太快速,因为退格键离键盘有点远,而后一种模式感觉更慢了,但是不用怕,vim为我们提供一些在编辑模式下使用的快捷键。 按键 效果 <C-h> 删除一个字符(退格键) <C-w> 删除一个英文单词 <C-u> 删除直到行的开始 你可能会问,为什么是\<C-h\>,而不是其他快捷键。我觉得是因为在vim中我们使用hjkl来移动,而h是向左移动,用\<C-h\>作为快捷键是非常直观的。 这些快捷键不仅可以在vim中使用,在bash中同样有效。 ##返回普通模式 我们在普通模式的时间可能会多于在编辑模式的时间(编写文章的时候除外),如何快速在这两种模式之间切换变得很重要,我们除了使用Esc来退回到普通模式,vim还为我们提供了快捷键。 按键 效果 <Esc> 转到普通模式 <C-[> 转到普通模式 <C-o> 转到临时普通模式 我们看到有一种新的模式是临时普通模式,这是什么?在这种模式下我们可以使用单一的普通模式下的命令然后立即返回到编辑模式。这个功能有什么实际用处吗?举一个例子,在普通模式下,我们可以使用zz来使光标所在的行移动到屏幕的中间。当我们写文章的时候,我们想把正在编辑的底部的文章上移到屏幕中间,我们不需要打一大串\<CR\>,我们只需要输入\<C-o\>zz,不需要回到普通模式,不需要狂按Enter,我们的文章已经从底部移动到屏幕中央。 ##不退出编辑模式粘贴暂存区内容 现在有以下文本,我们想把第一行的Learning Vim,复制到第二行的尾部。 :::java Learning Vim,by Gavin Lin Read Gavin Lin's 我们可以这样做: :::java yt, jA<space> <C-r>0 .<Esc> 我们来看一下这些命令都干了些什么,首先yt,是复制当前光标直到遇到,,jA<space>是移动到下一行,编辑行尾,然后输入空格。\<C-r\>0是在编辑模式下粘贴暂存区0的内容。再输入句号退出。 ##编辑的时候计算 当我们编j辑的时候需要做些简单的运算,不需要切换到计算机,vim就可以帮助你。 只要在编辑模式输入<C-r>=,就可以使用vim的计算器并返回计算结果。 ##输入不常用的字符 如果我们想输入大写字母A,通常只是Shift + a,但如果你知道它的字符编码065,你就可以在编辑模式输入<C-v>065,我们怎么知道字符的编码?你可以在那个字符上输入ga命令。 如果想输入¿呢?可以使用<C-v>u00bf,我们看到这个字符是大于三位的。而且是十六进制。:h digraph-table。 但是毕竟上述的输入方式有些反人类了,我们还要去查找某些字符的编码。这里我们介绍一些简单的方式。例如我们想输入¿,我们只需键入<C-k>?I,如此类推,如果想输入¡,只要输入<C-k>!I,这些够方便了吧。如果我们想输入½之类的,只要输入<C-k>12,又是一个方便的操作。详情可查:h digraphs-default 。 ##用替换模式来覆盖已有字符 只要我们在普通模式按下R,就会进入替换模式,输入字符来替换现有字符,行的长度不变,只想替换一个字符的话可以使用r。 本章就到这里了。

April 5, 2013