2012年8月31日 星期五

Add lrz/lsz into Android source tree.

開發過程中 , 只因為修改一個小檔案 ( jni 的 .so file ) , 卻需要將 SD 從EVB 移除 , 然後放到 Fedora 上 去複製檔案 , 真的有點 "煩" !! 如果有 lrz/lsz 就好了  !!

好吧 , 移植 lrz/lsz 吧 !! Android 使用 binoic library , 和一般 cross toolchain 的 library 不同 , 並且沒有辦法執行 .configure 去產生 Makefile , Makefile 也不被Andriod Source tree 接受 , 真是大工程........ !!

找找看 , 有沒有人已經將 lrz/lsz 放到 Android 上了 !! 找了兩天..... 發現 linaro 這個組織 , 專門優化 ARM 系統的東西 , 並且在 ICS 4.0.4 上有 lrz/lsz 的 source .....嘿嘿...借來用一下吧 !! 不過也公佈一下 這個組織網頁 ... 如下:

http://www.linaro.org/linux-on-arm

按照 linaro 網頁上說明 , 將整個 source tree repo 下來 , 並將 ./externel/lrzsz 資料夾 移到 TI BSP 的相對應位置上 . 並修改 ./externel/lrzsz/Android.mk , 主要是 style  修改 , 並沒有其它改動 ,修改後如下:

LOCAL_PATH:= $(call my-dir)

lrzsz_local_comm_file := timing.c zperr.c zreadline.c crctab.c \
                                rbsb.c zm.c protname.c tcp.c lsyslog.c \
                                canit.c long-options.c xstrtol.c xstrtoul.c error.c

include $(CLEAR_VARS)

LOCAL_SRC_FILES := lrz.c $(lrzsz_local_comm_file)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := lrz
LOCAL_CFLAGS := -DNFGVMIN -DHAVE_CONFIG_H=1
LOCAL_SHARED_LIBRARIES := libc

include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := lsz.c $(lrzsz_local_comm_file)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := lsz
LOCAL_CFLAGS := -DNFGVMIN -DHAVE_CONFIG_H=1
LOCAL_SHARED_LIBRARIES := libc

include $(BUILD_EXECUTABLE)


一樣的 make 過程中會編譯但是沒有安裝 , 所以修改 ./build/target/product/core.mk檔案 , 加入 lrz , lsz 兩個 packages name , 修改項目如下:

    libwilhelm \
    libz \
    screencap \
    sensorservice \
    lrz\
    lsz \

# host-only dependencies
ifeq ($(WITH_HOST_DALVIK),true)
    PRODUCT_PACKAGES += \


OK 啦 , 可以 lrz  / lsz 操作了 !! 這樣開發過程會 "爽" 一點  !!

PS. 115200 bsp 遇到大的檔案還是要花很久 , 不過至少一些 .so 或是 testing program 就可以方便多了 !!

2012年8月30日 星期四

加入自己的 demo 程式 (Pure Java )

目前 Android ICS 可以運作了 , 自己放個 Demo Code 上去跑跑看吧 ! 順便看看要怎樣加 Code 到 這個 Source Tree 上 .

本人不會 Java 語言 , 所以先找別人的 code 了 !!  剛好 .... 2010年7月有去 "仕XXX科技" ( 避免廣告用 X 代替部份名稱) 上課 , 課程內容有 java 的 demo code ,  借來用一下吧 (著作權問題 , 尊重原作 , 公佈一下講師名稱: 梁文耀 ) ,這個 demo code 很簡單 , 輸入兩個數字 , 一個 button 會顯示結果. 

首先 , 我不想 "污染" 原來的 Source Tree 太多 , 所以另外建立一個目錄 "Instant_apps" , 並且在這資料夾內建立一個 Instant_app.mk 檔案 , 這檔案內容只有註明增加哪些 PACKAGES, 內容如下:

PRODUCT_PACKAGES := \
    Sample_1  \


在 Instant_apps 目錄下放入 sample code 資料夾 "AndroInt-ex1-activity"
在 Instant_apps/AndroInt-ex1-activity/ 建立 Android.mk file , 內容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := Sample_1
include $(BUILD_PACKAGE)


## 注意 , Instant_app.mk 內的Samele_1 要和這個 Android.mk 中的 LOCAL_PACKAGES_NAME 相同 , 這樣 make 過程才會正確.

這樣就可以 make 了 , 不過 最後不會安裝到 out/target/product/am335xevm/ 下 , 需要在修改一個地方.主要是說明 am335xevm target 有包含這個 demo code (如果不想預載 ,可以找到 輸出的 .apk 然後用手動的方式在 target EVB 上安裝) , 所以修改 device/ti/am335xevm/am335xevm.mk 的內容 , 如下列紅色部份

# Inherit from those products. Most specific first.
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
$(call inherit-product, device/ti/am335xevm/device.mk)

$(call inherit-product, Instant_apps/Instant_app.mk)

PRODUCT_NAME := am335xevm
PRODUCT_DEVICE := am335xevm


大功告成 , 最後 .apk 會放在 out/target/product/am335xevm/system/app/Sample_1.apk , target EVB 開機後就可以看到 預載的 Sample code 了.



2012年8月17日 星期五

Do some modify .....

A. 修正 ./build/core/main.mk file.
Java 版本一直沒有辦法通過 main.mk file 的檢查 , 不過我確認我的 FC 16 已經是 java 6 了, 所以使用 "偷吃步 " 將 check java version 的 段落移除 , 讓 make 可以繼續 .

# Check for the correct version of java
java_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.6[\. "$]')
ifneq ($(shell java -version 2>&1 | grep -i openjdk),"")

## Jeff >>>>
#java_version :=
## <<<<

endif


A. 不要使用 openJDK , 會有一些詭異的錯誤.
   先到 Java 官方網頁下載 jdk-6u34-linux-i586.bin file (可能會有新版本 6uxx  ),
   我的系統是 Fedora i686 並非 x64 , 所以選擇這個 , 更該為可執行 , 然後執行它.

   [jeff@localhost Downloads]$  chmod +x jdk-6u34-linux-i586.bin
   [jeff@localhost Downloads]$  ./jdk-6u34-linux-i586.bin 

    然後會產生一個目錄 "jdk1.6.0_34" !! 
   在開始 build Android source code 時候將 PATH 改為
   export PATH=/${HOME}/Downloads/jdk1.6.0_34/bin/:$PATH

   這樣就可以了 !!

B.修改 ./frameworks/compile/slang/Android.mk file .
整個 make 過程會發現下列的 error , 主要是 complier 將沒有使用的變數當作 error 來輸出 , 所以修改一下 Android.mk file , 將這個改為 warning 即可.

frameworks/compile/slang/slang_rs_export_foreach.cpp: In static member function ‘static slang::RSExportForEach* slang::RSExportForEach::Create(slang::RSContext*, const clang::FunctionDecl*)’: frameworks/compile/slang/slang_rs_export_foreach.cpp:249:23: error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable] cc1plus: all warnings being treated as errors

# The prebuilt tools should be used when we are doing app-only build.
ifeq ($(TARGET_BUILD_APPS),)

LOCAL_PATH := $(call my-dir)

## Jeff >>>
local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter
##local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
## <<<

ifneq ($(TARGET_BUILD_VARIANT),eng)
local_cflags_for_slang += -D__DISABLE_ASSERTS
endif
local_cflags_for_slang += -DTARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT)


C. 修正 ./external/webkit/Source/WebCore/make-hash-tools.pl file.
Build 過程 看到下列的 error message ,
Can't locate Switch.pm in @INC (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl
/usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl .)
at external/webkit/Source/WebCore/make-hash-tools.pl line 23. BEGIN failed--compilation aborted at external/webkit/Source/WebCore/make-hash-tools.pl line 23.
原來是 prel 版本的問題 , 需要修改 make-hash-tools.pl file , 修改方式請參考 下列網址說明.

http://code.google.com/p/android/issues/detail?id=22231

D. 修正 ./external/gtest/include/gtest/internal/gtest-param-util.h
如果有看到下列這樣的 error message :
external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11: error: ‘ptrdiff_t’ does not name a type
請參考 下列網址中的說明 ,修改

http://code.google.com/p/android/issues/detail?id=22005

external/gtest/include/gtest/internal/gtest-param-util.h
 #include <vector> 
+#include <cstddef> 
 #include <gtest/internal/gtest-port.h> 

  D. 修正 ./build/env.sh

In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0:
external/oprofile/libpp/format_output.h:94:22: error: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/arrange_profiles.o] Error 1




E. 修正 hardware/ti/sgx/Makefile.KM.Android File.
依照 User guide 要傳OMAPES=4.x 給 kernel , 但是在這個 makefile 中卻重新設定為INVALIDVAL . 這樣會導致 make 不過.

 --- a/Makefile.KM.Android
+++ b/Makefile.KM.Android
@@ -1,6 +1,6 @@
 include Rules.make

-OMAPES:=INVALIDVAL
+##OMAPES:=INVALIDVAL

 .PHONY: all_km buildkernel
 .PHONY: clean_km cleankernelmodule
@@ -76,6 +76,7 @@ else ifeq ($(OMAPES),7.x)
        @cp -rf $(GFX_KERNMOD_SRCPATH)/eurasiacon/binary2_omap4430_android_release/target/pvrsrvkm.ko $(GFX_REL_ES7_LIB_SRCPATH_AN
        @cp -rf $(GFX_KERNMOD_SRCPATH)/eurasiacon/binary2_omap4430_android_release/target/omaplfb.ko $(GFX_REL_ES7_LIB_SRCPATH_AND
 else
+       @echo "OMAPES:$(OMAPES)"
        @echo "OMAPES value not specified (Mandatory value)"
        exit 1
 endif


F. 為了增加make 過程的順利 , 我增加了一個 env.sh file .
內容如下 , 在 make之前先執行 source build/env.sh , 就會設定好一些環境參數.

#!/bin/sh

export PATH=${PWD}/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:${HOME}/bin/jdk1.6.0_34/bin:$PATH
export PATH=${PWD}/build:$PATH

export TARGET_PRODUCT=am335xevm
export OMAPES=4.x

export USE_CCACHE=1


## ==== for u-boot or kernel used.

export ARCH=arm
export CROSS_COMPILE=arm-eabi-


#!/bin/sh


JDK_BIN_DIR=${HOME}/bin/jdk1.6.0_34/bin
TOOLCHAIN_BIN_DIR=${PWD}/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

PATH1=`echo ${PATH} | sed "s|[:]${JDK_BIN_DIR}||g"`
PATH2=`echo ${PATH1} | sed "s|${JDK_BIN_DIR}[:]||g"`
PATH3=`echo ${PATH2} | sed "s|[:]${TOOLCHAIN_BIN_DIR}||g"`
PATHX=`echo ${PATH3} | sed "s|${TOOLCHAIN_BIN_DIR}[:]||g"`

export PATH=${TOOLCHAIN_BIN_DIR}:${JDK_BIN_DIR}:${PATHX}

export TARGET_PRODUCT=am335xevm
export OMAPES=4.x

export USE_CCACHE=1


## ==== for u-boot or kernel used.

export ARCH=arm
export CROSS_COMPILE=arm-eabi-





G. 為了自動產生 rootfs.tar.bz file . 我增加了一個 shell file.
依照 User Guide , 要執行5 個指令才能製作出 rootfs.tar.bz file .我將這接指令用一個 shell file 包裝起來 , 使用上就會方便多了, 只要在 top 目錄執行這個  shell 即可.


#!/bin/sh

#  $ cd out/target/product/<product-name>
#  $ mkdir android_rootfs
#  $ cp -r root/* android_rootfs
#  $ cp -r system android_rootfs
#  $ ../../../../build/tools/mktarball.sh ../../../host/linux-x86/bin/fs_get_stats android_rootfs . rootfs rootfs.tar.bz2

## ===== defind echo color
COLOR_ECHO="echo -e"        ## in Fedora the color echo need have -e argument.
COLOR_NORMAL="\033[0m"
COLOR_BOLD="\033[1m"
COLOR_RED="\033[31m"
COLOR_GREEN="\033[32m"
COLOR_YELLOW="\033[33m"


## ==== check doing env.sh .
if [ -z ${TARGET_PRODUCT} ];then
    ${COLOR_ECHO} "${COLOR_BOLD}${COLOR_RED}## Android Target Product type not defined. "
    ${COLOR_ECHO} "${COLOR_NORMAL}"
    exit
fi


_target_dir=${PWD}/out/target/product/${TARGET_PRODUCT}
_out_root=${_target_dir}/root
_out_system=${_target_dir}/system
_rootfs_dir=${_target_dir}/android_rootfs

MKTARBALL=${PWD}/build/tools/mktarball.sh
FS_GET_DATAS=${PWD}/out/host/linux-x86/bin/fs_get_stats


## ==== Check utility .
if [ ! -e ${MKTARBALL} ] || [ ! -e ${FS_GET_DATAS} ];then
    ${COLOR_ECHO} "${COLOR_BOLD}${COLOR_RED}## Some utility tools not exist. "
    ${COLOR_ECHO} "${COLOR_NORMAL}"
    exit
fi

## ==== check output data exist.

if [ -e ${_out_root} ] && [ -e ${_out_system} ] ;then
    #~ echo "DEBUG >>>> _target_dir=:${_target_dir}"
    #~ echo "DEBUG >>>> _out_root=:${_out_root}"
    #~ echo "DEBUG >>>> _out_system=:${_out_system}"
    #~ echo "DEBUG >>>> _rootfs_dir=:${_rootfs_dir}"

    ## ==== creat rootfs dir.
    if [ -e ${_rootfs_dir} ];then
        ${COLOR_ECHO} "${COLOR_BOLD}${COLOR_YELLOW}## Clean up old data in \"${_rootfs_dir}\" ....  "
        ${COLOR_ECHO} "${COLOR_NORMAL}"
        rm -rf ${_rootfs_dir}
    else
        ${COLOR_ECHO} "${COLOR_BOLD}${COLOR_GREEN}## Create rootfs dir \"${_rootfs_dir}\" "
        ${COLOR_ECHO} "${COLOR_NORMAL}"
    fi
    mkdir -p ${_rootfs_dir}

    cp -r ${_out_root}/* ${_rootfs_dir}
    cp -r ${_out_system} ${_rootfs_dir}

    ${COLOR_ECHO} "${COLOR_BOLD}${COLOR_GREEN}## Createing rootfs tarball .... "
    ${COLOR_ECHO} "${COLOR_NORMAL}"

    cd  ${_target_dir}
    ${MKTARBALL} ${FS_GET_DATAS} ${_rootfs_dir} . rootfs rootfs.tar.bz2
    cd - > /dev/null


else
    ${COLOR_ECHO} "${COLOR_BOLD}${COLOR_RED}## Android Target output data not exist "
    ${COLOR_ECHO} "${COLOR_NORMAL}"
    exit
fi

 


### 終於.... 可以執行 TI AM335x 的 ICS 了. 

裝個 "憤怒鳥" 來玩玩看吧 !!
http://www.youtube.com/watch?v=JURiyybtT4w&feature=g-upl



Requirement Packages in FC 16 ....

When I stating build this Android source code on my host PC (FC 16 ) ,it will missing some requirement packages . I will list in below , and update this when i find out some one.


yum install java-1.6.0-openjdk-devel
yum install bison
yum install flex
yum install gperf


yum install perl-Digset-MD5  >> Maybe need 

yum install mesa-libGL-devel >> Maybe need
  ( build standard Android-4.0.4_r2.1  required )
development/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp:22:20: fatal error: GL/glx.h: No such file or directory  

 

2012年8月16日 星期四

Start Build TI AM335X Android BSP in Fedora 16.

這星期開始試著 將 TI AM335x Android 的 BSP 下載到我的 Host PC (FC 16 ).
試著 build 看看 , 並且驗證Host 環境是否需要修改.

這個 blog 將紀錄這些修改過程 !!

A. 首先 找到 TI 的說明文件.
http://processors.wiki.ti.com/index.php/TI-Android-ICS-4.0.3-DevKit-3.0.1_DevelopersGuide#Getting_Source_.26_Toolchain

B. 按照 Using Pre-Packaged Sources 章節 , 將 Source code 下載.
這時候要注意 , Host 端需要 git . ( yum install git ) .

C. 按照 To Build Android Filesystem 章節 , 開始 build .
這時候要注意 , Java 版本的問題 !! 可以用下列 指令來選擇Java 的使用版本.
update-alternatives --config java