chapter 1. 缘起
后天就要考试了,无心复习,起了兴致,想看一看android create project,然后拿了一瓶矿泉水,准备从这几天的天气写起。
阳光是很灿烂的,而且水也很好喝,我打算开始写起来了,哈哈。
chapter 2. 文件的线索
我想看的第一个东西就是这个android create project在使用的过程中到底用到了什么东西,看样子应该是用到了模板,然后修改了某些内容。
file android
发现这个家伙是一个shell script,在脚本的最后发现这么一个东西:com.android.sdkmanager.Main,看来蹊跷在这个文件,里面应该包含我们模板应用的实现。
然后我们把最后的一个调用java的语句里面的变量替换,把这句单独拿出来执行。结果发现完全行得通。这里就能解释通了。实际上android只是一个外壳,为的可能是不同平台的兼容性,也可能是做一些容错处理。而sdkmanager才是真正的实现。
打算先strace一下,看看它的大体脉络。
strace android create project --target 4 --path Foo --package com.pysnow.foo.activity --activity FooActiviy
一路直下,哈哈,找到了一个sdkmanager.jar。这个文件查找了两个地方,一个是tools/下,结果呢,呵呵,没找到。然后来到tools/lib/底下,这下找到了。
这个jar包应该就是我们的android实现了。
找到这个jar包,解压之,可以看到几个文件,最大的文件数Main.class,30+k,就是android调用的那个类了,反编译之。
javap -c Main
看到了一些很熟悉的东西:displayTargetList(),displaySkinList()等等等等,看来真的与你有关呀。
直接在文件里面查找project字符串,找到一个类,com.android.sdklib.internal.project.ProjectCreator,嗯,这个很有意思。
这个类该在哪里找呢,这又让我们想起了tools/lib/文件夹,再加上类名中的sdklib,我们一下子看到了sdklib.jar这个jar包,解压开来果然有ProjectCreator.class。
javap -c ProjectCreator.class
可以看到内有createProject()方法。
我们抽取ProjectCreator.class里面的strings,然后在结果里查找带有template字眼的string。
strings ProjectCreator.class | grep -i template
哇,我们关心的东西找到了,可以把注意力放在AndroidMenifest.xml上,然后我们查找这个文件。
updatedb && locate AndroidManifest.xml
找到了!
它们在platforms/android-xx/templates/下面,而这些templates/文件夹就是模板的所在地了。
文件的线索就追到这里了,我们再来看create project的参数起到了哪些作用。
chapter 3. create project参数的秘密
我们采用比较的方式,假设--target 4不变,生成两个项目然后用diff进行比较。
比较的结果比较简单:
--name选项:影响的是build.xml文件里的project根节点的name属性。
--package选项:影响的是AndroidManifest.xml文件里的manifest根节点的package属性和src文件夹的目录结构(包名表现在目录层次里)。
--activity选项:影响的是AndroidManifest.xml文件里的activity节点的android:name和源文件里的类文件名以及类名。
这些结果都是很显然的。
再来比较它们与templates/文件夹里的的区别,这次我们用--target android-4。模板要修改的地方在template文件里用大写标出。
对于AndroidManifest来说,它修改了templates/AndroidManifest里面的manifest的package属性和activity的android:name属性。
对于strings.xml来说,修改了文件中唯一一个名字为app_name的string节点。
对于main.xml来说,修改了文件里的TextView的android:text属性,也即为主Activity要显示的内容。
对于--activity参数生成的主Activity的源码文件,它由java_file.template文件得到,并修改了类名。
还有其它的文件用来配置项目,生成build.xml等文件。
build.xml的生成也是一个看起来很有意思的东西,改天再研究一下。