2013年9月30日 星期一

[轉 ]repo 的一些用法和理解

repo的用法(zz)


註:repo只是google用Python腳本寫的調用git的一個腳本,主要是用來下載、管理Android項目的軟件倉庫。(也就是說,他是用來管理給git管理的一個個倉庫的)
下載 repo 的地址: http://android.git.kernel.org/repo ,可以用以下二者之一來下載 repo
wget http://android.git.kernel.org/repo 
或者 
curl http://android.git.kernel.org/repo > ~/bin/repo  
下載完成後須修改repo的權限: chmod a+x ~/bin/repo 

用repo sync 在抓去 android source code 的時候,會經常出現一些錯誤導致 repo sync 中斷,每次都要手動開始。 可以用如下的命令,來自動重複
$?=1; 
while [ $? -ne 0 ] ; 
do  repo sync ; 
done

獲取幫助:
repo help [ command ]   //顯示command 的詳細的幫助信息內容
示例: repo help init 來獲取 repo init 的其他用法

repo init -u URL 用以在當前目錄安裝 repository ,會在當前目錄創建一個目錄 ".repo"  -u 參數指定一個URL, 從這個URL 中取得repository 的 manifest 文件。   
示例:repo init -u git://android.git.kernel.org/platform/manifest.git
獲取的manifest文件放在.repo目錄中。命名為manifest.xml。這個文件的內容其實就是所有被git管理的倉庫的列表!

可以用 -m 參數來選擇獲取 repository 中的某一個特定的 manifest 文件,如果不具體指定,那麼表示為默認的 namifest 文件 (default.xml)
repo init -u git://android.git.kernel.org/platform/manifest.git -m dalvik-plus.xml
(有諸多供我們選擇的manifest文件,所有的manifest文件都放在目錄.repo/manifests中,該目錄本身亦被git所管理,你可以cd進去看看)

可以用 -b 參數來指定某個manifest 分支。
repo init -u git://android.git.kernel.org/platform/manifest.git -b release-1.0
你會發現.repo/manifests是個被git管理的倉庫,這裡放的是所有的manifest文件(*.xml),因為被git管理,固然有分支,-b可以切換到你想要的分支然後再下載相關的xml文件,當然具體下載那個xml還要看-m參數了,所以如果你僅僅指定-b而沒有-m的話,就是下載-b指定分支下的default.xml文件
如果不指定-b參數,那麼會默認使用master分支

4. repo sync [project-list]
下載最新本地工作文件,更新成功,這本地文件和repository 中的代碼是一樣的。 可以指定需要更新的project , 如果不指定任何參數,會同步整個所有的項目。
如果是第一次運行 repo sync , 則這個命令相當於 git clone ,會把 repository 中的所有內容都拷貝到本地。 如果不是第一次運行 repo sync , 則相當於 git remote update ;  git rebase origin/branch .  repo sync 會更新 .repo 下面的文件。 如果在merge 的過程中出現衝突, 這需要手動運行  git  rebase --continue

5. repo update[ project-list ]
上傳修改的代碼 ,如果你本地的代碼有所修改,那麼在運行 repo sync 的時候,會提示你上傳修改的代碼,所有修改的代碼分支會上傳到 Gerrit (基於web 的代碼review 系統), Gerrit 受到上傳的代碼,會轉換為一個個變更,從而可以讓人們來review 修改的代碼。

6. repo diff [ project-list ]
        顯示提交的代碼和當前工作目錄代碼之間的差異。

7. repo download  target revision
        下載特定的修改版本到本地, 例如:  repo download pltform/frameworks/base 1241 下載修改版本為 1241 的代碼

8. repo start newbranchname .
        創建新的branch分支。 "." 代表當前工作的branch 分支。

9.  repo prune [project list]
        刪除已經merge 的 project

10. repo foreach [ project-lists] -c command
       對每一個 project 運行 command 命令

12. repo forall -c 
這個命令會遍歷所有的git倉庫,並在每個倉庫執行-c所指定的命令(這個被執行的命令就不限於僅僅是git命令了,而是任何被系統支持的命令,比如:ls 、 pwd 、cp 等等的 )
當我想通過這個命令遍歷所有的倉庫並在每個倉庫執行"git checkout . "用以將每個倉庫的改動都清除的時候,我這麼輸入命令:
repo forall -c git checkout . 
我發現這樣根本不行。看來repo不能遍歷執行checkout這個命令。今天我終於想到了另外一個命令"git reset --hard HEAD" 哈哈
repo forall -c git reset --hard HEAD
再說一個新發現:以前用repo forall 執行一些命令的時候,可能再遍歷到某個倉庫的時候出了問題,但是我卻苦於不知道這個倉庫到底是哪個!一直也沒有解決。今天終於找到了。。。。  關鍵時候還是要看命令自己帶的幫助手冊呀。。。
repo help forall  用這個命令查看下針對forall的幫助吧。說的很清楚,repo執行的時候加上-p參數就可以在遍歷到每個倉庫的時候先打印出當前的pwd,然後再繼續執行-c所指定的命令。舉例如下:
repo forall -p -c git branch    

//該命令會遍歷所有倉庫並打印每個倉庫的分支情況,由於有了-p參數,這樣便會打印出每個倉庫的路徑!!!

11. repo status
       顯示 project 中每個倉庫的狀態,並打印倉庫名稱。

201111071237 更新
yasin.lee.x 
———————————————————————————————————————————————————————
cpp@cpp:~$ repo
Traceback (most recent call last):
  File "/home/cpp/bin/repo", line 91, in ?
    import readline
ImportError: No module named readline
cpp@cpp:~$
———————————————————————————————————————————————————————
系統裡明明有readline,可是repo腳本卻無法導入,後來查到應該是python安裝導致的錯誤,應該在python編譯時加上關於readline的編譯選項,應該按照如下操作安裝python
首先安裝readline軟件包:
sudo apt-get install libreadline5-dev
sudo apt-get install zlib1g-dev
然後下載python源碼進入python源碼目錄,編譯並安裝python:
1. make distclean
2. ./configure  --enable-readline  BASECFLAGS=-U_FORTIFY_SOURCE
3. make -j4
4. sudo make install
注意,我同時發現在python-2.4.3版本是支持該編譯選項的,而在3.1.3版本中是不能識別這個--enable-readline編譯參數的。所以我目前使用2.4.3版本。

2013年8月5日 星期一

[轉] Android Property

Introduction Android Property 是系統的環境變數設定 這邊有一篇文章,寫得還不錯啦 http://blog.csdn.net/loughsky/archive/2008/11/14/3297286.aspx Android Property有點像我們windows的registery 個人是這樣的覺得 Android 裡面很多都有用到property_get/property_set的function來設定或獲得變數 你可以使用這邊的library: /device/lib/cutils int property_get(const char *key, char *value, const char *default_value); int property_set(const char *key, const char *value); 那當system起來的時候,會去Load幾個property的檔案 /default.prop /system/build.prop /system/default.prop /data/local.prop 每個裡面代表不同的設定值 很多Android的AP都會base on 這些property去做一些行為 而property又分幾種 01. "ro." : read only 02. "persist.": then when setting this property, the value will be written to /data/property, too. 03. "net." : when when setting this property, the “net.change” property will be set automatically to contain the name of the last updated property. 04. "ctl." :The property “ctrl.start” and “ctrl.stop” is used to start and stop a service. Android Tools 使用者可以使用這些指令來看系統目前的property設定 getprop setprop Good Luck!

2011年7月13日 星期三

[轉][Kernel Driver] 撰寫簡易 Timer 機制

在底層 Linux Kernel 提供了時序(timing)機制,方便驅動程式設計者所使用,核心是依據硬體發出的『計時器中斷』來追蹤時間的流動狀況。我們可以依據 HZ 的值來設計 Delay 機制,讓驅動程式可以每隔固定一段時間啟動或者是發出訊號,
也可以利用 Timer 來讓 LED 閃爍變化,在介紹 Timer API 之前,
可以先參考 Linux Kernel: 簡介HZ, tick and jiffies 這篇文章,瞭解一些相關名詞,
舉例:如果想知道一秒後的 jiffies 時間,可以寫成底下:

#ifdef CONFIG_BMA150_TIMER
#include
#endif
j = jiffies;
/* 一秒之後 */
stamp_1 = j + HZ;
/* 半秒之後 */
stamp_1 = j + HZ/2;
/* 20秒之後 */
stamp_1 = j + 20*HZ;


利用 jiffies 來反算時間
diff = (long)time2 - (long)time1
msec = diff * 1000 / HZ;

2011年2月16日 星期三

[轉]核心原始碼下的次目錄

在核心目錄下,基本上有底下這些東西:

arch :與硬體平台有關的項目,大部分指的是 CPU 的類別,例如 x86, x86_64, Xen 虛擬支援等;
block :與區塊裝置較相關的設定資料,區塊資料通常指的是大量儲存媒體!還包括類似 ext3 等檔案系統的支援是否允許等。
crypto :核心所支援的加密的技術,例如 md5 或者是 des 等等;
Documentation :與核心有關的一堆說明文件,若對核心有極大的興趣,要瞧瞧這裡!
drivers :一些硬體的驅動程式,例如顯示卡、網路卡、PCI 相關硬體等等;
firmware :一些舊式硬體的微指令碼 (韌體) 資料;
fs :核心所支援的 filesystems ,例如 vfat, reiserfs, nfs 等等;
include :一些可讓其他程序呼叫的標頭 (header) 定義資料;
init :一些核心初始化的定義功能,包括掛載與 init 程式的呼叫等;
ipc :定義 Linux 作業系統內各程序的溝通;
kernel :定義核心的程序、核心狀態、執行緒、程序的排程 (schedule)、程序的訊號 (signle) 等
lib :一些函式庫;
mm :與記憶體單元有關的各項資料,包括 swap 與虛擬記憶體等;
net :與網路有關的各項協定資料,還有防火牆模組 (net/ipv4/netfilter/*) 等等;
security :包括 selinux 等在內的安全性設定;
sound :與音效有關的各項模組;
virt :與虛擬化機器有關的資訊,目前核心支援的是 KVM (Kernel base Virtual Machine)

2010年9月10日 星期五

What is be32_to_cpu/cpu_to_be32(),cpu_to_le16(),cpu_to_le32(),

be32_to_cpu/cpu_to_be32(),cpu_to_le16(),cpu_to_le32(),

le 叫做Little Endian,be 叫做Big Endian,這是兩種字節序.
le 就表示地址地位存儲值的低位,地址高位存儲值的高位.
be 就表示地址低位存儲值的高位,地址高位存儲值的低位.
我們就以這裡這個臨時變量c 為例.假設c 是這樣被存儲在內存地址0x0000 開始的地方:

0x0000 0x12
0x0001 0x34
0x0002 0xab
0x0003 0xcd

如果你是採用le 的字節序,那麼讀出來的值就是0xcdab3412,
反之,如果你採用的是be 的字節序,那麼讀出來的值就是0x1234abcd.
同樣的,如果你把0x1234abcd 寫入0x0000 開始的內存中,那麼結果就是:

big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

為什麼這幾個函數名字裡面都一個”cpu”?
談到字節序不談cpu 那就好比神采飛揚的談起超級女聲卻對張靚穎是何許人也茫然不知.
不同的cpu 採用不同的字節序.看生產商自己喜歡了.
其中,big endian 以Motolora 的PowerPC 系列cpu 為代表,
而little endian 則以我家Intel 的x86 系列cpu 為代表.
所以這幾個函數名字裡邊都會有cpu 的字樣,
那麼毫無疑問對於不同的cpu,這幾個函數執行的代碼是不一樣的.
但是,凡是xx_to_cpu 就說明函數的結果是給cpu 使用的,
反之如果是cpu_to_xx 就說明是從cpu 的字節序轉換成目標字節序.