Android系统移植技术详解

Android系统移植技术详解
Android系统移植技术详解

Android系统开发编译环境配置

主机系统:Ubuntu9.04

(1)安装如下软件包

sudo apt-get install git-core

sudo apt-get install gnupg

sudo apt-get install sun-java5-jdk

sudo apt-get install flex

sudo apt-get install bison

sudo apt-get install gperf

sudo apt-get install libsdl-dev

sudo apt-get install libesd0-dev

sudo apt-get install build-essential

sudo apt-get install zip

sudo apt-get install curl

sudo apt-get install libncurses5-dev

sudo apt-get install zlib1g-dev

android编译对java的需求只支持jdk5.0低版本,jdk5.0 update 12版本和java 6不支持。(2)下载repo工具

curl https://www.360docs.net/doc/cb6630708.html,/repo >/bin/repo

chmod a+x /bin/repo

(3)创建源代码下载目录:

mkdir /work/android-froyo-r2

(4)用repo工具初始化一个版本(以android2.2r2为例)

cd /work/android-froyo-r2

repo init -u git://https://www.360docs.net/doc/cb6630708.html,/platform/manifest.git -b froyo

初始化过程中会显示相关的版本的TAG信息,同时会提示你输入用户名和邮箱地址,以上面的方式初始化的是android2.2 froyo的最新版本,

android2.2本身也会有很多个版本,这可以从TAG信息中看出来,当前froyo的所有版本如下:

* [new tag] android-2.2.1_r1 -> android-2.2.1_r1

* [new tag] android-2.2_r1 -> android-2.2_r1

* [new tag] android-2.2_r1.1 -> android-2.2_r1.1

* [new tag] android-2.2_r1.2 -> android-2.2_r1.2

* [new tag] android-2.2_r1.3 -> android-2.2_r1.3

* [new tag] android-cts-2.2_r1 -> android-cts-2.2_r1

* [new tag] android-cts-2.2_r2 -> android-cts-2.2_r2

* [new tag] android-cts-2.2_r3 -> android-cts-2.2_r3

这样每次下载的都是最新的版本,当然我们也可以根据TAG信息下载某一特定的版本如下:

repo init -u git://https://www.360docs.net/doc/cb6630708.html,/platform/manifest.git -b android-cts-2.2_r3

(5)下载代码

repo sync

froyo版本的代码大小超过2G,漫长的下载过程。

cd /work/android-froyo-r2

make

Ubuntu下使用Simba服务实现局域网内文件共享

Ubuntu下安装Simba服务器将linux电脑上的内容共享,同一局域网内的另外一台Windows PC即可访问其共享内容,

从而实现Windows电脑向访问本地文件一样访问Linux文件系统的内容。

(1)安装Simaba服务器

sudo apt-get install samba

(2)安装samba图形化配置软件

sudo apt-get install system-config-samba

(3)创建一个Simba专用用户

从“系统”—“系统管理”—“用户和组”,来创建。如图,先点击“解锁”,然后“添加新用户”

然后输入新用户名字(如Simba)和密码(如111111),然后在“高级”里面,选择“主组”为sambashare后点击"确定"即可

一句话来概括,就是创建一个主组为sambashare的用户

(4)配置samba共享

从“系统”—“系统管理—”samba“,运行配置界面

然后”首选项“—”服务器设置“。点击:安全性,在最后的”来宾帐号“里面,

选择我们新建立的那个用户simba后点击确定

(5)修改samba配置文件

打开/etc/samba/smb.conf,修改valid users = XXXX为valid users = simba

(6)重启samba服务

sudo /etc/init.d/samba restart

(7)添加共享文件

从“系统”—“系统管理—”samba“,运行配置界面

点击"添加"来添加共享文件夹,点击"浏览"来选择需要共享的文件夹,选择"可擦写"和"显示",点击"访问"可以设置访问权限,最好设置成"允许所有用户访问"

Ubuntu下tftp服务器的创建

实验平台:Ubuntu9.04

(1)安装tftp服务

sudo apt-get install tftp tftpd openbsd-inetd

(2)在根目录下创建文件夹tftpboot文件夹并修改权限

cd /

sudo mkdir tftpboot

sudo chmod 777 tftpboot

(3)修改/etc/inetd.conf文件如下:

tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot

(4)开启tftp服务

sudo /etc/init.d/openbsd-inetd reload

sudo in.tftpd -l /tftpboot

(5)重启电脑,然后将测试文件放入/tftpboot目录下即可开始测试,出现问题可能一般都是权限问题

/tftpboot目录下的文件访问权限改成0777

创建一个新的Android产品项目

从google网站上下载的android源代码编译时默认是编译google设定的产品,如果要开发自己的产品,则需要重新定义一个产品项目,过程如下:

首先我们定义产品的规格,举例如下:

公司名称ardent

产品名称MTP

主板名称merlin

然后安装下面的步骤新建产品项目:

(1)在源代码目录下创建一个用户目录

mkdir vendor

(2)在用户目录下创建一个公司目录

mkdir vendor/merlin

(3)在公司目录下创建一个products目录

mkdir vendor/merlin/products

(4)在上面创建的products下创建一个产品makefile文件MTP.mk,内容如下:

PRODUCT_PACKAGES := \

AlarmClock \

Email \

Fallback \

Launcher2 \

Camera \

Settings \

LatinIME \

NotePad \

SoundRecorder \

Bluetooth \

CertInstaller \

DeskClock

$(call inherit-product, $(SRC_TARGET_DIR)/product/core.mk)

#

# Overrides

PRODUCT_MANUFACTURER := ardent

PRODUCT_BRAND := ardent

PRODUCT_NAME := MTP

PRODUCT_MODEL := MultiMedia Touch Phone

PRODUCT_DEVICE := merlin

PRODUCT_LOCALES := zh_CN

产品makefile文件的编写有一套规则,详细情况见此文后面的补充内容。

(5)在vendor/merlin/products目录下创建一个AndroidProducts.mk文件,定义Android产品配置文件的路径,具体如下:

PRODUCT_MAKEFILES := \

$(LOCAL_DIR)/MTP.mk

(6)在公司目录下创建一个主板目录

mkdir vendor/ardent/merlin

(7)在主板目录下新建一个主板配置文件BoardConfig.mk,内容如下:

TARGET_NO_BOOTLOADER := true

TARGET_NO_KERNEL := true

TARGET_CPU_ABI := armeabi

BOARD_USES_GENERIC_AUDIO := true

USE_CAMERA_STUB := true

(8)如果你希望修改系统属性,则可以在主板目录下新建一个system.prop文件,该文件中可以修改系统属性,举例如下:

# system.prop for

# This overrides settings in the products/generic/system.prop file

#

# rild.libpath=/system/lib/libreference-ril.so

# rild.libargs=-d /dev/ttyS0

(9)在主板目录下建议一个Android的主板配置文件AndroidBoard.mk,此文件是编译系统接口文件,内容如下:

#

LOCAL_PATH := $(call my-dir)

#

# this is here to use the pre-built kernel

ifeq ($(TARGET_PREBUILT_KERNEL),)

TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/kernel

endif

file := $(INSTALLED_KERNEL_TARGET)

ALL_PREBUILT += $(file)

$(file): $(TARGET_PREBUILT_KERNEL) | $(ACP)

$(transform-prebuilt-to-target)

#

# no boot loader, so we don't need any of that stuff..

#

LOCAL_PATH := vendor/ardent/merlin

include $(CLEAR_V ARS)

#

# include more board specific stuff here? Such as Audio parameters.

#

(10)编译新的项目

. build/envsetup.sh

make PRODUCT-MTP-user

补充内容:

(1)上面的新建的几个文件的编写可以参考build/target/board/generic目录下的AndroidBoard.mk,BoardConfig.mk和system.prop

(2)产品makefile的编写规则,变量定义解释如下:

PRODUCT_NAME 终端用户可见的产品名称,对应到“Settings“中的“About the phone”信息PRODUCT_MODEL End-user-visible name for the end product

PRODUCT_LOCALES 1个以空格分隔开的两个字母的语言码加上2字节的国家码的列表,影响到"Settings"中的语言,时间,日期和货币格式设置,

举例:en_GB de_DE es_ES fr_CA

PRODUCT_PACKAGES 需要安装的APK应用程序列表

PRODUCT_DEVICE 工作设计名称,即主板名称

PRODUCT_MANUFACTURER 生产厂家

PRODUCT_BRAND 软件设计针对的客户品牌

PRODUCT_PROPERTY_OVERRIDES 以"key=value"为格式的属性列表

PRODUCT_COPY_FILES 文件复制列表,格式为“原文件路径:目的文件路径”,编译过程中会按照此规则复制文件

PRODUCT_OTA_PUBLIC_KEYS 产品的OTA公共密匙列表

PRODUCT_PACKAGE_OVERLAYS 指示是否使用默认资源或添加任何产品特定的资源,例如:vendor/acme/overlay

PRODUCT_CONTRIBUTORS_FILE HTML文件中包含项目的贡献者

PRODUCT_TAGS 以空格分隔开的指定产品关键词列表

本文来自CSDN博客,转载请标明出处:ttp://https://www.360docs.net/doc/cb6630708.html,/jiajie961/archive/2010/11/07/5993126.aspx

制作ubifs文件系统

1,安装相关的软件包

apt-get install liblzo2-dev

2,获取相关的工具mkfs.ubifs和ubinize

这两个工具是制作ubifs文件系统的时候用到,它们是mtd-utils工具包中的内容,mtd-utils工具包你可以从下面的网站下载和编译出来:

官方网站:https://www.360docs.net/doc/cb6630708.html,/index.html

资源下载网站:https://www.360docs.net/doc/cb6630708.html,/

3,创建一个create-ubifs.sh脚本,主要是调用mkfs.ubifs和ubinize工具和相关参数来制作ubifs文件系统,内容如下:

#!/bin/bash

##########################################################

# Script to generate ubifs filesystem image. #

##########################################################

##### ubinize configuration file

config_file=rootfs_ubinize.cfg

##### Function to check result of the command

check_result() {

if [ $? -ne 0 ]

then

echo "FAILED"

else

echo "SUCCESSFUL"

fi

}

###### Function to check whether an application exists

check_program() {

for cmd in "$@"

do

if [ $? -ne 0 ]

then

echo

echo "Cannot find command \"${cmd}\""

echo

exit 1

fi

done

}

if [ $# -ne 5 ]

then

echo

echo 'Usage: create-ubifs.sh [page_size_in_bytes] [pages_per_block] [partition_size_in_bytes] [blocks_per_device] [path_to_rootfs]'

echo

exit

fi

page_size_in_bytes=$1

echo "Page size [$page_size_in_bytes]bytes."

pages_per_block=$2

echo "Pages per block [$pages_per_block]"

partition_size_in_bytes=$3

echo "File-system partition size [$partition_size_in_bytes]bytes."

blocks_per_device=$4

echo "Blocks per device [$blocks_per_device]"

path_to_rootfs=$5

# wear_level_reserved_blocks is 1% of total blcoks per device

wear_level_reserved_blocks=`expr $blocks_per_device / 100`

echo "Reserved blocks for wear level [$wear_level_reserved_blocks]"

#logical_erase_block_size is physical erase block size minus 2 pages for UBI

logical_pages_per_block=`expr $pages_per_block - 2`

logical_erase_block_size=`expr $page_size_in_bytes \* $logical_pages_per_block`

echo "Logical erase block size [$logical_erase_block_size]bytes."

#Block size = page_size * pages_per_block

block_size=`expr $page_size_in_bytes \* $pages_per_block`

echo "Block size [$block_size]bytes."

#physical blocks on a partition = partition size / block size

partition_physical_blocks=`expr $partition_size_in_bytes / $block_size`

echo "Physical blocks in a partition [$partition_physical_blocks]"

#Logical blocks on a partition = physical blocks on a partitiion - reserved for wear level

patition_logical_blocks=`expr $partition_physical_blocks - $wear_level_reserved_blocks`

echo "Logical blocks in a partition [$patition_logical_blocks]"

#File-system volume = Logical blocks in a partition * Logical erase block size

fs_vol_size=`expr $patition_logical_blocks \* $logical_erase_block_size`

echo "File-system volume [$fs_vol_size]bytes."

echo

echo "Generating configuration file..."

echo "[rootfs-volume]" > $config_file

echo "mode=ubi" >> $config_file

echo "image=rootfs_ubifs.img" >> $config_file

echo "vol_id=0" >> $config_file

echo "vol_size=$fs_vol_size" >> $config_file

echo "vol_type=dynamic" >> $config_file

echo "vol_name=system" >> $config_file

echo

# Note: Check necessary program for installation

#echo -n "Checking necessary program for installation......"

#check_program mkfs.ubifs ubinize

#echo "Done"

#Generate ubifs image

echo -n "Generating ubifs..."

./mkfs.ubifs -x lzo -m $page_size_in_bytes -e $logical_erase_block_size -c $patition_logical_blocks -o rootfs_ubifs.img -d $path_to_rootfs

check_result

echo -n "Generating ubi image out of the ubifs..."

./ubinize -o ubi.img -m $page_size_in_bytes -p $block_size -s $page_size_in_bytes $config_file -v

check_result

rm -f rootfs_ubifs.img

rm -f $config_file

(4)将mkfs.ubifs和ubinize以及create-ubifs.sh放置在同一目录下,然后调用create-ubifs.sh即可创建ubifs 文件系统,create-ubifs.sh用法如下:

create-ubifs.sh page_size_in_bytes(页大小) pages_per_block(每个扇区的页数量) partition_size_in_bytes(分区大小) blocks_per_device(扇区数量) path_to_rootfs(文件系统路径)

举例如下:

./create-ubifs.sh 2048 64 83886080 4096 ./rootfs

上面命令的意思是调用create-ubifs.sh将当前目录下的rootfs文件夹的内容制作成ubifs文件系统,nand flash 的页大小为2k,每个扇区有64页,

总共有4096个扇区,要制作的文件系统的大小为83886080字节。

android编译系统makefile(Android.mk)写法

android编译系统的makefile文件Android.mk写法如下

(1)Android.mk文件首先需要指定LOCAL_PA TH变量,用于查找源文件。由于一般情况下

Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:

LOCAL_PATH:=$(call my-dir)

上面的语句的意思是将LOCAL_PA TH变量定义成本文件所在目录路径。

(2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_V ARS)开始

以include $(BUILD_XXX)结束。

include $(CLEAR_V ARS)

CLEAR_V ARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PA TH以外的所有LOCAL_XXX变量,

如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STA TIC_LIBRARIES等。

include $(BUILD_STATIC_LIBRARY)表示编译成静态库

include $(BUILD_SHARED_LIBRARY)表示编译成动态库。

include $(BUILD_EXECUTABLE)表示编译成可执行程序

(3)举例如下(frameworks/base/libs/audioflinger/Android.mk):

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_V ARS) 模块一

ifeq ($(AUDIO_POLICY_TEST),true)

ENABLE_AUDIO_DUMP := true

endif

LOCAL_SRC_FILES:= \

AudioHardwareGeneric.cpp \

AudioHardwareStub.cpp \

AudioHardwareInterface.cpp

ifeq ($(ENABLE_AUDIO_DUMP),true)

LOCAL_SRC_FILES += AudioDumpInterface.cpp

LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP

endif

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia \

libhardware_legacy

ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

LOCAL_MODULE:= libaudiointerface

ifeq ($(BOARD_HA VE_BLUETOOTH),true)

LOCAL_SRC_FILES += A2dpAudioInterface.cpp

LOCAL_SHARED_LIBRARIES += liba2dp

LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP LOCAL_C_INCLUDES += $(call include-path-for, bluez)

endif

include $(BUILD_STATIC_LIBRARY) 模块一编译成静态库include $(CLEAR_V ARS) 模块二

LOCAL_SRC_FILES:= \

AudioPolicyManagerBase.cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libmedia

ifeq ($(TARGET_SIMULATOR),true)

LOCAL_LDLIBS += -ldl

else

LOCAL_SHARED_LIBRARIES += libdl

endif

LOCAL_MODULE:= libaudiopolicybase

ifeq ($(BOARD_HA VE_BLUETOOTH),true)

LOCAL_CFLAGS += -DWITH_A2DP

endif

ifeq ($(AUDIO_POLICY_TEST),true)

LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

endif

include $(BUILD_STATIC_LIBRARY) 模块二编译成静态库

include $(CLEAR_V ARS) 模块三

LOCAL_SRC_FILES:= \

AudioFlinger.cpp \

AudioMixer.cpp.arm \

AudioResampler.cpp.arm \

AudioResamplerSinc.cpp.arm \

AudioResamplerCubic.cpp.arm \

AudioPolicyService.cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia \

libhardware_legacy

ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybase

LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy endif

ifeq ($(TARGET_SIMULATOR),true)

LOCAL_LDLIBS += -ldl

else

LOCAL_SHARED_LIBRARIES += libdl

endif

LOCAL_MODULE:= libaudioflinger

ifeq ($(BOARD_HA VE_BLUETOOTH),true)

LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP LOCAL_SHARED_LIBRARIES += liba2dp

endif

ifeq ($(AUDIO_POLICY_TEST),true)

LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

endif

ifeq ($(TARGET_SIMULATOR),true)

ifeq ($(HOST_OS),linux)

LOCAL_LDLIBS += -lrt -lpthread

endif

endif

ifeq ($(BOARD_USE_LVMX),true)

LOCAL_CFLAGS += -DLVMX

LOCAL_C_INCLUDES += vendor/nxp

LOCAL_STATIC_LIBRARIES += liblifevibes

LOCAL_SHARED_LIBRARIES += liblvmxservice

# LOCAL_SHARED_LIBRARIES += liblvmxipc

endif

include $(BUILD_SHARED_LIBRARY) 模块三编译成动态库

(4)编译一个应用程序(APK)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

# Tell it to build an APK

include $(BUILD_PACKAGE)

(5)编译一个依赖于静态Java库(static.jar)的应用程序

include $(CLEAR_VARS)

# List of static libraries to include in the package LOCAL_STATIC_JA V A_LIBRARIES := static-library

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

# Tell it to build an APK

include $(BUILD_PACKAGE)

(6)编译一个需要用平台的key签名的应用程序LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := platform

# Tell it to build an APK

include $(BUILD_PACKAGE)

(7)编译一个需要用特定key前面的应用程序LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := vendor/example/certs/app

# Tell it to build an APK

include $(BUILD_PACKAGE)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Module name should match apk name to be installed.

LOCAL_MODULE := LocalModuleName

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

(9)添加一个静态JA V A库

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Any libraries that this library depends on

LOCAL_JA V A_LIBRARIES := android.test.runner

# The name of the jar file to create

LOCAL_MODULE := sample

# Build a static jar file.

include $(BUILD_STATIC_JA V A_LIBRARY)

(10)Android.mk的编译模块中间可以定义相关的编译内容,也就是指定相关的变量如下:

LOCAL_AAPT_FLAGS

LOCAL_ACP_UNA V AILABLE

LOCAL_ADDITIONAL_JA V A_DIR

LOCAL_AIDL_INCLUDES

LOCAL_ALLOW_UNDEFINED_SYMBOLS

LOCAL_ARM_MODE

LOCAL_ASFLAGS

LOCAL_ASSET_DIR

LOCAL_ASSET_FILES 在Android.mk文件中编译应用程序(BUILD_PACKAGE)时设置此变量,表示资源

通常会定义成LOCAL_ASSET_FILES += $(call find-subdir-assets)

LOCAL_BUILT_MODULE_STEM

LOCAL_C_INCLUDES 额外的C/C++编译头文件路径,用LOCAL_PATH表示本文件所在目录

举例如下:

LOCAL_C_INCLUDES += extlibs/zlib-1.2.3

LOCAL_C_INCLUDES += $(LOCAL_PA TH)/src

LOCAL_CC 指定C编译器

LOCAL_CERTIFICATE 签名认证

LOCAL_CFLAGS 为C/C++编译器定义额外的标志(如宏定义),举例:LOCAL_CFLAGS += -DLIBUTILS_NA TIVE=1

LOCAL_CLASSPATH

LOCAL_COMPRESS_MODULE_SYMBOLS

LOCAL_COPY_HEADERS install应用程序时需要复制的头文件,必须同时定义LOCAL_COPY_HEADERS_TO

LOCAL_COPY_HEADERS_TO install应用程序时复制头文件的目的路径

LOCAL_CPP_EXTENSION 如果你的C++文件不是以cpp为文件后缀,你可以通过LOCAL_CPP_EXTENSION指定C++文件后缀名

如:LOCAL_CPP_EXTENSION := .cc

注意统一模块中C++文件后缀必须保持一致。

LOCAL_CPPFLAGS 传递额外的标志给C++编译器,如:LOCAL_CPPFLAGS += -ffriend-injection

LOCAL_CXX 指定C++编译器

LOCAL_DX_FLAGS

LOCAL_EXPORT_PACKAGE_RESOURCES

LOCAL_FORCE_STATIC_EXECUTABLE 如果编译的可执行程序要进行静态链接(执行时不依赖于任何动态库),则设置LOCAL_FORCE_STA TIC_EXECUTABLE:=true

目前只有libc有静态库形式,这个只有文件系统中/sbin目录下的应用程序会用到,这个目录下的应用程序在运行时通常

文件系统的其它部分还没有加载,所以必须进行静态链接。

LOCAL_GENERATED_SOURCES

LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME

LOCAL_INTERMEDIATE_SOURCES

LOCAL_INTERMEDIATE_TARGETS

LOCAL_IS_HOST_MODULE

LOCAL_JAR_MANIFEST

LOCAL_JARJAR_RULES

LOCAL_JA V A_LIBRARIES 编译java应用程序和库的时候指定包含的java类库,目前有core和framework 两种

多数情况下定义成:LOCAL_JA V A_LIBRARIES := core framework

注意LOCAL_JA V A_LIBRARIES不是必须的,而且编译APK时不允许定义(系统会自动添加)

LOCAL_JA V A_RESOURCE_DIRS

LOCAL_JA V A_RESOURCE_FILES

LOCAL_JNI_SHARED_LIBRARIES

LOCAL_LDFLAGS 传递额外的参数给连接器(务必注意参数的顺序)

LOCAL_LDLIBS 为可执行程序或者库的编译指定额外的库,指定库以"-lxxx"格式,举例:

LOCAL_LDLIBS += -lcurses -lpthread

LOCAL_LDLIBS += -Wl,-z,origin

LOCAL_MODULE 生成的模块的名称(注意应用程序名称用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)

LOCAL_MODULE_PATH 生成模块的路径

LOCAL_MODULE_STEM

LOCAL_MODULE_TAGS 生成模块的标记

LOCAL_NO_DEFAULT_COMPILER_FLAGS

LOCAL_NO_EMMA_COMPILE

LOCAL_NO_EMMA_INSTRUMENT

LOCAL_NO_STANDARD_LIBRARIES

LOCAL_OVERRIDES_PACKAGES

LOCAL_PACKAGE_NAME APK应用程序的名称

LOCAL_POST_PROCESS_COMMAND

LOCAL_PREBUILT_EXECUTABLES 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用,指定需要复制的可执行文件

LOCAL_PREBUILT_JA V A_LIBRARIES

LOCAL_PREBUILT_LIBS 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用, 指定需要复制的库.

LOCAL_PREBUILT_OBJ_FILES

LOCAL_PREBUILT_STATIC_JA V A_LIBRARIES

LOCAL_PRELINK_MODULE 是否需要预连接处理(默认需要,用来做动态库优化)

LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)

LOCAL_RESOURCE_DIR

LOCAL_SDK_VERSION

LOCAL_SHARED_LIBRARIES 可链接动态库

LOCAL_SRC_FILES 编译源文件

LOCAL_STA TIC_JA V A_LIBRARIES

LOCAL_STA TIC_LIBRARIES 可链接静态库

LOCAL_UNINSTALLABLE_MODULE

LOCAL_UNSTRIPPED_PA TH

LOCAL_WHOLE_STATIC_LIBRARIES 指定模块所需要载入的完整静态库(这些精通库在链接是不允许链接器删除其中无用的代码)

LOCAL_YACCFLAGS

OVERRIDE_BUILT_MODULE_PA TH

Android系统移植(一)-让android系统在目标平台上运行起来

Android系统由于用的是linux内核,因此内核移植和嵌入式linux内核移植差异不大,过程如下:

(1)移植boot-loader和linux2.6内核到目标平台上,让linux内核可以启动起来,基本的驱动允许正常。此过程完全是嵌入式linux的开发,这里直接跳过。需要注意的是,由于android已经被linux官方开除,因此从

网站上(如https://www.360docs.net/doc/cb6630708.html,/)下载的最新linux内核源代码已经不包含android的专有驱动,因此建议

从google网上下下载Linux内核,android源代码浏览网站如下:

https://www.360docs.net/doc/cb6630708.html,/

从该网站上发现内核相关的包如下:

kernel/common.git 通用android内核项目

kernel/experimental.git 实验性内核项目

kernel/linux-2.6.git 这个是标准的Linux内核,没有android的驱动

kernel/lk.git 微内核项目

kernel/msm.git 这个是高通msm7xxx系列芯片所用内核

kernel/omap.git

kernel/tegra.git NVIDIA Tegra系列芯片所用内核

下载内核代码的方法如下:

git clone git://https://www.360docs.net/doc/cb6630708.html,/kernel/common.git

下载完后用git branch -a查看所有git分支,结果如下:

android-2.6.27

origin/HEAD

origin/android-2.6.25

origin/android-2.6.27

origin/android-2.6.29

origin/android-2.6.32

origin/android-2.6.35

origin/android-2.6.36

origin/android-goldfish-2.6.27

origin/android-goldfish-2.6.29

然后切换到最新分支git checkout origin/android-2.6.36

(2)修改内核配置文件,打开Android必须的驱动(日志和BINDER)如下:

CONFIG_ANDROID=y

CONFIG_ANDROID_BINDER_IPC=y

CONFIG_ANDROID_LOGGER=y

(3)为了提高启动速度,采用ramdisk,将android文件系统的部分内容压缩到内核中。

首先打开内核驱动:

CONFIG_BLK_DEV_INITRD=y

CONFIG_INITRAMFS_SOURCE="root"

CONFIG_INITRAMFS_ROOT_UID=0

CONFIG_INITRAMFS_ROOT_GID=0

然后在android源代码编译出来的out/target/product/merlin/root目录复制到内核目录下。

(4)根据android文件系统的要求对nand flash进行重新分区,举例如下:

将nand flash分区以下8个分区

NTIM

OBM

U-boot

Kernel

System

UserData

Mass Storage

BBT

(5)根据分区表修改内核启动参数如下:

CONFIG_CMDLINE="ubi.mtd=4 ubi.mtd=5 ubi.mtd=6 root=ubi0_0 rootfstype=ubifs console=ttyS1,115200 uart_dma init=/init"

参数的意思是:载入的文件系统部分有3个分区,分别为nand flash的第4,5,6分区(从0编号),文件系统采用ubifs格式,控制台设备为ttyS1,波特率为115200

启动的第一个应用程序是/init

(6)确保控制台的设置和硬件保持一致,如:硬件上串口用的是UART1,则内核启动参数中设置有console=ttyS1,而且android的启动过程中设要设置正确,修改

部分位于android源代码system/core/init/init.c文件中,将

static char *console_name = "/dev/console";

修改成

static char *console_name = "/dev/ttyS1";

(7)修改android源代码system/core/rootdir目录下的init.rc文件,作如下修改(android默认yaffs2文件系统):

首先将android文件系统修改成可读写,将

mount rootfs rootfs / ro remount

修改成

mount rootfs rootfs / rw remount

然后修改挂载system和userdata部分的代码,将

# Mount /system rw first to give the filesystem a chance to save a checkpoint

mount yaffs2 mtd@system /system

mount yaffs2 mtd@system /system ro remount

mount yaffs2 mtd@userdata /data nosuid nodev

chown system system /data

chmod 0771 /data

改成

# Mount /system rw first to give the filesystem a chance to save a checkpoint

mount ubifs ubi0_0 /system ro

# We chown/chmod /data again so because mount is run as root + defaults

mount ubifs ubi1_0 /data nosuid nodev

chown system system /data

chmod 0771 /data

(8)完成后编译内核,可以启动文件系统,控制台可用,但是没有显示启动log,而且不停的重启。

(9)系统不停的重启,因此控制台已经可用了,自然而然的想到看到logcat日志,一看,发现logcat设备居然没起来,配置文件里面都定义了

居然没起来,查看了下内核drivers/staging/android目录,没有.o文件,证明是没编译到,在看内核目录下的.config文件,发现居然没有了

logcat和binder的宏定义,配置文件里面有定义而.config文件中无定义,肯定是相关Kconfig文件的问题,通过分析drivers/staging目录下的

Kconfig文件发现是因为STAGING_EXCLUDE_BUILD宏默认是y,在配置文件中否定此宏即可,在配置文件中CONFIG_STAGING定义后加上即可,如下:

CONFIG_STAGING=y

# CONFIG_STAGING_EXCLUDE_BUILD is not set

修改后重新编译发现系统完成正常启动,启动过程中启动log也显示正常。

至此,android初步移植工作已经完成,当然,系统还有很多问题,需要下一步继续修改。

总结:android的移植按如下流程:

(1)android linux内核的普通驱动移植,让内核可以在目标平台上运行起来。

(2)正确挂载文件系统,确保内核启动参数和android源代码system/core/rootdir目录下的init.rc中的文件系统挂载正确。

(3)调试控制台,让内核启动参数中的console参数以及android源代码system/core/init/init.c中的console_name设置和硬件保持一致

(4)打开android相关的驱动(logger,binder等),串口输入logcat看logger驱动起来,没有的话调试logger驱动。

说明:ARM的内核配置文件定义在内核arch/arm/configs目录下

Android系统移植(二)-按键移植

这一部分主要是移植android的键盘和按键

(1)Android使用标准的linux输入事件设备(/dev/input目录下)和驱动,按键定义在内核include/linux/input.h文件中,

按键定义形式如下:

#define KEY_ESC 1

#define KEY_1 2

#define KEY_2 3

(2)内核中(我的平台是arch/arm/mach-mmp/merlin.c文件)中按键的定义如下形式:

static struct gpio_keys_button btn_button_table[] = {

[0] = {

.code = KEY_F1,

.gpio = MFP_PIN_GPIO2,

.active_low = 1, /* 0 for down 0, up 1; 1 for down 1, up 0 */

.desc = "H_BTN button",

.type = EV_KEY,

/* .wakeup = */

.debounce_interval = 10, /* 10 msec jitter elimination */

},

[1] = {

.code = KEY_F2,

.gpio = MFP_PIN_GPIO3,

.active_low = 1, /* 0 for down 0, up 1; 1 for down 1, up 0 */

.desc = "O_BTN button",

.type = EV_KEY,

/* .wakeup = */

.debounce_interval = 10, /* 10 msec jitter elimination */

},

[2] = {

.code = KEY_F4,

.gpio = MFP_PIN_GPIO1,

.active_low = 1, /* 0 for down 0, up 1; 1 for down 1, up 0 */

.desc = "S_BTN button",

.type = EV_KEY,

/* .wakeup = */

.debounce_interval = 10, /* 10 msec jitter elimination */

},

};

static struct gpio_keys_platform_data gpio_keys_data = {

.buttons = btn_button_table,

.nbuttons = ARRAY_SIZE(btn_button_table),

};

static struct platform_device gpio_keys = {

.name = "gpio-keys",

android系统开发工作介绍

android系统开发工作介绍 一、android的开发工作 Android的开发分为三个类型:移植开发移动设备系统;android系统级开发和应用程序开发。 1、移植开发移动设备系统 2、Android系统级开发,指的是扩展android的框架或者是修改bug,这方面比较少,除非有些开发移动设备的厂商,比如做gps,可以往里面加入一些自己的特定系统东西,这可能导致一些不兼容。当然也可能是简单的修复bug,详细的内容后面还有说。 3、开发应用程序,这应该是比较主流的开发,也就是给android系统写应用程序。当然我们这里主要是研究android的framework如何给这些应用程序提供服务的。 总结一下,我们可以把android分为四个层次,从底层往上依次为:linux内核、C/C++库、java 框架和java应用程序。移植开发移动设备涉及到linux内核(包括其驱动);android系统级开发涉及到C/C++库的开发及给上层java框架;android应用程序开发就是调用java的框架写应用程序。 简单的从上到下,android应用程序需要有java框架支持,比如它要发送短信,就需要java 框架,java框架其实就是将C/C++库包装成为了一个JNI,而实现具体的功能是C/C++库,最后驱动硬件完成功能,这也就是linux内核部分。 所谓framework,也就是系统级开发,这将是本文的重点,虽然android的framework 开发比较少,但是对其了解后更有利于整体开发的进行,当然很多设备厂商还是非常需这要些的。 二、android系统架构

Linux内核及驱动、C/C++框架、java框架、java应用程序。 1)、Linux内核及驱动 其中linux内核及驱动是内核层的(本人对linux内核也有过痴迷的时候,就像现在android 痴迷一样),系统总是需要操作系统的支持的,比如内存管理、进程管网理、络协议栈等。 2)、android的C/C++框架 系统C库:用的是libc,没什么好说的,C程序员都知道。多媒体库SurFace Manager:显示子系统的管理器LibWebCore:web浏览器引擎,支持android浏览器SGL:skia图形库,底层的2D图形引擎 3D库:OpenGL FreeType:字体显示Android的运行环境,这个也应该属于这个框架里面的,android的虚拟机叫做Dalvik,运行环境就是由这个虚拟机和基础的java类库组成。 3)、android应用框架 提供一系列的服务和系统,包括视图、内容提供器、资源管理器、通知管理器活、动管理器。 视图非常丰富:list、grid、text box、button等。内容提供器是使得应用程序可以访问另一个程序的数据。资源管理器是提供访问非代码的资源访问,如布局文件。通知管理器,使得程序可以在状态栏中显示自定义的提示信息。活动管理器,用来管理程序生命周期。 4)、android应用程序Android所有的应用程序都是用java写的,当然现在好像也支持一些脚本语言,如 ruby,但是不支持C开发,所谓支持C开发是指jni的形式。 。。。。。。。。。

安卓Android ROM定制、移植:第六篇:boot.img、recovery解包和打包

太抱歉了,因为教程实在是有点粗浅了,其实很多东西都不知道怎么去写,这不是复制粘贴,当然很多只是一步步的走的,不过也许我自己觉得已经阐述的很清楚了,可是一旦别人看起来,还是感觉很深奥,没办法,本人就这点能力了,呵呵! 大家都知道安卓的核心更换呢,那是在boot.img里面,那么如何在WINDOWS下去解开它呢,LINUX的自己略过。。。。 首先百度BOOTIMG.EXE,然后你懂的,会出来一大堆,这得感谢制作bootimg.exe的作者,本来是为华为的机器做的分解工具,不过我们也可以拿来分解boot.img、recovery.img等,OK!先来谈谈这两个文件的基础,部分来自网络。 boot和recovery映像的文件结构 boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk 内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做bootimg.h的文件。 (译者的话,原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。 /* ** +-----------------+ ** | boot header | 1 page ** +-----------------+ ** | kernel | n pages ** +-----------------+ ** | ramdisk | m pages ** +-----------------+ ** | second stage | o pages ** +-----------------+

S3C6410 移植Android 内核移植经验

主要过程: . 安装lunux 环境 . 安装编译工具 . 下载Linux kernel . 安装Android SDK . 获得root file system . 修改Linux kernel 源码 . 配置Linux kernel . 修改root file system . 编译Linux kernel . 下载kernel Image 1.安装linux 环境 安装Ubuntu Linux 系统,从网站上下载操作系统安装光盘映像,地址: https://www.360docs.net/doc/cb6630708.html,/ubuntu/releases/8.04/ 下载ubuntu-8.04.2-desktop-i386.iso,刻录成光盘安装,安装可以在windows 系统下进行, 选取有15G 空间的硬盘安装,输入用户密码开始安装 这一步结束退出光盘重启进入Ubuntu 系统,完成余下系统安装。 Linux 安装完成,进入Ubuntu 系统,确保电脑连接Internet,安装一些必要软件。 打开终端输入命令框,进行下面的操作: $ sudo apt-get install ssh $ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl

$ sudo apt-get install valgrind $ sudo apt-get install sun-java6-jdk $ sudo apt-get install libncurses5-dev 所有软件系统会自动从网络下载安装,完成后可以开始Android 的移植。 2.安装编译工具 下载: $ wget https://www.360docs.net/doc/cb6630708.html,/public/gnu_toolchain/arm-none-linux-gnuea bi/arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 安装: $ tar -xjvf arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 3.下载Linux kernel 从下面地址获得: https://www.360docs.net/doc/cb6630708.html,/p/android/downloads/list?can=1&q=&colspec=File name Summary Uploaded Size DownloadCount Kernel : linux-2.6.23-android-m5-rc14.tar.gz 解压文件 $ tar -xf linux-2.6.23-android-m5-rc14.tar.gz 4.安装Android SDK 从网上下载linux 版本的Android SDK,如下 https://www.360docs.net/doc/cb6630708.html,/android/android-sdk_m5-rc15_linux-x86.zip 下载后解压,获得android-sdk_m5-rc15_linux-x86 文件 5.获得root file system ⑴下载busybox 工具从下面地址 http://benno.id.au/blog/2007/11/14/android-busybox(linux 环境中下载)⑵运行emulator 获取root file system $ cd <目录>/ android-sdk_m5-rc15_linux-x86/tools $ ./emulator& 等待emulator 启动,看到出现Android 系统画面,进入菜单ALL/Dev Tools/Development Settings 下,将Wait for debugger,Show running processes,Show screen updates 这三项打勾,回到命令输入终端。 $ ./adb push /busybox /data $ ./adb shell # /data/busybox tar -czf system.tar.gz /system # /data/busybox tar -czf data.tar.gz /data # /data/busybox tar -czf etc.tar.gz /etc # /data/busybox tar -czf sbin.tar.gz /sbin # exit $ ./adb pull /system.tar.gz ./ $ ./adb pull /data.tar.gz ./

【IT专家】yolo模型移植到android手机端

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 yolo模型移植到android手机端 2017/08/18 665 之前写了android demo在手机上的运用,但是模型都是官方给的,想要替换成自己的模型,因此尝试了下将自己训练的yolo模型来替换demo给的模型。首先,darknet的训练和.weight文件到.pb文件的转化,以及android demo 的实现见之前的博客。在此不再叙述sdk,nkd等配置问题,且直接使用.pb文件。其次,默认已安装android studio。 (1)终端进入(android安装目录)/bin,输入./stuodio.sh开启android studio ?(2)点击new,import project导入(tensorflow所在路径)/tensorflow/examples/android文件夹(可连接手机先run,保证demo能够正常运行后再行修改) ?(3)将build.gradle中68行的bazelLocation改为自己bazel的路径:def bazelLocation = ‘/home/seven/bin/bazel’185行apply from: “download-models.gradle”注释掉,并在第112行,增加//*/(不然后面的内容都被当做注释了): ?if (nativeBuildSystem == ‘bazel’ || nativeBuildSystem == ‘makefile’) { // TensorFlow Java API sources. java { srcDir ‘../../java/src/main/java’ exclude ‘**/examples/**’//*/ } // Android TensorFlow wrappers, etc. java { 最后,将第76行开始的内容改为自己需要的版本号: android { compileSdkVersion 25 buildToolsVersion “26.0.1” if (nativeBuildSystem == ‘cmake’) { defaultConfig { applicationId = ‘org.tensorflow.demo’ minSdkVersion 21 targetSdkVersion 25 ndk { abiFilters “${cpuType}” } (4)将转化得到的.pb文件放在(tensorflow所在路径)/tensorflow/examples/android/assets文件夹内,为方便起见,可将此.pb重命名为graph-tiny-yolo-voc.pb。若文件夹中已存在此文件名的文件,删除之。 ?(5)该项目将一次性生成三个app,因为我只需要detect一个,在AndroidManifest.xml中删除关于另外的两个activity,修改后的文件如图 ?

Android_ROM制作移植及精简教程

Android_ROM制作,精简及移植教程 本教程主要内容有:Android系统文件夹结构解析、应用软件说明、定制精简、ROM签名把包等内容。刷机有风险,出问题自负。其实这个教程一早就想写的,但由于时间及本人的懒惰,一直拖着。今晚终于静下心来写好本文,本文有部份内容来自于网络。 速度与华丽,你喜欢那个。是不是想要一个又够速度又华丽的ROM呢?我是一个追求新鲜的人,对于手机的ROM,我又追求稳定、精简、美观、省电。现在Hero ROM有很多,最新的有第三方Android 2.1版本,但这些ROM的制作者都会跟据自已的个人喜欢会增加和增少相应的功能或是界面,但我们往往不喜欢这些ROM的某些小方面,所以随着而来面对的问题就是怎样把这个ROM修改成为一个自已真正需要的ROM呢?以往一直是依靠“大杀器”来解决,但觉得还是过于麻烦,所以寻求办法自己动手修改ROM。于是有了本文。废话少说,进入题。 一、Android系统文件夹结构 一个完整的ROM根目录会有以下几个文件夹及文件: data META-IN system boot.img 系统目录说明 1. 应用程序安装目录 1) 系统应用程序所在目录 /system/app/*.apk 2)用户安装应用程序所在目录 /data/app/*.apk 3) 注意: a)在模拟器中,每重启一次,/system/app/下的应用都会被还原,有时/data/app下也会被清除 b)若在/system/app和/data/app下有重名的应用,不一定会启动哪一个,尤其是在adb install杀死正在运行的程序时,有时旧的就会被启动 2.用户数据所在目录 /data/data/应用包名/shared_prefs 配置文件 /data/data/应用包名/databases/* 库文件所在目录 3. SD卡对应目录 /sdcard/

安卓系统移植经验之谈,教你三分钟移植

每当我闲下来时不发Rom时,就会整理一下思路,发发教程啥的,我觉得能带动机油们自己打造、改造Rom,共同提升,才是Romer的追求。 发Rom也好,教程也好,我的宗旨是不设回复可见,如果你觉得好,回复或者评分鼓励一下,我就很开心了。 不过这样做的一个遗憾就是,我的帖子通常回复率不够高,沉得快。 好了,闲话少说,上教程。 注:可能你会觉得文字教程比较干枯,不够形象生动,但是请精心看,我会尽量讲得具体、清晰。 首先,我并不算是移植高手,这个教程只是我在自己移植过程中的的一些收获体会,一些经验之谈。 如果你觉得有什么不对或值得改进的地方,欢迎和我交流,我们一起来完善这个教程。 因为移植所涉及的机型、配置相当多变和复杂,所以我无法讲具体细节,只能讲大致的原则。 可以结合我移植U8800+的JoyOS到U8860的例子作为参考进行理解。 我把这些原则抽象出来,命名为Rom移植5步法,具有一定的通用性。 Rom移植的方向有正向和逆向之分: 正向的做法通常就是,找个目标机型的底包,然后把要移植的包的app和framework提取出来替换进去。 这样的优点是改动无需太大,非常快捷;缺点是经常因为一些bin下的程序或者

库文件的差异而导致成功率不够高。 逆向的做法是,拿要移植的包作为底包,把目标机型的内核、wifi驱动、传感器库文件、配置文件等替换进去。 这样做要复杂一些,需要准确两个包的差异,知道应该改哪里; 优点自然是不成则已,一旦移植成功能最大限度地发挥Rom性能,因为框架、程序与底层的契合度要比正向法好。 我这个教程以逆向法为例。 另外,Rom移植有风险,刷机测试需谨慎,如有本人操作不当导致出现任何问题,本人概不负责。 Rom移植5步法: 1.Rom移植涉及的东西比较偏底层,所以在移植之前必须清楚目标机型的硬件配置,分区结构。 这里的配置不是说主频多少、内存多少,这两个参数基本上不会影响移植的进行。对于移植,最关键的因素是主板平台,通常采用同一系列的cpu的不同机型的Rom移植的成功率要高很多。 比如,U8800+和U8860均是高通8255处理器,虽然主频不一样,但它们却同属于同样的MSM7x30平台。 他们之间的互相移植,绝对要比与MSM7K平台的中兴V880互相移植来的容易得多。 至于为什么要弄清分区结构,会在下面讲到。

ANDROID Platform GT818 驱动移植说明书

Android平台GT818驱动移植说明书 【程序总揽】 本程序针对Android2.1系统,移植的硬件平台为华天正科技开发的Real6410(基于S3C6410)。本驱动支持多指,能够在系统支持的情况下在主控进入关屏状态时自动调整GT818工作状态,达到省电的目的。 1.1系统资源使用 1.2系统运行流程 为了便于移植,程序中采用了中断和定时查询两种方式,并建议使用中断方式。以中断方式为例,系统的主运行流程如下所示: 1.创建Guitar对应的i2c_client对象,其中完成了该适配器的相关信息设置; 2.加载触摸屏驱动,注意该驱动必须在I2C总线驱动已经加载的情况下才能进行,否则I2C通信将 出错。程序中将其加载优先级设为最低; 3.创建驱动结构体,探测Guitar设备,并将其挂载到I2C总线驱动上;测试I2C通信,注册input 设备,申请IO口和中断资源,完成Guitar初始化工作(如有需要,烧录升级在此进行); 4.开启触摸屏中断,等待数据接收; 5.收到触摸屏数据中断,关中断; 6.通过I2C传输数据,分析手指信息,; 7.更新按键信息,上报手指坐标、按键等信息,开中断; 8.重复4-7之间的循环。

【移植指南】 4.准备工作 本驱动采用GPL许可证,代码没有采用模块方式,所以使用本驱动前需要重新编译内核。在编译内核前,

我们需要做好以下准备工作: 1、在硬盘上或使用虚拟机(如VmWare)安装Linux系统,推荐使用Ubuntu9.10; 2、安装gcc及arm-linux-gcc和其他编译工具,将CC和LD指定为arm-linux-gcc; 3、获取平台对应的Android源码,解压到自己的工作目录。 4、了解移植平台的IO口、中断、I2C总线的使用方式。 5.内核编译配置 在编译代码前我们需要进行内核编译配置,可以使用下面命令中的一个: #make xconfig (基于QT的图形配置界面,非常直观,推荐使用) #make menuconfig (基于文本菜单的配置界面) 下面我们以make xconfig为例,将我们的驱动增加到内核中去。假定我们源代码目录为: ~/android/kernel/ 将编写的源代码复制到Linux内核源代码的相应目录: ~/android/kernel/driver/input/touchscreen/goodix_touch.c ~/android/kernel/include/linux/goodix_touch.h ~/android/kernel/include/linux/goodix_update.h //如果不做烧录则可以不加 1.在目录touchscreen的Kconfig文件中增加新源代码对应项目的编译配置选项: #----------------------------------------------------------------- config TOUCHSCREEN_GOODIX_GT818 # 配置项名称 tristate "S3C6410 TouchScreen Driver" #选择项,选择Y标识要将其编译进内核 default y #默认编译选项 depends on I2C #依赖项,本驱动必须工作在I2C总线驱动的基础上 help #帮助信息 It is a android driver to support Gooidx's touchscreen whose name is guitar on s3c6410 platform. The touchscreen can support multi-touch not more than two fingers. Say Y here to enable the driver for the touchscreen on the S3C SMDK board. If unsure, say N.To compile this driver as a module, choose M here: the module will be called goodix_touch.ko. #----------------------------------------------------------------- 注意: 当将编译选项设置为M时,编译生成的驱动需要我们手动挂载。如需要系统启动时自动挂载,需要将模块goodix_touch.ko拷贝到系统模块加载目录,并修改对应的启动过程的rc脚本。 2.在目录touchscreen的makefile文件中增加对新源代码的编译条目; #这里的二进制文件名必须与源文件名移植,如goodix_touch

任意安卓移植ROM教程,超详细ROM技术学习

任意安卓移植ROM教程,超详细ROM技术学习 相信有过刷机经历的都知道安卓系统的构造,我们讲述一下安卓的几大组成:从内核基于linux开始,整个系统就运行在一个虚拟机上,这是安卓的一大特征!! 那么我们移植的时候要修改哪一部分?这就是我们这个帖子的重点了。在刷机时,我们大多使用zip格式的升级包进行刷机,那zip格式的升级包是怎么样的一个组成呢?一个zip升级包的完整构造,其中我们要移植所需要修改的就是META-INF里的刷机脚本。 对于这个构造,有必要完整的解释一次。 META-INF 这里面主要是签名文名和刷机时执行的脚本(updater-script),移植时,我们主要要更改的就是刷机的脚本。system 这里面就是android的系统部分app 这里存放的是系统的app,每个app都有两个文件,一个*.apk,一个*.odex,我们在移植时,要将这个文件合并到对应的*.apk里面去,apk文件其实就是一个zip文件,可以用WinRAR或7zip打开的,当然,合并odex文件不是把它改名直接放到apk里去这么简单的,后面具体介绍一下。还有,这个文件夹里面的程序,刷完以后是不能通过程序管理来卸载的。bin 这里面存放的是native程序,不好意思,一下子忘掉中文怎么说了。简单来说,apk是JAVA 程序,而这个是C/C++的程序。etc 这里面存放的是系统默认的配置文件,GPS的配置也在这里J。fonts 这个是字体文件夹,一般很少改动,除非要做美化framework 这里存放的是android框架,移植MIUI,很多改动在这个文件夹里,美化ROM的话,主要改framework-res.apk就可以了。当然,MIUI本身就有主题机制了,不用这么麻烦去改。这个文件夹里也会有对应的odex文件。lib 一些通过的类库,一般是由app/bin里面的程序调用的。media 媒体文件,要添加系统默认的铃声就在这里了。如果是别的ROM的话,壁纸也会放在这里面。

android系统移植emmc记录(2)--u-boot烧写emmc方式

android系统移植emmc记录(2)--u-boot烧写emmc方式 U-boot 支持2种方式烧写 emmc设备: Fastboot命令:通过usb接口烧写。 步骤: 1.编写u-boot支持从sd卡启动,里面涉及到文件的修改,下面讲解。 2.按照上述方法,把u-boot烧录到sd上,使开发板从sd卡启动。 3.进入开发板命令终端 # : 4.首先格式emmc,目的是分配4个分区。分别为vfat分区, system 分区, userdata分区, Cache分区. # : fdisk -c 0 -c :表示格式当前设备 0:表示初始化的emmc设备节点,mmc/sd设备加载顺序,分配的节点从0开始到3结束。不管你从哪个通道指定起始设备,多从0开始分配。如:emmc占用通道0口, 分配的节点是 0,sd卡占用通道2口,分配的节点是 1. 如果不初始化emmc,只使用sd卡模式,在sd卡占用通道2口时,分配的节点是 0.这点请了解源代码,后续会修改。 所以,如果想给板子上SD分区的话,使用如下命令(在emmc也初始化成功的情况下) #: fdisk -c 1 查看设备分区情况: #:fdisk -p 0 5.格式化分区,vfat分区为fat32格式。其它都为 ext3文件系统格式. 格式vfat分区: #:fatformat mmc 0:1 0:同上意思,表示的已经加载的emmc设备节点。 1:表示第1个分区,注意。程序默认第一个分区必须为fat分区, 只能指定为 1,程序会比较是否为分区1,不是就不会格式化。 格式ext3分区: #:ext3format mmc 0:2 //system #:ext3format mmc 0:3 //userdata #:ext3format mmc 0:4 //cache 6:烧写文件: #:fastboot 给开发板通过usb线跟pc连接。 下载工具:fastboot到windows下,把要烧录的文件 zImage system userdata放到fastboot 文件里面。 点windows下开始 ---->运行 :输入:cmd 在控制行下进入fastboot所在的路径如: 输入命令: fastboot flash bootloader u-boot.bin fastboot flash kernel zImage fastboot flash ramdisk ramdisk-uboot.img

安卓Android ROM定制、移植教程。

CyanogenMOD移植教程 转自秋叶随风Ivan;乐蛙论坛等。 第一章:环境的搭建 一.系统选择和安装 建议使用ubuntu LTS 10.04 X64 新手朋友推荐Deepin Linux 基于ubuntu定制的,适合新手使用https://www.360docs.net/doc/cb6630708.html,/download 系统安装教程,以下方法通用于UBUNTU官方版本 U盘安装:https://www.360docs.net/doc/cb6630708.html,/index.php/Unetbootin 光盘安装:https://www.360docs.net/doc/cb6630708.html,/index.php/光盘安装 搭建android编译环境: 英文好的请猛击这里:WIKI: https://www.360docs.net/doc/cb6630708.html,/index.php?title=Building_from

_source 1.安装JDK 因为ANDROID大部分东西是java写的,所以首先我们需要安装JDK 打开终端按照如下命令输入或者直接复制粘贴: 编译android 2.3 或者更新的版本请使用jdk 6 $ sudo add-apt-repository "deb https://www.360docs.net/doc/cb6630708.html,/ lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk如果你需要编译的是2.2以下的版本请使用JDK 5,因为现在大家都是使用Gingerbread 以上的系统,这里就不介绍jdk5如何安装的了,如果有需要请度娘或者google 2.安装各种依赖包 64位环境:依然是终端中输入 $ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \

Android系统分析

Android操作系统分析 穆英华 基于Linux内核的Android操作系统尽管非常年轻,却已经占领了智能手机9%的市场,而且还在向其它移动平台及嵌入式领域迅速扩张着。下图为2010年一季度的智能手机操作系统占有率统计。在国内外制造商纷纷推出基于Android的产品、Android Market中的应用程序飞速增长的背景下,有必要对Android操作系统的情况进行调研,对比其与Midinux的优劣势、估计其机遇或威胁。本文将从以下几个方面分析Android:目标用户群、支持硬件架构、平台技术架构、应用程序数量、未来发展方向。 一.目标用户群 覆盖高、中、低端智能手机用户是Android的主要目标,尤其是市场上基于ARM11处理器的智能手机已经降到1000元人民币的价格,让低成本的硬件配置也可以运行Android系统,更使得Android从中高端扩展到低端成为可能。除智能手机外,Android已经渗透到了平板电脑、上网本,乃至汽车电子、机顶盒、电子相册、无绳电话等各移动平台和嵌入式产品领域。 对于Android的智能手机和平板电脑用户,Android Market中种类丰富和数量众多的应用程序是其选择Android的重要原因,没有众多可选择的第三方应用程序,操作系统就是再性能优异,也不会对用户有任何杀伤力。这一点类似于苹果的iOS,但总体来说,Android 的用户不会像苹果用户那样忠诚、他们中的很大一部分也不会像苹果用户那样为数码产品花费那么多金钱,可以说Android更大众一些。 二. 支持硬件架构 1.支持的硬件架构 目前Android已经移植到了ARM、X86、M IP S各体系架构中的很多处理器核、处理器芯片、以及更多的板级结构上,对PPC等体系架构的移植也早已开始。如高通、三星等芯片制造商推出的基于ARM C ortex-A8处理器核及P o w er V R显示核心的处理器芯片早已移植Android成功,并被联想的Le Ph one、魅族的M9等许多手机采用,多核的C ortex-A9也蓄势待发。随着

基于android平台的移动查询系统设计与实现

xx大学 毕业设计(论文)开题报告 题目:基于android平台的移动查询系统设计与实现学院:软件学院 专业:软件工程 班级: 学号: 姓名: 指导教师: 填表日期:2012 年3月5日

一、选题的依据及意义: 2012年是移动互联网高速发展的一年。市场分析机构Informa数据显示,2012年全球销售的Android智能手机约达4.61亿台,其中三分之一的Android智能手机在中国销售,Android智能机的普及大大推动了Android市场的发展。而移动查询系统是一款非常实用的APP,该应用程序拥有手机号码归属地查询、城市天气查询、IP地址信息查询等模块。 智能手机的移动查询系统,越来越多的融入到人们的生活当中,现代的人们的生活越来越的信息化和规范化。人们对于自己的行为都开始有比较规范的计划。出门查看天气,旅游查看火车路线、时间信息,休闲时查看陌生手机号码归属地、上网IP地址信息等。所有的方便都无时无刻的存在大家身边。所以现代的人们都会青睐这些方便小软件的存在。这些小软件存在我们大家的手机中,首先它可以随时随地的查询,而且非常的方便携带,对于大家在应急方面有着不可替代的作用。 一款专业的移动查询软件是手机中必不可少的要素,几乎市场上所有的手机用户都会下载一个移动查询软件,通过软件可以对页面中一些必要的元素进行人性化的设置,同时在操作的时候也能得到一定的便利,但是不能满足用户的所有要求,所以网上就出现了各种各样的手机移动查询软件,来满足不同用户的不同要求。不同手机平台的手机,所支持的移动查询软件也是各不相同,而现在最流行的手机平台就是google的android手机平台,所以本课题就致力于开发出一款基于android手机平台的移动查询系统,来满足用户的使用需求。 二、国内外研究现状及发展趋势(含文献综述): 2012年第三季度,Google 的Android 系统拿下全球75% 的市场份额,而2009年同期Android市场份额只有3.5%。移动互联网的蓬勃发展促使手机终端产业链变化,应用和服务逐渐成为竞争的焦点。无论是电信运营商,终端厂商还是应用开发商,目前都在向操作系统领域进军,试图对内容的聚拢和对应用体系的把控,稳固或加强自己在产业链中的影响力。在这一过程中Android系统因多方面因素逐渐受到各方的青睐。,Android手机在中国市场的销量在未来还将有较大发展空间。 随着智能手机的快速普及,智能手机操作系统市场风生水起。为了让智能手机用户能够随时随地查询互联网所提供的服务,一种高效的办法就是将应用系统的功能拓展到手机终端上,让手机能够通过移动网以及互联网访问Web网站并处理各种各样的业务。因此,智能手机的应用软件及其需要的服务将有广阔的发展前景。不论身在何地,查询当时当地的天气,出差旅行查询火车车次信息等都是比不可少的工具。随着社会的发展,人们更不肯离开便捷的查询工具,甚至会对其产生依赖。 三、本课题研究内容 主要内容 根据需求分析与系统功能设计目标,结合实际情况本系统功能模块设计分为如 下几个模块: 1.应用主页:在这里我们可以选择要进行的信息查询。 2.手机号码归属地查询:在手机号码归属地查询窗口,输入待查询手机号,系统弹出提示框显示手机号码归属地、手机卡类型。

MIUI移植基本教程

首先介绍制作rom的环境使用的工具: 1.制作环境 必须要有一个Linux操作系统,我用的是ubuntu 10.4,JDK6,当然如果你能建立一个完整的编译Android系统的环境更好,如何建立这样的系统,网上有很多文章,这里就不多讲了。可以在物理硬盘分区上安装Linux,也可以向我一样在VirualBox虚拟机上安装。 2.厨房 虽然它只是个在终端下由脚本驱动的程序集,但对我们提高制作rom的效率作用是巨大的完全掌握这个厨房的使用方法,需要写一篇单独的教程,本贴只针对移植所需的相关方法作出说明。 1)解包和打包 解包:把要打磨的rom包放到original_update目录中,rom包的类型一般是zip压缩包,也可以是img镜像文件;运行厨房(menu脚本),输入1(Set up working folder from ROM),根据提示选择你要解包的那个文件号,厨房解包并创建工作目录(WORKING_xxx),如果已存在一个WORKING_xxx的工作目录,厨房会自动把它移到到OLD_WORKING目录中。打包:输入99(Build ROM from working folder),厨房自动打包工作目录然后签名并把rom 文件放到OUTPUT_ZIP目录中。 2)deodex 官方发布的rom一般都会把apk中的dex文件抽出并优化修改为同名的odex文件,为了修改它们,需要将这些odex文件打回到各自的apk文件中,在厨房中输入0(ADV ANCED OPTIONS)->11(Deodex files in your ROM),厨房自动搜索工作目录下所有odex文件,根据提示输入即可。 3)文件签名 在(ADV ANCED OPTIONS)屏输入21(Sign APK file(s)),厨房搜索工作目录下所有apk 文件,根据提示输入,这里要注意,无论你选择哪一项,厨房都不会自动签名framework目录下的apk文件,需要你输入s(自定义签名文件)。 4)处理boot.img 此厨房一个非常强大的功能,你可以更换核心,修改init进程配置文件。 在(ADV ANCED OPTIONS)屏输入20(Unpack or re-pack a boot.img)->输入w(Extract kernel and ramdisk from boot.img in working folder)厨房将boot.img解包到目录BOOT-EXTRACTED,其中文件boot.img-kernel为android的Linux核心,你可以用其他的核心文件替换它,可以编辑这些文件,但不能改名。完成后输入b(Build boot.img from BOOT-EXTRACTED folder (for working folder)),重新打包创建新的boot.img文件并自动替换掉工作目录下的旧文件。 提示:如果更换了核心,还需要更换system/lib/modules/*为相应的文件! 3.编译和反编译classes.dex 要用到两个工具,smali和baksmali,来自开源项目访客无法浏览链接,请先注册或者登陆。,创建者是Jesus Freke(勘误),这两个工具可以在厨房/tools/deodex_files目录下找到。

将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现

-9- 新桌面映像、管理用户数据,并监控其创建的虚拟桌面。客户端使用VMware View Client程序,通过PCoIP显示协议回传运行结果。该协议是一种高性能自适应显示协议,可应用在3D 图形设计、Flash领域,即使在低带宽下,也能保持稳定的显示。由于它的优异性能,被许多远程显示方案所采用,包括其他桌面虚拟化产品供应商。 我公司可以先采取试点方式应用桌面虚拟化技术,可以选择教育培训中心试点,学校的应用场景非常适合这一技术。根据试点效果,再逐步推广。 目前,桌面虚拟化技术大规模应用是所谓的“桌面云”,在华为上海研究所有1万名员工在使用华为自身研制的这种运用云计算平台的虚拟桌面。上海联通和浙江移动也在批量使用这种桌面云。 当前虚拟化应用中的另一个热点,是数据中心虚拟化,这是全新的数据中心部署和管理方式,有以下优势。 1.能够实现一定程度的自动化运行,降低人工干预频率,同时提供简单强大的管理界面,使管理员摆脱繁重的与物理服务器、操作系统、中间件等的配置和管理工作,专注于应 用管理。 2.实现动态调度资源。对于管理员而言,虚拟化的数据中心不再是一台台隔离的服务器,而是一个统一的资源池,而且具备伸缩性。管理程序能够根据应用的负载情况自动调整分配资源,提升资源利用率。 3.加速应用的部署,提高业务响应速度。 4.通过虚拟化整合,可以将应用集中,提高服务器的利用率,减少服务器,从而降低制冷、通风等耗电量,达到绿色减排目的。 这些优势非常有现实意义。2009年中化集团升级ERP系统,当时他们的ERP系统是SAP R/3 4.7版,计划升级到6.0版。由于中化的业务中,当时已有93%通过ERP来执行。如何不中断业务,实现平稳升级成为中化集团面对的难题。经过研究,他们最终采用IBM的私有云方案。他们对3个数据中心实施虚拟化改造,将所有资源池化,由IBM的数据中心管理软件统一管理,将动态的、分散的资源集中调度和灵活分配,跨越2个数据中心的云环境得以实现。私有云使得中化集团在ERP系统不停机,没有增加新服务器的限制下,实现平稳升级。中化实现私有云,还能实现未来包括ERP在内的各种IT应用的灵活运行。中化私有云对我们 公司的IT运维有很好的示范作用。 应用虚拟化技术,实现PC桌面、交换、数据中心的虚拟化乃至建设私有云能够让企业拥有统一的、可管理的、具备弹性伸缩的IT基础架构。这对企业IT应用有重要意义,这能大幅提升运维效率,提高资源利用率,降低系统运营成本,还能灵活应对新业务需求。在必要的时候可以对接公有云,直接租用公有云计算供应商的资源,弥补不足。未来,随着虚拟化和云计算技术的进一步发展和应用,采用虚拟化技术的面向云计算的企业IT基础设施在运维时会有更大优势。我们作为企业的IT部门应当及早研究和应用虚拟化和云计算技术,助力公司信息化建设。 参考文献 [1]《虚拟化与云计算》小组.虚拟化与云计算[M].电子工业出版社,2009. [2]樊勇兵,丁圣勇,陈天,等.解惑云计算[M].人民邮电出版社. [3]张为民,唐剑峰,罗治国,等.云计算深刻改变未来[M].科学出版社. [4]雷万云.云计算——企业信息化建设策略与实践[M].清华大学出版社. 将Android平台的RIL层 移植到基于LINUX的通用平台的研究与实现 重庆邮电大学 赵国强 彭大芹 【摘要】本文通过对Android RIL层代码分析,将android RIL层功能在纯LINUX平台上实现,完全脱离了Android系统。为基于LINUX的通用平台实现一套成熟的RIL层代码,并开发出相应的框架层,以便基于LINUX的平台能快速成熟的向3G网络发起相关业务。在OpenWrt系统上验证了移植后的RIL层代码正常工作。【关键词】Android RIL;LINUX;移植;Parcel;验证 1.课题研究的背景和意义1.1 Android RIL简介 Android RIL(Radio Interface Layer)提供了无线基带Modem与电话应用之间的抽象层。在Android RIL层中,完善的考虑了电话应用的各种情况,如:双SIM卡;电话,短信,彩信,PS DATA业务,PIN/PUK码等各种3G网络业务。 RIL层在Android系统中,处于硬件抽象层,运行在一个独立的守护进程中,主要为框架层和基带接口提供适配,具有良好的独立性。其中的通信机制,与框架层接口主要使用Socket通信,内部线程主要使用管道,与基带接口默认使用AT命令。且其代码均由C和C++来完成,依赖第三方库较少,所以,Android RIL 层具有良好的移植性。 1.2 移植Android RIL的意义 目前很多基于LINUX平台的系统,如:PC(LINUX操作系统),QT,路由器平台(如OpenWrt系统)等等,都对连接3G网络有需求,但在这些平台原生的功能中,没有独立的RIL接口层,所以开发一套基于LINUX的独立应用,用来支持与基带发起各种3G网络相关业务是很有意义的。Android RIL具有良好的稳定性,独立性,以及对3G网络业务的完整性,所以将其移植成一个独立的,供LINUX通用平台使用的RIL层,可方便所有的基于LINUX的平台完成各种电话应用的开发。 2.Android系统中RIL层分析 2.1 RIL层在Android系统中的位置 RIL在Android系统中,处于硬件抽象层位置。主要通过SOCKET通信连接框架层,将框架层下发的消息解析后,向基带下发相应的AT指令,并将从基带返回的AT指令的响应,封装成消息,返回给框架层。位置如图1所示。 2.2 Android RIL工作原理2.2.1 Android RIL代码说明 RIL主要由RILD(radio interface layer daemon)守护进程和两个动态库:librefrence_ril.so和libril.so组成。Android工程源代码目录中,RIL代码包含于hardware/ril目录中,主要文件说明如表1所示。 2.2.2 Android RIL工作原理 rild以一个main函数作为整个RIL层的入口点,负责完成初始化。libril.so库包含了主要的消息循环流程,主要负责与框架层进行交互,在接收框架层命令后,调用相应函数处理,然后将命令响应结果传回客户进程。librefrence_ril.so主要提供各个具体业务的AT指令的封装和解析接口,供libril调用,向下通过AT_COM和基带进行交互。具体工作线程如图2所示。 3.移植Android RIL层功能 通过对A n d r o i d R I L 层代码分析,在RIL层主要使用了基于linux的POSIX Thread (pthread)多线程编程和socket IPC通信,这些在移植过程中是无须考虑的。需要移植的是RIL层依赖于Android系统的功能。 3.1 移植Android系统属性 表1 RIL主要文件说明(./表示处于hardware/ril目录下) 文件路径 文件名文件说明./include/telephony ril.h 框架层和RIL层接口和数据结构定义./libril ril_commands.h 请求命令描述列表ril_unsol_commands.h 主动上报时间描述列表 ril.cpp 主要负责与框架层交互ril_event.h 数据结构和函数声明ril_event.cpp 处理event loop事件./reference-ril atchannel.h 数据结构和函数声明atchannel.c 主要负责与modem通信reference-ril.c 主要负责应用与基带间的数据通信 at_tok.h AT指令解析处理函数声明at_tok.c AT指令解析处理函数misc.h AT指令解析处理函数声明misc.c AT指令解析处理函数./rild rild.c rild守护进程

相关主题
相关文档
最新文档