在linux环境下利用mmm命令编译android项目错误记录

此篇文章建立在之前的三篇文章的基础之上(本次内容主要参考老罗的《android源码情景分析一书》):

源码编译

内核编译

adb连接模拟器

------------------------------------------------------------------------------------

之后,在android源码环境中编写了一个简单的android程序HelloAndroid。

文件结构如下:

~/android/packages/experimental/HelloAndroid

AndroidManifest.xml

Android.mk

src

com/hello

HelloAndroid.java

res

layout

main.xml

values

string.xml

drawable

icon.png

很简单的最基本的结构,里面的内容没什么好说,可能需要说明的就是Android.mk里面的内容了。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

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

LOCAL_PACKAGE_NAME := HelloAndroid

include $(BUILD_PACKAGE)

关于Android.mk是干什么的,以及这个脚本的语法含义,大家可以参考这一篇博客:http://blog.csdn.net/wh_19910525/article/details/7519919

当我们的程序写好了之后,就要开始编译了,开始的时候,mmm命令是不可用的,我们需要在当前终端中执行Android源代码目录下的build/envsetup.sh脚本文件才可以使用.

$ source ./build/envsetup.sh

执行了之后,我们就可以使用mmm命令了。

$ mmm ./packages/experimental/HelloAndroid/

这个时候,我们的位置应该在android源码的根目录。


下面就记录一些在这个过程中遇到的错误:

1.build/core/java.mk:9: *** (call my-dir): Target java module does not define any source or resource files.Stop.

这个问题可以看到应该是Android.mk提供的位置不对,导致编译的时候,没有找到这个文件,仔细检查了一下Android.mk的脚本,发现在LOCAL_PATH := $这里多了一个空格(call my-dir)的原因,去除掉重新编译就可以了。


2.package/experimental/HelloAndroid/res/values/string.xml:1:error:Error parsing XML: no element found

package/experimental/HelloAndroid/res/layout/main.xml:8:error:Errorthis attribute must be localized.(at ‘text‘ with value ‘helloAndroid‘).

这个两个其实是同一个问题,原因很简单,就是在mian.xml的一个TextView里面设置了text属性,我没有本地话,也就是说,没有利用string中的资源,而是直接书写的字符串,大家用过Eclipse的都知道,这个在ide里面会给出一个警告,在这个就编译不成功过了。


然后在根据编译过程中的错误提示,修复一些简单问题,大概就是那个字符写错了之类,(表示,一直用ide来进行开发,突然完全手动去构建一个android工程,表示各种不会写啊,看这样子,用ide把人都给用傻了!~汗)。


之后出现这样的提示就说明成功了:Install:out/target/product/generic/system/app/HelloAndroid.apk


接下来就是在模拟器中看看效果了先重新生成system.img位于out/target/product/generic中。

$ make snod

这个命令可以只重新打包Android系统镜像文件的system.img,但出现西面的只是就成功了。

Target system fs image: out/target/product/generic/system.img


前面我们在编译源码的成功了之后,在启动模拟器的时候,设置了一些环境变量:

export PATH=$PATH:/usr/local/Android/Android2.3.7/out/host/linux-x86/bin

export ANDROID_PRODUCT_OUT=/usr/local/Android/Android_2.3.7/out/target/product/generic

emulator -kernel ./kernel/private_guo/kernel/arch/arm/boot/zImage

这个里面ANDROID_PRODUCT_OUT是一个环境变量,启动模拟器需要四个文件,分别是zImage、system.img、userdata.img、ramdisk.img启动,前一个是内核镜像,我们则编译内核的时候可以看到,结果就是一个zImage,后面三个是Android系统镜像文件。


ok,再次启动模拟器吧。

傻眼了,报出一个错误:

emulator: ERROR: could not find required ramdisk image (ramdisk.img).
emulator: Did you build everything ?

这个错误很简单易懂,就是我的ramdisk.img没有了,当然模拟器就不能启动了,于是乎,我跑过去看了一下,我的ramdisk.img果然是不在了,只有system.img和userdata.img了,这个我真的是不知道为什么啊。没有办法,我只好重新make了一下,好在第二次会很快,一会就编译好了。大家如果有谁知道这个问题的可以告诉我!


果然,等了一会之后,重新编译出来之后,我的ramdisk.img又回来了,此问题先揭过,跑个模拟器起来看看。

可以看到程序已经在里面了:

技术分享

点击进去看看效果:

技术分享

恩,虽然过程有那么点坎坷,但是好歹结果是出来了,至于ramdisk.img丢失的问题,需要再深入研究研究啊。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。