在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丢失的问题,需要再深入研究研究啊。

时间: 2024-09-30 11:22:39

在linux环境下利用mmm命令编译android项目错误记录的相关文章

Linux系统下利用wget命令把整站下载做镜像网站

Linux系统下利用wget命令把整站下载做镜像网站 2011-05-28 18:13:01 | 1次阅读 | 评论:0 条 | itokit  在linux下完整的用wget命令整站采集网站做镜像 的命令是及无视网站根目录下的robots.txt限制.并且可以模拟一个正常浏览者的信息下载该网站. C/C++ Code复制内容到剪贴板 wget -m -e robots=off -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.

android源码环境下用mmm/mm编译模块,输出编译log到文件的方法

1,在android目录下直接用mmm命令编译, log信息保存在android目录下 mmm packages/apps/模块名 -j4 2>&1 | tee build_qchat.log 2,在模块路径下用mm命令编译,log信息保存在模块路径下 mm -j8 2>&1 | tee build_qchat.log

linux环境下tesseract4.1的编译安装

由于公司新的产品需要深度集成tesseract,所以需要在linux下和windows下源码编译安装tesseract,tesseract当前最新稳定版本是4.1.0,所以就从这个版本入手,编译的过程中碰到了不少困难,踩到了不少坑,所以特意分享出来,避免各位朋友再走弯路~~. 1.查看centos版本#cat /etc/redhat-releaseCentOS release 6.5 (Final) 2.查看gcc和g++版本#gcc --version#g++ --versiongcc至少应需

Linux 环境下 gcc 链接库 编译、链接(概览) 以及 自动化工具Makefile的编写

个人博客首页(点击查看详情) -- https://blog.51cto.com/11495268 1.简介    程序编译一般需要经预处理.编译.汇编和链接,在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为 "库" 文件,本文 主要 描述 Linux 平台下 库文件的 创建 和 链接 相关操作(既然都看 这么底层的内容了,相信 也有一定的基础,所以本文 对相关命令 也不会进行详细解释)    备注:    linux平台下,静态链接库是以 .a 的后缀文件,动态链接库是以

解决Linux环境下安装dedecms(织梦)提示http500错误

Dedecms安装非常简单,鼎峰阿D今天就不多做介绍,如果您感兴趣,可以通过阅读“全环境安装dedecms内容管理图文教程”来学习.下面,将要解决一个在安装dedecms时,提示http 500错误的案例. 故障状态:正常安装dedecms v5.7 gbk提示http500错误 Dede安装环境:一个香港免备案的linux环境的php空间. 故障案例分析: http500错误,查询度娘的结果: 1.“http 500为内部服务器错误,无法解析程序脚本” 2.“http 500 错误是由于服务器

Windows下,Ant自动化编译Android项目具体步骤和方法

 备注:若Android项目引用有第三方库,步骤和方法亦适用. 前提是已经安装好Ant. 1,首先需要创建一个批处理命令(*.bat)文件:Ant for Android.bat,文件内写入以下命令: set path=C:\Windows\System32;D:\Java\JDK\bin;D:\Ant\apache-ant-1.9.3\bin;D:\Android\adt-bundle-windows-x86_64-20130522\sdk\tools; start "Ant for An

Linux环境下c程序的编译和执行

1 单个文件的编译和执行创建main.c文件,内容如下: #include <stdio.h> #include <stdlib.h> int main(void){ printf("Hello world!\n"); return 0; }; 编译: gcc -o main main.o 执行: [email protected]:/ybg/python# ./main Input an integer: 10 sum=55 2 多个文件的编译和执行创建sum

在linux环境下尝试使用gcc编译一个程序,并验证-E\-S\-c选项

首先,进入Linux平台: 2.双击Terminal,进入: 3.编入命令 vim test.c ,进入新建文件test.c中,并且自己编写一个简单的c语言程序: 4.分别输入命令: ESC   :  w   q   ! 这5个命令回到编译页面,如若想修改则可输入命令 vim test.c  进入,输入命令i或者A命令 5.输入命令gcc -S test.c  预处理 6.输入命令 gcc -c test.c     预编译处理完成 7.输入命令    ./test 8.程序运行截图:

Linux环境下MySQL基础命令(4)----数据库的用户授权

      MySQL数据库的root用户拥有对所有库,表的全部权限,频繁的使用root用户会给数据库带来很大的风险,因此应建立一些低权限用户,只负责一部分库.表的管理维护操作,甚至可以对增.删.改.查各个操作进一步细化限制,从而将数据库的风险降至最低. 一,授予权限 GRANT语句:用来设置数据库用户的访问权限,当指定的用户不存在时,GRANT语句将会创建新的用户.使用GRANT语句授权的用户记录,会保存到mysql库的user.db.host.tables_priv等表中,无需刷新便立即生效