以下操作都是在ubuntu14.04 64位linux环境下进行
一.下载并编译系统源码
具体步骤略,在源码的根目录成功执行make命令
二.下载安装Eclipse
具体步骤略
三.配置eclipse
修改eclipse配置,避免因eclipse出现内存不足,配置文件是位于eclipse安装目录下的eclipse.ini
将默认参数
-Xms40m
-Xmx256m
-XX:MaxPermSize=256m
改为:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
四.创建源码工程
1. 进入源码根目录下的development/ide/eclipse,把android-formatting.xml,android.importorder,.classpath拷贝到源码根目录
2. 在源码根目录执行chmod u+w .classpath
修改.classpath文件以避免后续编译源码工程时的出错
首先删除下面两项:
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar"/>
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar"/>
然后添加下面三项:
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar"/>
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/android-support-v13_intermediates/javalib.jar"/>
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/filterfw_intermediates/classes-jarjar.jar"/>
解释:
删除两项和添加的前两项是解决下面的编译错误:
Project 'Generic-Android' is missing required library: 'out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar'
Project 'Generic-Android' is missing required library: 'out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar'
添加的第三项是解决前面两个错误修正基础上有出现的下面这些错误:
1) the source file "packages/apps/Camera/src/EffectsRecorder.java" cannot resolved the file "android.filterfw.xxx" . source file
2) the source file "packages/apps/Camera/src/com/android/camera/VideoCamera.java" cannot resolved the file "android.filterpacks" source file
3) the whole packages packages/apps/Gallery2/src" cannot resolved the "android.media.effect" source file.
如果还有问题:我这里是R文件找不到,需要编译单独模块 R cannot be resolved to a variable
执行命令: source . build/envsetup.sh
然后 mmm ./package/apps/Bluetooth/ 刷新/debug/out/target/common/R 即可
3. 打开eclipse,在菜单 window-->preferences-->java-->Code Style-->Formatter 导入android- formatting.xml文件,organize imports导入android.importorder文件,使得代码风格和import包顺序与源码一致
4. 新建一个Java工程,工程名任意,选择从已存在的源码上创建,选择Android源码根目录,点击完成。
之后eclipse要build工程,需要等待一段时间,经过上面修改.classpath文件这里build应该没有错误,如果有错误只能再找其他原因了,退出eclipse
五.源码调试
1.使用终端窗口进入源码根目录然后执行下面命令启动模拟器:
. build/envsetup.sh
lunch 1
make
emulator
2.启动ddms,如果eclipse已经安装adt插件也可以不使用终端窗口启动ddms而直接用eclipse中的ddms视图
ddms
此处使用终端窗口打开ddms时有可能报下面错误:
16:23 E/ddms: shutting down due to uncaught exception
16:23 E/ddms: java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
解决办法是设置64位swt.jar目录,可以从网上下载,或者sdk中的tools/lib/x86_64目录,或者编译后源代码的prebuilt/linux-x86_64/swt目录
例:export ANDROID_SWT=/media/work/ANDROID/4.0.3_r1/prebuilt/linux-x86_64/swt
3.打开eclipse,选择源码工程,右键打开菜单选择 Debug AS—Debug configuration 弹出窗口,选择Remote JAVA Application,右键在菜单选择NEW,将窗口中的Port修改为8700,点击“Apply”,再点击“Debug”执行debug。注意,上面设置的端口要与DDMS中设置的端口一致,如果出现连不到VM的错误时,请注意,要先在DDMS中选中某一进程(对应某一应用程序),才能在eclipse执行 Debug。
4.之后就可以在eclipse的Debug视图下进行设置断点、调试了。
总的来说:
1、用eclipse来编辑代码、检查错误
2、不在eclipse上编译、运行Android源码程序,只能在命令行通过make(或mm或mmm)编译android源码
3、可以在eclipse上调试Android源码程序(原理:eclipse通过ddms服务器在emulator上进行调试),并可以单步调试、断点调试。
4、需要调试的程序把它从/system/app/移除,安装到data/app下,这样更方便
5、安装、卸载程序通过adb push 和adb shell rm更方便
技巧1-编译Android源码
执行:
cd Android源码目录
. build/envsetup.sh
那 么就会多出mm/mmm等命令,mm/mmm用来编译模块(包括C、C++、JAVA程序)。我们也可以直接在 Android源码根目录下执行“make 模块名”来编译模块(模块名可以在.mk文件中找到)。模块编译后会在out/target/product/generic/system/app下生 成对应的.apk包。但是,用mm/mmm来编译生成的.apk并不会打包到system.img中,需要我们手动通过make snod把 system文件夹打包为system.img,不过这就得重新运行模拟器了,这也是很麻烦了。对于我们开发者来说,我们可以这样做:
1)把需要修改、调试的模块(比如AlarmClock.apk)从/system/app下移除,然后make snod,这样system.img就没有AlarmClock.apk了。
2)运行模拟器,就看不到AlarmClock了
3)修改AlarmClock源码并用mm/mmm来编译,在/system/app下生成AlarmClock.apk
4)通过adb把AlarmClock.apk安装到Android文件系统中,安装方法有两个:
A、通过adb install xxx/AlarmClock.apk
B、通过adb push xxx/AlarmClock.apk /data/app
两 种方法都可以把 AlarmClock安装到/data/app下,Android会自动把它显示在主菜单中(只要AlarmClock.apk中有一Activity包 含android.intent.category.LAUNCHER属性),不过A方法在/data/app生成 com.android.alarmclock.apk,B方法则是 AlarmClock.apk。用A方法时,如果原来已经安装了 AlarmClock,你还得先adb uninstall 它,而B方法则不用。推荐使用B方法。同样,卸载可以通过adb uninstall或adb shell rm xxx/xxx.apk来,也推荐用删除的方法来卸载
技巧2-如何开发自己的工程
前面主要是讲如何在eclipse上开发Android原有的工程。对于自己的工程,我们可以这样做:
1)新建一个Android工程。
建Android工程的好处就是可以充分使用ADT的功能。
2)导入需要的包
3)编译、运行、调试
4)加入到Android源码相应的目录下,应用程序一般放在packages/apps下
我们观察packages/apps原有的工程就会发现,它们的代码是很“干净”的,没有ADT自动生成的assets、bin等文件夹和R.java,当然也没有.classpath和.project
5)编写Makefile文件xxx.mk
用Android源码提供的专用Makefile文件xxx.mk,它的格式比较简单
6)把刚加入的工程添加到eclipse的Android工程中
可以在eclipse中添加,也可以在.classpath中直接加入相应路径。如在.classpath中添加:
<classpathentry kind="src" path="packages/apps/HelloWorld/src"/>
R.java 中编译时自动生成的,其实所有工程用到“资源”的,都会用到R.java,这些R.java是放在out/target/common/R下。我们在源码 根目录下make全部代码时,才会对每个模块生成R.java;在make时,已经编译过并生成有.apk文件的模块是不会被编译的。因此,如果新加入的 工程已经(用mm/mmm)编译过的话,我们先对该工程的“资源”改动一下(必须是改动“资源”,因为R.java是由“资源”生成的),再make,就 在会out/target/common/R对应的包路径下看到你的工程的R.java。刷新在eclipse的out/target/common/R 子工程,再在你用到R类的地方加入它的包,如
import com.Android.example.test.inside.helloworld.R;这样就不会出现找不到R定义的错误。
其实,这个错误对我们是没有任何影响的,因为我们是在shell中编译。
7)在Android源码目录下编译刚加入的工程
可以用mm/mmm或make 模块名
8)用版本控件工具(svn或git或其它)把该工程上传到服务器
编译错误解决:
make: *** [out/target/common/docs/online-sdk-timestamp] Error 45
这个错误是在下面这条语句执行将电脑两核CPU,2G内存,1G swap空间全部占据后,憋伤10mins之久跳出来的!!!
Docs droiddoc: out/target/common/docs/hidden
这个错误是在编译android sdk遇到的错误,困扰了我一天。
后来我是看到groups.google上的一个帖子,说是因为空间不足的问题,可是我以前编译sdk怎么就没有报错呢?不管怎样,现在还是试试,于是增加了6G的swap空间,20分钟左右,熬过了上面那条语句,结果成功了!
真是空间不足的问题啊!!!
给出链接:(发现原因 (Tony Wallace))
https://groups.google.com/group/android-building/tree/browse_frm/month/2011-03/79db5da8fd201c9a?rnum=81&_done=%2Fgroup%2Fandroid-building%2Fbrowse_frm%2Fmonth%2F2011-03%3F
(增加swap空间)
http://hi.baidu.com/haluomao18/item/9e41f1abd8f113e614329b2f
参考网页:
http://www.apkbus.com/android-42548-1-1.html
http://www.linuxidc.com/linux/2010-10/29416.htm
http://source.android.com/source/using-eclipse.html
https://groups.google.com/forum/#!topic/android-contrib/wEpciQkEUlA/discussion%5B1-25%5D