穷汉的安卓代码模板生成工具
我刚刚又看了一遍 安卓SDK相关的页面 ,吓我一跳,看到了一个 “From the Command Line” 这样的字眼,还以为安卓SDK也支持这样的命令行工具了,那我 的行为艺术就没有价值了😂。幸好,虚惊一场,那个链接指向的是如何用命令 行生成一个安卓项目,但并不能生成代码。想生成代码,还是只能用Eclipse或 者Android Studio。
我在大半年之前就已经写出了这个在命令行上生成Android代码的脚本。基本上 只要是Eclipse支持的每个模板,我的脚本也全部支持,比如project、activity、 service等等。只要是Eclipse支持的可选参数(比如package的名字、activity 的名字,navigator的类型),我的脚本也全部支持。因为我完全是抠着Eclipse 里面的代码重写的,包括它使用的freemarker这个java包。
里面用到的模板也基本上复用了Android SDK提供的那一套模板,只是修改了一 些明显的bug和一些在命令行上重做时不切实际的代码。
以BlankActivity为例,在我的system-config里,它的路径在 这里 ,但事实上
你可以对比一下,我是从
android-sdk-linux/tools/templates/activities/BlankActivity
里拷贝出
来的,然后只做过一个改动。
安卓SDK的这套代码模板基本上都是这样组织的:
- 有一个 template.xml 。里面我主要用到了它给出的各个参数,比如package
名字,layout的名字,Activity的名字,是不是Launcher Activity(桌面上
有图标的Activity)。等等。
如果是在Eclipse里的话,这个文件还提供了各种缩略图,比如你选了一个 layout之后,Eclipse就会显示一个此layout的示意图给你看。但这个对我们 这样的穷汉来说,有点太奢侈了,所以只要自己脑洞大开,脑补一下这个示 意图就好了😂
- 有一个 globals.xml.ftl 。所有以.ftl为扩展名的文件,都是freemarker template的意思,需要交给freemarker程序处理一下才可以。这个文件里的 内容就是一些变量的默认值。
- 有一个 recipe.xml.ftl 文件。这个文件顾名思义,就是菜谱的意思,告诉
freemarker应该怎么一步一步地把所有代码文件从模板中生成出来(其实就
是变量替换而已,比如把 root/AndroidManifest.xml.ftl 文件里的这样一
行:
android:label="@string/title_${activityToLayout(activityClass)}"
里面的activityClass通过一个freemarker的activityToLayout库函数(由我 提供)改写成另一个标识符。
- 一堆的模板文件,基本上全以.ftl为扩展名。比如BlankActivity有这么些:
./root/src/app_package/TabsActivity.java.ftl ./root/src/app_package/DropdownActivity.java.ftl ./root/src/app_package/include_onCreateOptionsMenu.java.ftl ./root/src/app_package/TabsAndPagerActivity.java.ftl ./root/src/app_package/include_DummySectionFragment.java.ftl ./root/src/app_package/SimpleActivity.java.ftl ./root/src/app_package/include_onOptionsItemSelected.java.ftl ./root/res/menu/main.xml.ftl ./root/res/values/strings.xml.ftl ./root/res/layout/fragment_dummy.xml.ftl ./root/res/layout/activity_pager.xml.ftl ./root/res/layout/activity_simple.xml.ftl ./root/AndroidManifest.xml.ftl ./recipe.xml.ftl ./globals.xml.ftl
其中要注意的是,freemarker除了简单的变量替换功能,还有复杂的if/else逻 辑,应此可以实现一些比如根据所选的Activity NavType的不同而生成不同的代 码。
我的freemarker脚本只是对Debian自带的libfreemarker-java包的一个封装,脚 本在 这里 。Java代码在 这里 。这个脚本如果发现需要重新编译一下的话会自 动处理,所以我修改完Java代码之后不需要手动更新.class文件,真是人生何处 不自动化哈😊。
总驱动脚本,poormans-android-template,在 这里 。
用法是:
poormans-android-template -t 'appli' poormans-android-template -t 'blank activity' --isLauncher true --activityClass TheRightApkActivity
其中第一句是生成一个application,也就是一个project了;第二句则是生成一 个空白的Activity。你可以看到我不需要打完格的 -t 参数,后面只跟了一个 “appli”,脚本就会自动匹配出最合适的template给我,如果有多个的话还会让 我选,这个特性你在Firefox的地址栏里也可以看到。更具体的用法见脚本,是 用ruby写的,其实我不会ruby😄。
关于这个名字为什么这么倒霉,poor man,其实不是穷汉的意思,而是因为这个 脚本写得有点粗糙,生成完application再生成activity之后需要手动改一下 AndroidManifest.xml文件,否则不是一个合法的.xml😄。谁用谁知道😂。
以上工作完成于在阿里巴巴工作期间,感谢。