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

2013年1月15日 星期二

Add new internal resource in Android Jelly Bean

依據之前的經驗, 只要將新增的xml (string or icon, id)放到Android source 對應的res folder裡面之後在編譯Android 時就會自動加入到內部生成的R.java

但最近在porting Android JB時發現新增加的internal resource 並沒有被自動生成, 導致編譯時會發生 cannot find symbol的問題如下

cannot find symbol
symbol  : variable xxxxx
location: class com.android.internal.R.(...)

Google了一下後找到解決方法了, 但是不曉得這到底是不是JB的新機制(很不方便XD)

在 frameworks/base/core/res/MakeJavaSymbols.sed 裡有註明


# Run this on the errors output by javac of missing resource symbols,
# to generate the set of commands to have aapt generate
# the symbol for them.
#
# For example: make framework 2>&1 | sed -n -f MakeJavaSymbols.sed | sort -u

於是我在Android source tree的 root folder下打

$ make framework 2>&1 | sed -n -f frameworks/base/core/res/MakeJavaSymbols.sed | sort -u

執行完後就會產生
< java-symbol type="string" name="xxxxx" / >

把產生出來的這些內容直接貼到
frameworks/base/core/res/res/values/public.xml
就可以了

再來就照編譯Android 的方法來編譯就好了


Ref: http://www.cppblog.com/wythern/archive/2012/12/21/191394.html


2012年12月6日 星期四

安裝sun-java6-jdk失敗

當我安裝好ubuntu 12.04後 依照AOSP上的動作來設定環境時 當在安裝java jdk發生了錯誤
錯誤訊息如下:


Package sun-java6-jdk is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source
E: Package sun-java6-jdk has no installation candidate

 
解決方式可以參看 https://github.com/flexiondotorg/oab-java6
基本上步驟為

cd ~/
wget https://github.com/flexiondotorg/oab-java6/raw/0.2.6/oab-java.sh -O oab-java.sh
chmod +x oab-java.sh
sudo ./oab-java.sh
更正, 上述方法安裝後的java 6版本無法用來編譯android. 後來又google了一下後
其中ubuntu論壇上的參考網頁
https://help.ubuntu.com/community/Java

下述這個方法確定可用
安裝jdk6 # sudo add-apt-repository ppa:webupd8team/java # sudo apt-get update # sudo apt-get install oracle-java6-installer or 安裝jdk7 # sudo add-apt-repository ppa:webupd8team/java # sudo apt-get update # sudo apt-get install oracle-java7-installer
另外一開始其實有碰到安裝jdk7 failed的情況 錯誤訊息如下: dpkg: error processing oracle-java7-installer (--configure): subprocess installed post-installation script returned error exit status 1 No apport report written because MaxReports is reached already Errors were encountered while processing: oracle-java7-installer E: Sub-process /usr/bin/dpkg returned an error code (1)

解決方式就是先完全移除jdk, 移除方法如下
# sudo rm /var/lib/dpkg/info/oracle-java7-installer* # sudo apt-get purge oracle-java7-installer* # sudo rm /etc/apt/sources.list.d/*java* # sudo apt-get update
除除後再依照上述步驟重新安裝jdk就可以了

2010年9月20日 星期一

How to use oprofile on embedded system for Android

The detailed steps are referred from http://www.omappedia.org/wiki/Android_Debugging#OProfile
Here, I just write down the steps for my developing environment.
My developing environment is an Android platform on embedded system. So, I have a host machine and a target machine which is an embedded system with ARM based processor.

On host machine:
1. build a linux kernel enabling oprofile
2. edit $MYDROID/external/oprofile/opimport_pull (for instance $MYDROID = ~/sk886x/source/skydroid1.6/platform/) as below
Remove the python version number from the first line eg. change
      #!/usr/bin/python2.4 -E
  to
      #!/usr/bin/python -E

  Append the following lines at the end of the file to generate cpuloads.txt and callgraph.png for further analysis 
      os.system(oprofile_event_dir + "/bin/opreport --session-dir=. >> cpuloads.txt") 
      os.system(oprofile_event_dir + "/bin/opreport --session-dir=. -p $OUT/symbols -l -t 0.1 >> cpuloads.txt") 
      os.system(oprofile_event_dir + "/bin/opreport -cg --session-dir=. -p $OUT/symbols > callgraph.txt") 
      os.system("cat callgraph.txt | gprof2dot.py -s -w -f oprofile -n 0.1 -e 0.1 | dot -Tpng -o callgraph.png")  

On target machine

3. turn on busybox
# busybox ash
4. make a dummy linux vmlinux
# echo 0 > /vmlinux
5. If you see "Cannot create directory /dev/oprofile: File exists do_setup failed#", it means that, OProfile is not built in the Kernel.
# opcontrol --setup
6.
# busybox grep " _text" /proc/kallsyms 
c0023000 T _text          
# busybox grep " _etext" /proc/kallsyms 
c054e000 A _etext 
7.
# opcontrol --vmlinux=/vmlinux --kernel-range=0xc0023000,0xc054e000 --event=CPU_CYCLES:64
8.
# echo 16 > /dev/oprofile/backtrace_depth
9. check the configuration status
# opcontrol --status
10. start oprofile
opcontrol --start

11. Run your program for analyzing the performance

12. Stop oprofile
opcontrol --stop

On host machine
13.
$ cd $MYDROID 
$ source build/envsetup.sh 
$ setpaths 
$ export ADBHOST=
14.
$ mkdir ~/oprofilepackage && cd ~/oprofilepackage 
$ tar xvjf 
$ cd $MYDROID
$ source build/envsetup.sh 
$ sed -i -e 's_$(call inherit-product, frameworks/base/data/sounds/OriginalAudio.mk)_#$(call inherit-product, frameworks/base/data/sounds/OriginalAudio.mk)_g' build/target/product/AndroidProducts.mk
$ setpaths
$ export MYDROID=${PWD}
$ ln -s $MYDROID/out/target/product/sk886x $MYDROID/out/target/product/generic
15. Set soft links of vmlinux and target program, for example mplayer
$ ln -s /path/to/linux/kernel/soruce/folder/vmlinux $OUT/symbols/vmlinux 
$ ln -s /path/to/mplayer/source/folder/mplayer $OUT/sybmols/system/bin/mplayer
16. pull the oprofile result to host machine and generate the analysis report
#MYDROID/external/oprofile/opimport_pull /path/to/new/folder/to/store/dump/and/results/

Then you can see cpuloads.txt in /path/to/new/folder/to/store/dump/and/results/

2010年6月10日 星期四

轉 -如何去寫Android init.rc

參考來源:http://embeddeder.spaces.live.com/blog/cns!8006E36532087D51!160.entry

如 何去寫Android init.rc (Android init language)
Android初始化語言由四大類聲明組 成:行為類(Actions),命令類(Commands),服務類(Services),選項類(Options).

* 初始化語言以行為單位,由以空格間隔的語言符號組成。C風格的反斜槓轉義符可以用來插入空白到語言符號。雙引號也可以用來防止文本被空格分成多個語言符 號。當飯斜槓在行末時,作為折行符。

* 以#開始(前面允許有空格)的行為註釋行。

* Actions和Services隱含聲明一個新的段落。所有該段落下Commands或Options的聲明屬於該段落。第一段落前的Commands 或Options被忽略。

* Actions和Services擁有獨一無二的命名。在它們之後聲明相同命名的類將被當作錯誤並忽略。

Actions

-------

Actions 是一系列命令的命名。Actions擁有一個觸發器(trigger)用來決定action何時執行。當一個action在符合觸發條件被執行時,如果它 還沒被加入到待執行隊列中的話,則加入到隊列最後。

隊列中的action依次執行,action中 的命令也依次執行。Init在執行命令的中間處理其他活動(設備創建/銷毀,property設置,進程重啟)。

Actions 表現形式為:

on





Services

--------

Services 是由init啟動,在它們退出時重啟(可選)。Service表現形式為:

service [ ]*



...


Options

-------

Options 是Services的修飾,它們影響init何時、如何運行service.


critical

這是一個設備關鍵服務(device-critical service) .如果它在4分鐘內退出超過4次,設備將重啟並進入恢復模式。


disabled

這個服務的級別將不會自動啟動,它必須被依照服務名指定啟動才可以啟動。


setenv

設置已啟動的進程的環境變量的值


socket [ [ ] ]

創建一個名為/dev/socket/的unix domin socket,並傳送它的fd到已啟動的進程。必須 為"dgram"或"stream".用戶和組默認為0.


user

在執行服務前改變用戶名。當前默認為root.如果你的進程需要linux能力,你不能使用這個命令。你必須在還是root時請求能力,並下降到你需要的 uid.


group [ ]*

在執行服務前改變組。在第一個組後的組將設為進程附加組(通過setgroups()).當前默認為root.


oneshot

在服務退出後不重啟。


class

為service指定一個類別名。同樣類名的所有的服務可以一起啟動或停止。如果沒有指定類別的服務默認為"default"類。


onrestart

當服務重啟時執行一個命令。


Triggers

--------

Triggers(觸發器)是一個字串,可以用來匹配某種類型的事件並執行一個action。


boot

這是當init開始後執行的第一個觸發器(當/init.conf被加載)


=

當property 被設為指定的值時觸發。


device-added-

device-removed-

當設備節點被添加或移除時觸發。


service-exited-

當指定的服務存在時觸發



Commands

--------


exec [ ]*

Fork並執行一個程序().這將被block直到程序執行完畢。最好避免執行例如內建命令以外的程序,它可能會導致init被阻 塞不動。


export

設定全局環境變量的值, 當這個命令執行後所有的進程都可以取得。


ifup

使網絡接口連 線。


import

解析一個init配置文件,擴展當前配置文件。


hostname

設置主機名


chmod

改變文件訪問權限


chown

改變文件所屬和組


class_start

當指定類別的服務沒有運行,啟動該類別所有的服務。


class_stop

當指定類別的服務正在運行,停止該類別所有的服務。


domainname

設置域名。


insmod

加載該路徑的模塊


mkdir [mode] [owner] [group]

在創 建一個目錄,可選選項:mod,owner,group.如果沒有指定,目錄以755權限,owner為root,group為root創建.


mount [ ]*

嘗試mount 到目錄. 可以用mtd@name格式以命名指定一個mtd塊設備。包 含"ro","rw","remount","noatime".


setkey

暫時沒有


setprop

設置系統property 的值.


setrlimit

設置resource的rlimit.


start

啟動一個沒有運行的服務。


stop

停止一個正在運行的服務。


symlink

創建一個的 符號鏈接到


sysclktz

設置系統時區(GMT為0)


trigger

觸發一個事件。用於調用其他action。


write [ ]*

打開的文件並寫入一個或多個字串。



Properties

----------

Init 會更新一些系統property以提供查看它正在幹嘛。

init.action

當前正在執行的action,如果沒有則為""


init.command

被執行的命令,如果沒有則為""


init.svc.

命名為的服務的狀態("stopped", "running", "restarting")



init.rc 示例:

-----------------


# not complete -- just providing some examples of usage

#

on boot

export PATH /sbin:/system/sbin:/system/bin

export LD_LIBRARY_PATH /system/lib


mkdir /dev

mkdir /proc

mkdir /sys


mount tmpfs tmpfs /dev

mkdir /dev/pts

mkdir /dev/socket

mount devpts devpts /dev/pts

mount proc proc /proc

mount sysfs sysfs /sys


write /proc/cpu/alignment 4


ifup lo


hostname localhost

domainname localhost


mount yaffs2 mtd@system /system

mount yaffs2 mtd@userdata /data


import /system/etc/init.conf


class_start default


service adbd /sbin/adbd

user adb

group adb


service usbd /system/bin/usbd -r

user usbd

group usbd

socket usbd 666


service zygote /system/bin/app_process -Xzygote /system/bin --zygote

socket zygote 666


service runtime /system/bin/runtime

user system

group system


on device-added-/dev/compass

start akmd


on device-removed-/dev/compass

stop akmd


service akmd /sbin/akmd

disabled

user akmd

group akmd


調試

---------------

默 認情況下,init執行的程序輸出的信息和錯誤到/dev/null.為了debug,你可以通過Android程序logwrapper執行你的程序。 這將重定向輸出/錯誤輸出到Android logging系統(通過logcat訪問)。

例如

service akmd /system/bin/logwrapper /sbin/akmd