顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2011年7月21日 星期四

Head first Android RIL

RIL(Radio Interface Interface)是Android裡用來控制電話的一套系統, 其架構如下:

透過這套架構, 如果沒有太特別的需求, 只要針對不同的modem去修改Vendor RIL應該就可以了

網路上RIL相關的文章不少, 其中maxlengopendroid對RIL一系列的文章, 真的讓我獲益不少。

[Maxleng]
Android電話系統之概述篇 http://blog.csdn.net/maxleng/article/details/5576509
Android電話系統之RILD http://blog.csdn.net/maxleng/article/details/5576637
Android電話系統之RIL-Java http://blog.csdn.net/maxleng/article/details/5593759
Android電話系統之GSMCallTracker http://blog.csdn.net/maxleng/article/details/5593780

[Opendroid]
Android GSM 驅動模塊(rild)詳細分析(一)基本架構及初始化 http://blog.csdn.net/opendroid/article/details/4071149
Android GSM 驅動模塊(rild)詳細分析(二)request流程 http://blog.csdn.net/opendroid/article/details/4071153
Android GSM 驅動模塊(rild)詳細分析(三)response流程 http://blog.csdn.net/opendroid/article/details/4071154

2010年12月26日 星期日

Get Android Source Code and Setup the Build Environment

2010/12/17的一則消息:"Android 2.3 Gingerbread's source code now available", 從2.2開始, 其實預設就是用64bit OS來build, 之前為了不想重灌Linux, 在網路上找了許多如何在32bit OS上build code的方法, 花了不少時間才把froyo放上s3c6410, 但是仔細想想這樣好像也沒有比較厲害 , 這次還是乖乖照google建議的, 在64bit OS上build android. 為了怕日後換電腦, 又要全部重來一次, 把過程作個紀錄

1. Prepare
先裝些基本的工具與設定

1.1 apt-get
若需要設定proxy, 在/etc/apt/apt.conf.d/01xxxxx裡面加上proxy資訊
APT
{
    ......
}
Acquire::Http::Proxy "http://your_http_proxy:port";
#Acquire::Ftp::Proxy "ftp://your_ftp_proxy:port";
更新apt-get資料庫
sudo apt-get update
接著作個方便的alias
alias apt-install 'sudo apt-get -y install'

1.2 git
安裝git
apt-install git-core

p.s. 若無法直接連線, 需要透過proxy去避開firewall的話
先用apt-get裝"connect-proxy" (一般的狀況下, 不需要用到這個)
apt-install connect-proxy
接著寫個給git用的proxy script
my-git-proxy
#!/bin/sh
# You can get proxy from http://spys.ru/free-proxy-list/TW/
PROXY=IP:Port
connect-proxy -H http://$PROXY $@
設定git透過proxy連線
git config --global core.gitproxy ~/my-git-proxy

2. Required Packages
AOSP上面提到的一些必要安裝
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl valgrind sun-java6-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev
各個套件的功用, 可參考"ubuntu 9.04安裝Android注意事項"與"Build Android Platform"

其中裝JDK1.6時, 可能需要新增apt-get的source list
/etc/apt/sources.list
deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
接著再更新一下apt-get
sudo apt-get update
apt-install sun-java6-jdk
JDK安裝完後, 將相關的資訊export到環境變數裡
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export PATH=/usr/lib/jvm/java-6-sun/bin:$PATH
export ANDROID_JAVA_HOME=$JAVA_HOME

[註] Java版本相關指令
查版本:java -version
列出已安裝版本:sudo update-java-alternatives -l
切換Java版本:sudo update-java-alternatives -s java-x-sun

3. Download Android Source Code
Download source code 只要照AOSP上面教的即可
curl http://android.git.kernel.org/repo >~/repo
chmod a+x ~/bin/repo
mkdir mydroid
cd mydroid
~/repo init -u git://android.git.kernel.org/platform/manifest.git
~/repo sync

4. Build Android
build code可以直接下make
make -j4
若是之後可能開發自己的product的話, 可以準備一個script
#!/bin/bash

function show_result()
{
        echo ""
        echo "#######################################################"
        echo " $1"
        echo "#######################################################"
        echo ""
}

CWD=$PWD
ANDROID_PATH=$CWD/my_android

export TARGET_PRODUCT=generic
export TARGET_BUILD_TYPE=release
export TARGET_BUILD_VARIANT=eng
export TARGET_SIMULATOR=false

cd ${ANDROID_PATH}

if ( make -j4 ); then
        show_result "Build Android Successfully!!"
        exit 0
else
        show_result "Build Android Failure!!"
        exit 1
fi
換成Ubuntu64順利很多, 只碰到一個error
make: *** [out/target/product/generic/obj/ SHARED_LIBRARIES/libwebcore_intermediates/LINKED/libwebcore.so] Error 1
拜了一下Google大神, 多數的說法都是開給VMware的記憶體不夠所造成, 照著網路上的作法先試著將swap加大後,
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
mkswap /swapfile
swapon /swapfile
再加上相當長的build code時間, 總算成功得到android image了


參考資料:
[1] Android Open Source Project
[2] Build Android Platform
[3] Android获取源代码、编译、命令

2010年12月23日 星期四

Android Init Language

在Linux下的rcS用的一般都是shell script的語法撰寫, 但Android裡的init.rc似乎有他自己的一套

Android init language內的描述可分成兩種類型: Action, Service

Actions
on <trigger>
   <command>
   <command>
   <command>
   ......
其意義表示當trigger發生或成立時, 要執行哪些command
例如
on boot
  export PATH /sbin:/system/sbin:/system/bin
  export LD_LIBRARY_PATH /system/lib

  mkdir /dev
  mkdir /proc
  mkdir /sys
表示當boot發生了, 要去export一些環境變數以及建一些目錄.
官網中定義了幾個trigger的種類,
其他預設的trigger (ex. init, fs), 可以在system/core/init/init.c裡面找到

Services
service <name> <pathname> [ <argument> ]*
<option>
<option>
......
service定義的program, 除了option設為disable外, 會被init執行 (精確的說, 是action內的class_start default, 啟動了default的service)
例如
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
  socket zygote 666
"zygote" 表示這個service的名稱
"/system/bin/app_process" 表示程式的路徑
"-Xzygote /system/bin --zygote" 表示要傳入程式的參數
"socket zygote 666" 是service的option, 表示開一個名為zygote的unix socket給這個service

合在一起看的例子
on device-added-/dev/compass
  start akmd

on device-removed-/dev/compass
  stop akmd

service akmd /sbin/akmd
  disabled
  user akmd
  group akmd
表示說akmd這個service並不會在init起來時被執行, 而是當/dev/compass產生時會被執行, 當/dev/compass移除時, 該service會被停掉

整個init.rc被執行的過程, 可參考"Android init 啟動過程分析"

參考資料:
[1] Android Init Language
[2] 如何去寫Android init.rc
[3] android init(system/core/init/init.c)分析
[4] Android init 啟動過程分析
[5] init.c