假设源码根目录为~/Android

1 环境搭建

1.1 安装openjdk-7-jdk

Android 5.1 用到的jdk不再是Oracle 的 jdk ,而是开源的 openjdk,在ubuntu安装好后,使用如下命令安装jdk:

$ sudo apt-get install openjdk-7-jdk  

在/etc/profile 文件末尾加上:

    JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/  //jdk路径    PATH=$PATH:$HOME/bin:$JAVA_HOME/bin        //jdk的bin目录    export JAVA_HOME      export PATH  

1.2 安装编译依赖的软件

执行如下代码:

$ sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa- dri:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

1.3 安装git

查看 git教程

1.4 安装repo

1.4.1 创建repo目录

    $ mkdir ~/bin     $ PATH=~/bin:$PATH

1.4.2下载repo

repo download:

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

克隆下来后将git-repo中的repo文件拷贝到bin目录

$ cp git-repo/repo ~/bin/

修改repo文件,设置REPO_URL如下:

REPO_URL = 'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'

1.5 配置Cache

使用如下命令配置cache:

$ sudo apt-get install ccache $ source ~/.bashrc

2 下载源码

2.1 创建目录

$ mkdir ~/Android

2.2 初始化repo

$ cd ~/Android$ repo init -u git://codeaurora.org/platform/manifest.git(下载最新源码)

或者下载指定版本

$ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-5.1.1_r4$ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-6.0.1_r22$ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-n-preview-1

2.3 开始下载

$ repo sync -f

3 全编译

3.1 设置cache

$ cd ~/Android$ prebuilts/misc/linux-x86/ccache/ccache -M 50G

3.2 初始化编译环境

$ source build/envsetup.sh

3.3 选择编译目标包

$ lunch

注:lunch 点击Enter后有很多种可选

3.4 编译

$ make -j4

注: 1.make后面可以更参数:如你的机器时双核,每核双线程的话,使用make -j4,这样速度更快,但编译时使用的内存也更多
2.make失败或停止后,可以使用make -k 继续编译

4 单模块编译

只要该目录下有mk文件就可以单编

注:mmm和mm命令必须在执行.build/envsetup.shsource build/envsetup.sh之后才能使用,并且只编译发生变化的文件。如果要编译模块的所有文件,需要-B选项,例如mm -B。

4.1 make

这种方法适合第一次编译,会把依赖模块一并编译。它需要在全部源代码中找到编译模块的Android.mk文件,并检查依赖模块是否有修改,因此编译时间较长。使用这种方法,我们只需要搜索源码目录下的Android.mk文件,找到模块名LOCAL_PACKAGE_NAME,然后指定给make即可。

4.1.1 编译应用层

以编译Settings为例

$ make Settings

4.1.2 编译框架层和系统运行库源码

对于框架层和系统运行库,需要查看LOCAL_MODULE变量。以frameworks包中的源码为例,在终端中运行以下命令:

$ find frameworks/base/services/ -name Android.mk

注:该命令将搜索frameworks目录下所有的Android.mk文件

$ cat frameworks/base/services/Android.mk$ make services

注:cat filename 一次显示整个文件

4.2 mmm

用于在源码根目录编译指定模块,参数为模块的相对路径。只能在第一次编译后使用。比如要编译Settings部分源码,需要在终端中执行以下命令:

$ mmm packages/apps/Settings/

4.3 mm

用于在模块根目录编译这个模块。只能在第一次编译后使用。例如要编译Settings部分源码,需要在终端中执行以下命令:

$ cd ~/Android/packages/apps/Settings/$ mm

5 制作系统应用

一般厂商定制应用应放到~/Android/ventor/厂商名/ 路径下
注:该例子使用studio文件目录结构

5.1 编写mk文件 && 该项目导入了第三方jar包

导入第三方jar包其中关键在于LOCAL_STATIC_JAVA_LIBRARIES := xxxxx和LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xxxxx:lily.jar这两句。
xxxxx为jar包的别名,可以随便取,只要与下面相对应就行。但是后面冒号后面的那个jar包名字就必须写你需要引入的jar包名字。jar包如果放在工程的根目录下,也就是与你要编译的app的src,res,Android.mk文件同级的目录。

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)#定义模块标签,build系统根据标签决定哪些模块需要安装#user:  指该模块只在user版本下才编译#eng:  指该模块只在eng版本下才编译#tests: 指该模块只在tests版本下才编译#optional:指该模块在所有版本下都编译LOCAL_MODULE_TAGS := optional# $(call all-java-files-under, ):获取指定目录下的所有java文件。LOCAL_SRC_FILES := $(call all-java-files-under, src)#使用指定目录下的manifest文件(如果不与mk文件在同一目录的话必须定义)LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml#资源文件目录,可选定义,不定义也没问题LOCAL_RESOURCE_DIRS := $(LOCAL_PATH)/src/main/res#模块名称,apk一般使用LOCAL_PACKAGE_NAME,其它使用LOCAL_MODULELOCAL_PACKAGE_NAME := overlay_SetupWizard#如果导入第三方jar包才使用这句#定义引用别名   xxxxx为jar包的别名,可以随便取,只要与下面相对应就行LOCAL_STATIC_JAVA_LIBRARIES := xxxxx#签署当前应用的证书名称#用于指定签名时使用的KEY,如果不指定,默认使用testkey,LOCAL_CERTIFICATE可设置的值如下:#  LOCAL_CERTIFICATE:= platform#  LOCAL_CERTIFICATE:= shared#  LOCAL_CERTIFICATE:= media#而在Android.mk中的这些配置,需要在APK源码的AndroidManifest.xml文件中的manifest节点添加如下内容:#  android:sharedUserId="android.uid.system"#  android:sharedUserId="android.uid.shared"#  android:sharedUserId="android.media"#这些刚好与上面的mk文件里的配置对应上。LOCAL_CERTIFICATE := platform#以声明app需要放在/system/priv-app下LOCAL_PRIVILEGED_MODULE := trueLOCAL_SDK_VERSION := currentinclude $(BUILD_PACKAGE)################################################################如果jar包放在libs目录下,且libs与Android.mk文件是同级目录,则jar包路径如下###############################################################include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xxxxx:libs/3part.jar       // 引用名:jar包名路径include $(BUILD_MULTI_PREBUILT)################################################################

5.2 单编看是否通过,如果通过会生成apk

apk路径如下:

~/Android/out/target/product/厂商名/system/priv-app/overlay_SetupWizard/overlay_SetupWizard.apk

5.3 修改device.mk增加自己的应用

注:如果想要在整编的时候把自己的应用编进去,需要此步骤
修改PRODUCT_PACKAGES,增加自己的模块

PRODUCT_PACKAGES += \    overlay_SetupWizard

6 替换原生应用

6.1 修改模块的Android.mk覆盖原生应用

在Android.mk中添加如下说明LOCAL_OVERRIDES_PACKAGES := SetupWizard (目标packageName)

6.2 修改device.mk增加自己的应用

修改PRODUCT_PACKAGES,增加自己的模块

PRODUCT_PACKAGES += \    overlay_SetupWizard

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Qt on Android(安卓)Episode 4
  6. ARouter 源码学习之Compiler
  7. Android(安卓)开发之环境的搭建
  8. Android使用SharedPreferences存储数据的实现方法
  9. Android(安卓)OTA 升级之二:脚本 ota_from_target_files

随机推荐

  1. Win7上Git安装及简单配置过程
  2. ContentProvider和Uri详解
  3. Android提供了5种方式存储数据:
  4. 动态修改Android参数信息的方法绕过改机
  5. Android(安卓)媒体库数据更新
  6. 定制Android的Home
  7. 安乐得
  8. android library projects cannot be lau
  9. 整理的使用sharedPreferences
  10. Android(安卓)利用url获取Bitmap图片