(以下基于ubuntu12.04操作系统)
1 android编译环境搭建1 $ sudo apt-getupdate
2 下载并安装jdk,配置环境变量
3输入sudo apt-get install命令通过ubuntu服务器在线安装需要使用的软件
$ sudo apt-get install git gnupg flex bisongperf build-essential
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
libx11-dev:i386 libreadline6-dev:i386libgl1-mesa-glx:i386
libgl1-mesa-dev g++-multilib mingw32tofrodos
python-markdown libxml2-utils xsltproczlib1g-dev:i386
$ sudo ln -s/usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
2 源码下载2.1 环境变量配置
2.1.1 下载JDK从www.java.sun.com下载JDK
2.1.2 配置环境变量
配置环境变量
$ sudogedit /etc/environment
JAVA_HOME= /usr/jdkXXX
CLASSPATH= .
PATH=$PATH: $JAVA_HOME/bin
查看环境变量
$ sudo source /etc/environment
查看java版本信息
$ java –version
2.2 代码下载
1. 创建工作目录
$ mkdir ~/bin
$PATH=~/bin:$PATH
2.下载安装repo版本管理工具
repo是在linux环境中开发android主机环境需要的工具包名称,用于进行版本控制,是Google用python脚本写的调用Git的脚本,主要用来下载、管理android项目的软件仓库。
$ curlhttps://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$chmod a+x ~/bin/repo
3. 创建repo的客户端
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
$ repo init -uhttps://android.googlesource.com/platform/manifest
$repo init -u https://android.googlesource.com/platform/manifest -bandroid-4.0.1_r1
4. 下载代码
$repo sync
5. Android的源码目录
--repo --主要是同步管理所用到的一系列文件
--bionic --Android编译过程所需要的一些库
--bootable --负责启动和备份的一些文件
--build --最主要的一些makefile和编译配置文件
--dalvik --经过Google优化了的java虚拟机
--development --开发用的一些文件夹,包括模拟器和工具等
--external --Android工程中引入的外部功能库
--frameworks --中间件部分
--hardware --和硬件有关的一些支持文件,包括wifi,电信模块等
--kernel --经过了优化和修改的linux内核
--packages --所有的上层应用包
--prebuild --Android编译工具所在目录
--system --一些系统级文件
3 源码编译
3.1 系统编译
3.1.1 编译源码
$ source build/envsetup.sh
$ lunch aosp_arm-eng
$ make -j4
第一次进行整体编译,默认情况下,会在/home/android/目录下生成一个out文件夹,所有的编译生成物都在这一目录下。
3.1.2编译framework$source build/envsetup.sh
$ make -j4 framework
3.2 目录查看
1. res资源文件
frameworks/base/core/res/res
frameworks/base/core/res/assets
2. java文件
frameworks/base/core/java/android
packages/apps
3. apk包
/out/target/product/generic/system/app
4.framework.jar
/out/target/product/generic/system/framework
5. system.img
/out/target/product/generic/system
3.3添加apk为系统应用
3.3.1 步骤1. 将项目工程文件直接copy 到 /android4.4/packages/apps/xx目录中
2. 在xx目录下编写Android.mk文件
3. 编译
$source build/envsetup.sh
$ make-j4 apk名称
3.3.2 编写Android.mk文件Android.mk文件是用来描述build system(编译系统)的,更准确的说:该文件是一个微型的GNU Makefile片段,将由build system解析一次或者多次。
1.Android.mk文件实例
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PACKAGE_NAME := 项目名
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
2.变量描述
(:=是赋值,$是引用某变量的值)
LOCAL_PATH:= $(call my-dir) 获得当前目录(必须)
include$(CLEAR_VARS) (必须)
LOCAL_SRC_FILES 加入源文件路径
LOCAL_C_INCLUDES 加入所需要包含的头文件路径
LOCAL_STATIC_LIBRARIES 加入所需要链接的静态库(*.a)的名称
LOCAL_SHARED_LIBRARIES 加入所需要链接的动态库(*.so)的名称
LOCAL_MODULE 表示模块最终的名称
LOCAL_PACKAGE_NAME:= LocalPackage apk名称 (必须)
include$(BUILD_PACKAGE) 编译APK (必须)
3.4 模拟器设置
实现自己编译的镜像文件放在模拟器下进行测试
1.创建模拟器xx.avd
2.在模拟器目录下替换文件
.android/avd/xx.avd/sdcard.img------system.img/sdcard.img(因源码版本而异)
3.5 apk编译流程
1 首先编译项目下的资源文件,生成R.java文件
2 编译aidl文件
编译aidl文件需要aidl命令,aidl参数输入输出
3 包含java静态库,也就是jar包
4 编译java源文件,生成jar包
首先将找到所有的*.java文件,将他们编译生成class文件
5 将jar包转换为dex文件
在android系统中构建了一个java虚拟机,这个虚拟机需要的是dex文件。
6 编译资源文件生成apk包
7 将dex文件添加到apk包中
8 对apk文件进行签名
9 使用zipalign优化apk内部存储
10 dex-preopt优化。
11 odex文件
12 拷贝package.apk生成目标apk
4 系统开发中引用内部API及隐藏API内部API:位于包com.android.internal的API,不对外开放,这是android的内部餐厅,开发人员可以视为黑盒子。
隐藏API:用@hide标记的类和函数,是为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。
隐藏API =正在开发中; 内部API = 黑盒
思路: 获取framework.jar中的classes.dex反编译出内部api,将api所在的代码拷贝到原sdk所在平台的android.jar下,替换原有的android.jar
1.获取classes.dex
选择目标平台X(如API Leve 9的平台,所以X == 9)
创建平台X的模拟器
启动模拟器,从中下载/system/framework/framework.jar文件
重命名framework.jar解压出classes.dex
2.替换android.jar
使用dex2jar将classes.dex转化为classes.jar
从ANDROID_SDK/platforms/android-X/复制android.jar,重命名为custom-android.zip
解压custom-android.zip到custom-android目录
从classes.jar复制所有文件到custom-android文件夹(替换已有文件)
压缩custom-android文件夹为android.jar
5 Android中定义控件思路(以TextView为例)1.attrs.xml:
attrs.xml这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性
2.styles.xml:
刚才的attrs.xml定义的是组件的属性,style则是针对这些属性所设置的值,一些默认的值
3.组件的源码
调用构造器 public TextView(Contextcontext, AttributeSet attrs, int defStyle)
TypedArraya = context.obtainStyledAttributes( attrs,com.android.internal.R.styleable.TextView, defStyle, 0);
来将属性和值获取出来,放到一个TypeArray中,然后再利用一个switch语句将里面的值取出来,再利用这些值来初始化各个属性。
6 系统开发中添加资源文件1. 资源文件目录 framework/base/core/res/res/values/xx
framework/base/core/res/res/values/public.xml
添加id(共有、私有资源文件,私有文件不必设置id)
framework/base/core/res/res/values/attr.xml
添加属性值
framework/base/core/res/res/values/styles.xml
添加样式
framework/base/core/res/res/values/themes.xml
添加主题
2. 编译framework-res.apk及framework.jar
3. make update-api
7 android给应用定制皮肤1)皮肤也就是相关的资源文件单独放置在某个工程中,一种皮肤一个工程文件。一个工程包括N多的资源文件,多个工程间资源的关系是文件名、资源ID等完全一样.不同的可能是图片资源,style等的设置不一样。
2)皮肤工程在AndroidManifest.xml中配置android:sharedUserId="主项目包名"
3)主项目通过 this.createPackageContext("皮肤项目包名",Context.CONTEXT_IGNORE_SECURITY);获取到皮肤工程对应的Context,然后通过返回的context对象就可以访问到皮肤工程中的任何资源,如同访问自身的资源一样。
注:需要先安装皮肤工程对应的apk文件