`
androidboy_bj
  • 浏览: 32495 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类

使用Eclipse开发Android源码 (转载)

 
阅读更多

说明:这篇文章是介绍如何开发Android源码,包括各平台的源码而非仅仅Google释放的源码,我采用的是MSM7267.

        前提不需要SDK,不需要ADT,通过整个工程的编译都可以生成。为了在Eclipse中调试源码如Phone、MMS、Contact……

        由于以前都没接触过Java、Eclipse、ADT... 这些,在网上看了N多的文章,就这篇详细,所以贴出来共享,同时 加入了、

        自己在配置中 的TroubShooting。如果你是刚接触Android, 那配置这些可能一时半会搞不定,要做好心理准备。

        官方配置网址:http://source.android.com/source/using-eclipse.html

带着问题出发

1、Android的文件系统结构是怎样的,我们安装的程序放在那里?
编译Android源码之后,在out/target/product/generic一些文件:
ramdisk.img、system.img、userdata.img、 system、 data、root
其中, system.img是由 system打包压缩得到的, userdata.img是由 data打包压缩得到的。

 

 

ramdisk.img是模拟器的文件系统,把ramdisk.img解压出来可知道,ramdisk.img里的文件跟root文件夹的文件基本一样。
模拟器装载ramdisk.img并解压到内存,接着分别把system.img和userdata.img挂载到 ramdisk下的system和data目录。我们编译出来的应用程序就是放在system/app下的。用户安装的程序则是放在data/app下。

2、Android SDK和android源码能为我们提供什么工具?
Android SDK提供有很多工具,如adb,ddms,emulator,aapt等,并提供kernel-qemu、ramdisk.img、 system.img、userdata.img。因此,只要有android SDK,我们就可以在模拟器上把android跑起来。
Android源码可以编译出android SDK、adb等工具、android文件系统,以及ADT插件,也就是说,我们可以从android源码编译出所有android相关的东西。

3、 把Android源码”make”之后会生成许多工具和android文件系统(system.img等),我们又可以使用“make sdk”来生成android SDK,android SDK也包括有工具和android文件系统(system.img等),而原来安装的时候我们也安装了android SDK,那么我们在开发时应该使用那些工具和android文件系统呢?
这个问题在后面回答。

4、官方推荐我们使用 eclipse+adt进入开发应用程序,我们的HelloActivity程序也是这里开发的。当我们把Android源码/packages /apps/下的工程导入eclipse时,一般都会出现找不到包的错误。那么我们怎样修改、编译、调试android源码呢?Google又是用什么工 具来开发android的?
这个问题在后面回答。


下面系统地讲述Android开发环境建立以及开发工具的使用

一、Android SDK和eclipse的安装以及android开发环境建立
Android工具链比较完善,需要外部的工具比较少。具体的安装过程可参考官方文档或<<android模拟器在Ubuntu 8.10的安装>>和<<android源码的编译>>。
这 里需要注意的是,用”make”来编译Android源码时,我们可以使用JDK5或JDK6;用”make sdk”来编译时,会用到javadoc来生成文档,javadoc就必须使用JDK5的javadoc,否则编译是通不过的。因此,我们可以把JDK5 和JDK6都装上,然后只把javadoc和javadoc.1.gz指向JDK5相应的工具,其它工具还是用JDK6的。当然,我们可以只安装JDK5 或只用JDK5的工具。具体操作可以参考<<android源码的编译>>

二、使用eclipse来开发Android源码
这里主要参考官方文档
https://sites.google.com/a/Android.com/opensource/using-eclipse

下面,从官方文档总结出具体怎样用eclipse来开发Android源码

1、建立基本的Android开发环境
请参考官方文档或<<Android模拟器在Ubuntu 8.10的安装>>

2、编译Android源码
Android源码根目录下通过make进行编译,请注意一些配置,具体可参考<<android源码的编译>>

3、把eclipse工程配置文件复制到Android源码根目录下
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the copy writable
4、修改eclipse程序的配置
1)、增大eclipse内存设置
把eclipse.ini(在eclipse软件的安装目录下)的3个值改为下面的值:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
2)、把Android-formatting.xml和android.importorder导入eclipse(可选)
Android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
Android-formatting.xml用来配置eclipse编辑器的代码风格;android.importorder用来配置eclipse的import的顺序和结构。
在window->preferences->java->Code style->Formatter中导入Android-formatting.xml
在window->preferences->java->Code style->Organize Imports中导入Android.importorder
3)、安装anyedit插件(可选)
在http://andrei.gmxhome.de/anyedit/下载并导入eclipse中

5、把Android源码作为一个工程导入eclipse
导入前先检查.classpath里的文件在Android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹),.classpath里多余的路径可删除
新建Java Project(不是Android project,否则会破坏android源码),www.linuxidc.com选择从已存在的工程导入,工程名任意,完成。
导入时,eclipse要build工程,比较慢。导完后,一般都没有错误。
这里也就回答了第4个问题

 



注:

1.新建java 工程步骤不对也会造成解析错误,我的eclipse在new java project时无 法选择从已存在的工程导入,所以采取下面的步骤,先建立再导入

新建:New java project

 

      Project name 随便填

     不使用default location,把Location指定成代码所在目录,即

      uncheck  “use default location“,Location 选择工程的根目录(这个一定要选择,否则 package列表会出现错误) ,点击 Finish,   要花一段时间开始build workspace。。。。。

导入:File-> Import->select,General 选择 Exiting projects into workspace,->Next 选择源码的根目录,Finish。

      在 eclipse package Explorer就会列出所有关联的源码。

 

2.如果解析有错误就无法debug,我碰到的最大问题出在这里,eclipse中的problem窗口老实有错误,下面是解决办法

删除.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"/>

这时还提示 CalendarProvider和ContactProvider中EventLogTags有错误,再进行下面的修改:

1. 展开packages/providers/CalendarProvider/src
2. 展开包: com.android.providers.calendar
3. 右键点击包com.android.providers.calendar
4. 选择 "new file"
5. 在对话框中选择点击  "Advanced >>" 按钮, 可以看到"Link to file in the file system" checkbox,
6. 勾选上 checkbox.  这时 "Browse..." 可用.
7. 点击 "Browse..." 按钮,选择EventLogTags.java (e.g.,out/target/common/obj/APPS/CalendarProvider_intermediates/src/src/com/android/providers/calendar/EventLogTags.java)
8. 点击OK
9. 点击 Finish (in "New File")
 同样的方式修改com.android.providers.contacts的问题


这样eclipse解析整个源码就只有warning了

 


 

 

6、eclipse上调试Android里的程序。
为了不让其它版本的Android工具和android文件系统影响下面的编译和调试,需要从环境变量中去除android工具和android文件系统的路径:
vim ~/.bashrc
看看有没有在PATH变量中加入Android工具和android文件系统的路径,如果加有,则注释它。通过下面的方法,我们是不需要在.bashrc中添加android工具和android文件系统的路径的
执行:
cd Android源码目录


. build/envsetup.sh #设了环境变量之后,会多出mmm等命令,可以通过输入help来查看
lunch 1   # 把emulator等工具和ramdisk.img等文件的路径对应起来,就可以直接调用emulator等工具,也解决了第3个问题
emulator &
ddms &
注意,先启动ddms,再启动eclipse,这样eclipse中就不会说端口冲突
然后在eclipse中配置调试类型和端口:
在Run->Debug Configurations->Remote java application上双击,然后,”Host:”设为localhost,”Port:”设为8800,”Connection Type”为Standard(Socket Attach)
然后“Apply”
注意,上面设置的端口要与DDMS中设置的端口(查看路径File -->Preference,选左侧的Debugger,右侧Port of Selected Port)一致,ADT插件使用了8700端口,因此上面设置的端口是8800。如果出现连不到VM的错误时,请注意,要先在DDMS中选中某一进程(对应某一应用程序),才能在eclipse执行 Debug(在Java视图的情况下,点击Right-top 位置的Open Perspective,选择debug,就进入debug 窗口)。

 


 

 

附我的调试经验:

即时按照上面的做了,经常出现错误“Failed to connect to remote VM”,原因是上面的port配置问题。

首先你要在ddms里选择一个你要debug的进程。鼠标点一个进程就可以了,你可以看到在ddms显示的进程前有一个绿色小虫图标。
并将此进程的端口记下(ddms的最后一栏可以看到),配置到remote java application中的Port。
如用端口8700调试表示你将调试当前ddms选中的进程,你还没有在ddms中选择任何进程,所以就会弹出ClosedConnectionException。
参见:http://source.android.com/source/using-eclipse.html 中:
Note that port 8700 is attached to whatever process is currently selected in the DDMS console, so you need to sure that DDMS has selected the process you want to debug.
(要注意的是 端口8700是调试当前在DDMS中被选中的任何进程。所以,必须确认在DDMS已经选中你想要调试的进程。)

 


 

在eclipse调试时,可以设断点、单步调试,如何调试可以参考

http://blog.csdn.net/lixnhollycrmcom/archive/2011/03/23/6271853.aspx。

估计google团队也是这样开发、调试Android应用程序的

7、编译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来,也推荐用删除的方法来卸载

8、如何开发自己的工程
前面主要是讲如何在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或其它)把该工程上传到服务器

 

从官方文档和实践可以总结出几点:

1、可以使用eclipse来编辑JAVA程序、检查错误(主要是类库包含和语法方面),但是不能在eclipse上编译运行Android 源码,还是得在shell中make(或mm或mmm)
2、Android源码文件夹里提供有一些eclipse配置文件,
.claapath:eclipse工程的配置文件,方便我们直接把Android源码相应的文件和JAVA包导入工程
Android-formatting.xml和android.importorder:这个很重要,主要是用来规范我们的编码风格,更容易使我们的代码风格一致
3、把Android源码作为一个工程导入eclipse时,必须注意两点
1)、新建的工程必须是java project,不能是Android project,否则会破坏android源码(一般是多添加文件/文件夹)
2)、导入前最好检查.classpath里的文件在Android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹)

总的来说:
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更方便

分享到:
评论

相关推荐

    安卓技术记单词app,附带文档

    类似Eclipse ADT, Android Studio 提供了集成的Android开发工具用于开发和调试,在IDEA的基础上,Android Studio提供基于Gradle的构建支持、Android 专属的重构和快速修复、功能强大的布局编辑器和效果预览等功能。...

    Android水波(水纹)效果

    包实现Android平台下的水波效果,本水波实现源码可以随便使用,随便转载,但是希望尊重我的成果,我老婆马艳,我会对你很好的!实现思路:波能扩散,波能衰减,交换波能数据缓冲区,计算偏移量,判断坐标是否在窗口...

    joblib-1.1.0-py2.py3-none-any.whl

    该资源为joblib-1.1.0-py2.py3-none-any.whl,欢迎下载使用哦!

    MATLAB/Simulink中Buck-Boost变换器开环与闭环控制仿真建模详解

    内容概要:本文详细介绍了如何使用MATLAB/Simulink R2015b搭建Buck-Boost变换器的开环和闭环控制仿真模型。首先,作者解释了Buck-Boost变换器的基本构成及其在电源设计中的重要性。接着,逐步指导读者构建开环模型,包括设置关键参数如PWM频率、占空比、输入电压等,并展示了开环控制下的输出特性。随后,引入了PID控制器进行闭环控制,强调了PID参数的选择与调整方法,以及如何通过增加电压采样和误差比较来提高系统的稳定性。此外,还分享了一些常见的仿真错误及解决方案,如电感值选取不当、二极管模型过于理想等问题。最后,提供了几个有趣的实验案例,如动态改变占空比、突变负载等,以展示闭环控制的优势。 适合人群:具有一定电力电子和MATLAB/Simulink基础的技术人员或学生。 使用场景及目标:适用于希望深入理解Buck-Boost变换器工作原理及其控制策略的研究者和技术爱好者。通过动手实践,掌握开环与闭环控制的区别,学会优化PID参数,提升电源设计能力。 其他说明:文中附有多处代码片段和实用技巧,有助于读者更好地理解和应用所学知识。同时提醒读者注意不同MATLAB版本间的兼容性问题。

    2023年上海市高等学校计算机等级考试.docx

    2023年上海市高等学校计算机等级考试.docx

    能检测死锁,输出相关代码便于排查

    能检测死锁,输出相关代码便于排查

    电子商务物流业务管理教材.pptx

    电子商务物流业务管理教材.pptx

    基于stm32的控制底层

    基于stm32的控制底层

    2023年全国计算机等级考试三级数据库试题.doc

    2023年全国计算机等级考试三级数据库试题.doc

    2023年计算机二级考试操作题真题.doc

    2023年计算机二级考试操作题真题.doc

    2023年自考管理系统中计算机应用试题及答案.doc

    2023年自考管理系统中计算机应用试题及答案.doc

    《基于YOLOv8的社区健身步道夜间照明故障检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    2023年电子科技秋网与网站设计在线作业.doc

    2023年电子科技秋网与网站设计在线作业.doc

    电机控制领域基于脉振高频电压注入的无速度传感器控制系统

    内容概要:本文详细介绍了基于脉振高频电压注入的无速度传感器控制系统。该方法通过向电机定子绕组注入高频电压信号(如2kHz),利用高频响应电流中的转子位置信息进行实时定位。文中展示了具体的代码实现,包括信号注入、带通滤波、正交锁相环以及位置跟踪观测器的设计。此外,讨论了参数整定、抗干扰措施(如伪随机频移键控)和实际调试过程中遇到的问题及其解决方案。该方法适用于低速或零速情况,能够显著提高位置估计的准确性。 适合人群:从事电机控制、自动化控制领域的工程师和技术研究人员。 使用场景及目标:①用于工业伺服系统中,特别是那些对成本敏感或安装空间有限的应用;②解决传统方法在低速或零速情况下无法准确估计转子位置的问题;③提供一种可靠的无速度传感器控制方案,减少硬件成本和维护难度。 其他说明:该方法虽然在低速时表现出色,但在高速时精度有所下降,可以通过混合观测策略进行优化。同时,实际应用中需要注意高频信号带来的额外损耗和参数敏感性问题。

    2023年计算机二级基础知识重点总结.docx

    2023年计算机二级基础知识重点总结.docx

    joblib-1.1.0.tar.gz

    该资源为joblib-1.1.0.tar.gz,欢迎下载使用哦!

    安-225大型运输机实体拼装模型

    An-225大型运输机实体装配模型由225个实体零件基元组成,分为21个子装配模块。 该模型是通过缩放一个基本的8.5英寸x11英寸三视图原理图而开发的。 因此,其精度有所降低。

    使用matlab编程GUI 实现WGS84-CGCS2000坐标转换.zip

    matlab

    2024年大数据软件项目深度研究分析报告.docx

    2024年大数据软件项目深度研究分析报告.docx

    2023年四川省一级计算机等级考试训练题.doc

    2023年四川省一级计算机等级考试训练题.doc

Global site tag (gtag.js) - Google Analytics