ubuntu下编译android源码、linux内核、android的源码结构以及编译结果等全面解析

来源:互联网 发布:qq飞车霹雳火数据 编辑:程序博客网 时间:2024/05/17 03:18

在公司给小组成员培训,自己做的一个总结,现分享给大家

一培训目标

android内核就是Linuxandroidc/c++代码的编译必须在Linux环境中进行,所以android应用开发若要使用c/c++代码就必须有Linux环境。通过此次培训,你应该可以完全能够独立的搭建Linux下的android源码开发环境,能够编译android源码,Linux源码,了解android源码结构以及编译结果。

Linux开发环境搭建

Linux开发环境的开发环境有以下几种选择:1windows下安装CygwinCygwin是一个window下模拟Linux环境的软件;2windows装虚拟机,虚拟机上装Linux操作系统; 3、直接装Linux操作系统。为了开发操作方便,选择第二种环境,根据Google官网推荐,Linux系统使用稳定且业界使用广泛的64ubuntu10.04.4,虚拟机版本选择较新的Vmware8.0.0

VMware虚拟机的安装简单,按照一般windows应用程序安装即可,安装时可能需要输入序列号,序列号为MV4YN-0L38Q-2ZK60-XUA7K-AAZ18。下面我们将详细介绍安装虚拟机上 ubuntu以及在ubuntu下安装配置JDK等。

安装ubuntu步骤:

1 选择File->New Virtual Machine->Typical,选择ubuntu系统文件,如下图

2 点击下一步,配置用户名,密码,配置安装目录

注意:选择一个剩余空间最大的空闲磁盘(90G)以上

 

3 配置ubuntu磁盘容量

注意要90G以上

4 点击下一步,点击Custom Hardware,配置虚拟机内存,处理器

5 点击finish后开始进行ubuntu的安装,安装过程中可能需要进行update,由于没有联网,点”Cancel Updating”

安装过程中其他所有需要联网的都”skip”

修改Swap交换空间:

命令如下

mkdir swap  

cd swap  

sudo dd if=/dev/zero of=swapfile bs=1024 count=19922944

sudo swapon swapfile 

安装编译所需的包

1 打开终端

安装jdk

1 运行bin文件

将解压出的jdk移动到/usr/java

mv  jdk1.6.0_32  /usr/java

 

2 配置环境变量

命令:gedit  /etc/profile,打开profile文件后修改,在末尾添加

export JAVA_HOME=/usr/java/jdk1.6.0_32

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

umask 022之前)

 

 

 

重启后在终端输入java,若没有提示没有安装相应包则配置成功

2 通过dpkg –l your deb包命令安装deb

 

 

三编译Android源码及内核

      1 编译Android源码

test@ubuntu:~/android4.0.1$  source  build/envsetup.sh

test@ubuntu:~/android4.0.1$lunch full-eng

test@ubuntu:~/android4.0.1$ make  -j4

 

2 编译Linux内核

 

编译goldFish内核交叉编译环境为android4.0.1下的prebuilt

cd  android4.0.1

1 配置环境变量:将PATH指向android源码prebuilt目录的toolchain

export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

cd $(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

2 告诉编译器编译的是哪种内核  x86 or Arm

$ export ARCH=arm

$ export SUBARCH=arm

$ export CROSS_COMPILE=$(pwd)/arm-eabi-

$make  goldfish_defconfig

$make

 

Android源码结构

       Android代码的工程分为3个部分.

l  核心工程:建立Android系统的基础,在根目录的各个文件夹中。

l  扩展工程:使用其他开源项目扩展的功能,在external文件夹中。

l  包(Package):提供Android的应用程序和服务,在package文件夹中。

1 核心工程的目录如下

 

 


  bootloader中包含的是内核加载器的内容,在内核运行之前运行。其中kernel中包含的是内核中的内容,bionicbuild是编译系统.prebuilt是预编译的内核.其他目录中也包括了一些相关的工具。其他的工程大都是Android系统第2个层次的源代码。

2 Android的扩展工程

Android的扩展程包含在external文件夹中,这是一些经过修改后适应Android系统

的开源工程,这些工程中的内容有些在主机上运行,有些在目标机上运行。如skia是一个经过修改后适应Android工程的图形库

3 Android中的Java程序包

Android中的java程序包是Android系统第4个层次的内容,这些程序主要包括

用程序(Application)和内容提供器(Content Providers)两个部分,还有另外的一个目录

inputmethods为输入法部分, wallpapers目录为墙纸部分, experimental是测试用的,不会自动被编译。

五编译结果结构

       Android编译的结果包含以下的内容:

.主机工具;

.目标机程序;

.目标机映像文件:

Android系统编译完成的结果全部在其根目录的out目录中,原始的各个工程不会改动。out目录的结构如下图所示:

其中。Out/target/product目录是目标产品的目录,在默认的情况下使用genenic作为目标产品的名称,目录结构如下图所示:

  其中rootdatasystem三个目录分别是目标根文件系统、主文件系统和数据文件系统的目录,后缀名为.img的文件分别是它们所对应的映像文件。

Ubuntu Eclipse下调试android源码

环境:虚拟机上安装的64ubuntu10.0464位的linux版本eclipse3.7  64位的jdk1.6

成功编译完android源码后需要进行以下步骤,假设源代码所在目录为/home/tianyong/android4.0.1

步骤:1  #cd /home/tianyong/android4.0.1

      2  #cp development/ide/eclipse/.classpath .

3  #chmod u+w .classpath

一般来说需要修改classpath目录

    #gedit  .classpath

    删除下面两行

<classpathentrykind="lib" path="out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar"/>
<classpathentrykind="lib"path="out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar"/>

        添加

<classpathentrykind="lib"path="out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar"/>

5修改eclipse默认内存。在eclipse根目录下打开eclipse.ini文件,修改为

-Xms128m

-Xmx512m

These settings set Eclipse's minimum Java heap size to 128MB, set the maximum Java heap size to 512MB

 

6打开eclipse新建java project,选择create file from existing source导入android4.0.1源代码

导入过程会进行错误检查,可能还会发现一些错误,一般都是.classpath中多了一些项,根据错误提示,将其删掉即可(在本例中发现多了 .dex包,删掉后无错)

7 Eclipse formatting(可选)

You can import files in development/ide/eclipse to make Eclipse follow the Android style rules.

Select Window > Preferences > Java > Code Style.

Use Formatter > Import to import android-formatting.xml.

Organize Imports > Import to import android.importorder.

8 Debugging the emulator with Eclipse

You can also use eclipse to debug the emulator and step through code. First, start the emulator running:

#cd /home/tianyong/android4.0

#source build/envsetup.sh

#lunch 1   

#make      

#emulator

9打开另外一个shell终端。启动ddms

#cd /home/tianyong/android4.0

#source build/envsetup.sh

#lunch 1 

#ddms

10 ddms的左上角双击选择你要调试的进程,在eclipse中点击在 Run->Debug Configurations->Remote java application上双击,然后,”Host:”设为 localhost”Port:”设为8700”Connection Type”Standard(Socket Attach) 

然后“Apply”点击“Debug”eclipse连接ddms成功则会在进程左边看到绿色的小虫

就可以跟踪你想调试的进程了。设置断点时双击代码行左边,F6单步调试但跳过函数,F5要进入每一个函数,F8执行到下一个断点

11 Adding Apps to the Build Path

The default .classpath includes the source to the core system and a sample set of apps, but might not include the particular app you may want to work on. To add an app, you must add the app's source directory. To do this inside Eclipse:

1.       Project > Properties

2.       Select "Java Build Path" from the left-hand menu.

3.       Choose the "Source" tab.

4.       Click "Add Folder..."

5.       Add your app's src directory.

6.       Click OK.

导入到eclipse的工程中有些源码没有,如”music”相关的,这时需要通过以上方法手动加入

 

如果你想跟踪例外一个进程,则须在ddms reset adb双击选中要跟踪的进程,然后再在eclipse中重新debug连接一次。关闭eclipse重新打开时要重新连接也必须先双击选中一个进程

 

 

注意:eclipse3.6以后版本在新建java project时看不到“create file from existing source”选项,可以不选中”use default location”,在”Location”中加入你导入的工程目录

Android常用命令

 

1 使用adb安装apk文件到模拟器或者设备  adb相当于客户端 模拟器或设备相当于服务端

 

运行adb  install  yourapk.apk

2 模拟器测试来电显示和短信息

1  telnet localhost 5554     //连接  5554为端口号,具体看模拟器左上角

2  gsm call phonenumber  //如gsm call 1232

3  sms send phonenumber yourcontent  //如 sms send 10086 test

3 命令行运行启动模拟器

   正确配置好环境变量后

  android create avd –n AVDName  -t targeted //如android create avd –n testAVD  -t 1

  emulator @yourAVDName         //如emulator @AVD5554       AVD5554一般在 C:\Documents and Settings\Administrator\.android\avd目录下

4 两个模拟器模拟打电话 发短信

   一个从eclipse启动

   一个从命令行启动

   一个人ID是5554  一个是5556  ID就是所拨打的号码

 

5创建SD卡

  mksdcard 128M sdcard.img

6使用sdcard的模拟器

emulator –sdcard sdcard.img

7 添加文件到sdcard

adb push new.jpg /sdcard

 

 

 

八修改开机声音

假设添加的声音文件为poweron.wav(其他格式也应该可以)

首先在BootAnimation.h添加方法的声明和头文件的引用  在frameworks/base/cmds/bootanimation/目录下

#include <media/AudioSystem.h>

#include <media/mediaplayer.h>

 

添加方法 void bootMusic();

然后在BootAnimation.cpp中实现这个方法:

void BootAnimation::bootMusic()

{

    int index;

    MediaPlayer* mp = new MediaPlayer();

    if (mp->setDataSource("/system/etc/poweron.wav", NULL) == NO_ERROR) {

        mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);

        mp->prepare();

    }

    AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index);

    if (index != 0) {

        mp->seekTo(0);

        mp->start();

    }

 

}

请注意这个目录setDataSource("/system/etc/poweron.wav", NULL)

其实这个目录是随便写的,你想从哪个目录读这个文件就从哪个目录读好了,但是你要把这个文件放在对应的目录下

比如,这个目录是system/etc (这个目录是android系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adb shell了,没用的

其实system/etc这个目录对应的是我们编译后out文件夹下的xxx,然后在system/etc,所以你把poweron.wav放到这里就行了,即 放在out/target/product/generic/system/etc/目录下, 然后#mmm  frameworks/base/cmds/bootanimation/

#make snod

#emulator启动

然后和图上一样,你就会生成新的system.img,当然你之前添加的poweron.wav也会自动被编译进去了

 

然后再修改bootanimation_main.cpp这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调

 

//play boot music -yp

        BootAnimation *animation = new BootAnimation();

        animation->bootMusic();

 

修改完这写以后还需要修改Android.mk文件

因为播放声音还需要引入库

LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
    libui \
     libskia \
    libEGL \
    libGLESv1_CM \
    libgui \
    libmedia

 

请注意,libmedia是新添加的;

mmm  frameworks/base/cmds/bootanimation/

make snod

 

 

后续工作

如何调试android c/c++源码和ndk c代码;如何集成eclipse+cdt+ndk编辑,自动编译c/c++代码

 

 

原创粉丝点击