首页 > 代码库 > 在linux环境下利用mmm命令编译android项目错误记录
在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丢失的问题,需要再深入研究研究啊。
在linux环境下利用mmm命令编译android项目错误记录