在阅读Android源码过程中,有一些逻辑不是很清楚,但是调试源码又太费劲,这时,可以通过编写测试性的应用程序来验证自己的猜想,再钻入源码的海洋可能更有针对性。这里就记录一下如何在Android源码环境下进行应用程序的开发。
在Android源码根目录下的package子目录可以发现有一个experimental文件夹,我们先看看它的README文件内容:
可以看到,这个目录下是各个测试的应用软件包(package),主要用于测试、开发验证或者娱乐性的目的,而正式发布的app应放在development/samples/目录下。我们的测试APP就放在package/experimental目录下吧,文件也说到,每个包都应包含READMD文件,用于说明这个应用程序的目的,也方便了他人阅读源码时理解其作用。
首先我们就创建一个包文件夹吧:
按照该目录下其他包的结构,新建如下几个文件:
在src目录下创建一个包cn.linjk.jim,然后新建一个主页面控制器MainActivity.java:
cd src && mkdir -p cn/linjk/jim && vim cn/linjk/jim/MainActivity.java
新建页面文件main.xml:
cd ../res && mkdir layout && vim layout/main.xml
新建一个字符串资源文件strings.xml:
cd ../res && mkdir values && vim values/strings.xml
然后在res目录下创建子目录drawable,里面放一张png图片作为应用程序的图片,也可不放,这就会使用Android默认的应用程序图标。
接着到了最后关键一步,清单文件AndroidManifast.xml,它配置了Android应用程序的包名和所有组件、服务等:
应用程序开发完了,还需要编写编译规则,这样才可以生成应用程序,这里不是生成APK包,而是把应用程序打包到Android系统镜像里面,这里和通常的Android应用程序开发不一样。编辑Android,mk:
现在可以编译打包Android系统镜像文件system.img了。为了不用再次在源码根目录执行make等待漫长时间,可以单独打包应用程序和生成系统镜像文件system.img而userdata.img和ramdisk.img可以使用原来的,因为我们只新添加了应用程序,重新打包后只有system.img文件发生变化。
cd ~/Documents/source_code/android-2.3.1,使能单独编译打包命令mmm: source build/envsetup.sh
然后就可使用mmm命令编译单独的应用程序模块了,只需在mmm后面加上模块路径即可:
(注:上面的xml文件的第一行有误,开始和结尾应使用<? ... ?> 包起来,这里就不重新截图了)
提示主页的TextView的text属性必须使用资源文件的,我们在strings.xml加入一个字符串然后引用,重新编译:
这里生成的apk路径在out/target/product/generic/system/app下,如果是C可执行文件则在bin目录下,动态链接库在lib目录下,硬件抽象层文件在lib/hw下,有点类似Linux文件系统的文件组织。
现在生成了应用程序,可以打包system.img文件了: make snod, 然后使用新的system.img文件启动模拟器:
应用程序 启动后如下: