ANDROID源码编译开发总结 .

来源:互联网 发布:辐射4捏脸数据 编辑:程序博客网 时间:2024/06/03 06:11

说明:这篇文章是介绍如何开发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 窗口)。
在eclipse调试时,可以设断点、单步调试。估计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)从out/target/product/generic/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更方便


**************************************************************************************************************


7、编译Android源码的补充(编译模块)


android中的一个应用程序可以单独编译,编译后要重新生成system.img


在源码目录下执行


  . build/envsetup.sh (.后面有空格)


就 多出一些命令:


   - croot:   Changes directory to the top of the tree.


  - m:       Makes from the top of the tree.


  - mm:      Builds all of the modules in the current directory.


   - mmm:     Builds all of the modules in the supplied directories.


  - cgrep:   Greps on all local C/C++ files.


  - jgrep:   Greps on all local Java files.


  - resgrep: Greps on all local res/*.xml files.


  - godir:   Go to the directory containing a file.


可以加—help查看用法


我们可以使用mmm来编译指定目录的模块,如编译联系人:


  mmm packages/apps/Contacts/


编完之后生成两个文件:


   out/target/product/generic/data/app/ContactsTests.apk


   out/target/product/generic/system/app/ Contacts.apk


可以使用make snod重新生成system.img


再运行模拟器


8 我的情况


当我在eclipse里修改了源码时,用第7步mmm 


 


packages/apps/Contacts/ 然后再make snod 再emulator,emulator不能运行。


 


 


后来看android官方文档的说明,再每次修改后都

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子做事效率低怎么办教案 孩子做事效率低怎么办读后感 做事效率低总是焦虑怎么办 红米手机黑屏打不开怎么办 手机萤石云视频下载打不开怎么办 oppo打开网页视频慢怎么办? 晒课显示待提交怎么办 华为手机无法访问移动网络怎么办 晒课上传课堂实录太大怎么办 手机酷狗音乐下载要钱怎么办 手机酷狗下载要钱怎么办 酷我音乐没有声音怎么办 手机酷我音乐没有声音怎么办 酷我音乐歌曲下载收费怎么办 网易云下载超过每日上限怎么办 全民k歌领不了花怎么办 安卓全民k歌延迟怎么办 全民k歌唱歌延迟怎么办 全民k歌耳机延迟怎么办 word文档打开是乱码怎么办 全民k歌不能录音怎么办 全民k歌登录不上怎么办 平果手机迅雷闪退怎么办 电脑打开央视影音死机怎么办 先锋影音二级网页打不开怎么办 手机qq音乐登录失效怎么办 酷狗账号忘记了怎么办 手机qq音乐听不了歌怎么办 第一试用网密码忘了怎么办 玩h1z1画面卡顿怎么办 uu跑腿抢不到单怎么办 比特币加密忘了怎么办 路虎发现cd卡死怎么办 苹果手机帐号被锁定怎么办 苹果手机帐号锁定了怎么办 微博帐号被锁定怎么办 微博显示帐号被锁定怎么办 uc屏蔽了一个网站怎么办 uu跑腿送货遇到不方便收货怎么办 雷神加速器忘记暂停怎么办 obs直播开摄像头吃鸡掉帧怎么办