android源码编译
android源码编译
发布时间:2018-02-01 来源:查字典编辑
摘要:(以下基于ubuntu12.04操作系统)1android编译环境搭建1$sudoapt-getupdate2下载并安装jdk,配置环境变量...

(以下基于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文件

 


 

 

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新安卓软件开发学习
热门安卓软件开发学习
编程开发子分类