您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
网易 Android工程模板化实践
 
作者:张云龙  来源:InfoQ 发布于: 2016-12-2
   次浏览      
 

背景

我们网易前端技术部 - 移动技术组作为公司的移动端基础技术部门,主要为其他部门提供解决方案、技术支持和产品孵化。在几年的积累过程中,我们拥有一些自己的框架和 SDK,如轻应用框架、热更新 SDK、网络请求库、本地存储库、页面管理等,服务过网易新闻、云音乐、考拉、易信等亿级产品,先后孵化过青果摄像头、二次元Gacha、严选等重要产品。

在多年的Android开发中,对于 Android 端产品开发,我们有如下几点体会:

产品孵化排期紧张

产品经理一般关心的是具体的业务逻辑,而前期基础模块的搭建,如各模块如何组织,使用代码结构如何选择,图片、网络、本地存储等选用哪个 sdk 等,一般不会有专门排期。

基础模块的需求具有相似性

内容型产品,其搭建的基础模块基本上都会包含图片显示、网络请求、本地存储、通信等。

基础模块的选型和工具类具有可重用性

网上相关的第三方库有很多,当然一般的公司也是会有自己开发或者维护的各个基础 SDK。很多时候,SDK 选型会更偏向于自己公司开发维护的 SDK,或者选择自己最熟悉,或最主流、最可靠的 SDK。因此当开发多个相同类型产品时,这里的技术选型是可重用的。

网络请求的代码具有机械性

客户端开发需要根据网络接口协议,编写相关的 GET、POST 等请求代码和对应的 JavaBean,这部分的代码编写其实是非常机械的。

网易工程模板是什么?

对于各个基础模块,我们团队封装了自己的 SDK,如网络库、本地存储库、页面管理库、图片库等。使用我们的工程模板生成的初始工程,就已经包含了我们提供的基础模块,产品团队的开发不需要再花费重复的时间做技术调研、选型、SDK封装集成等工作,而只需要关心自己的业务逻辑编写。我们期望产品团队只需 1 分钟就能得到自己的初始工程,并能马上投入业务逻辑开发,既能缩短开发周期,也能保证工程代码质量。

此外,我们也提供了 Android Studio 插件 (NEIPlugin),集成插件后,就能在 Android Studio 中通过菜单点击自动下载集成我们的工程模板,也能自动生成网络请求相关的代码。

代码生成结果示例

Android 模板工程实现

最初我们使用终端脚本命令的方式,通过文件拷贝和文本查找替换(主要是替换包名等)的方式实现。但终归对 Android 开发人员不太友好,毕竟大家更习惯使用 Android Studio 生成工程。所幸,强大的 Android Studio 已经提供了较为全面的模板功能,这里大概可以分为以下几类:

工程模板 (本文内容)

文件模板

注释模板

编码模板(Living Template)

Android 工程模板基础知识

工程模板实例介绍

对于 Android Studio,模板位置:

Windows 的路径在 `${android studio 安装路径}/plugins/android/lib/templates/`

MacOS 的路径在 `${Android Studio.app 存放路径}/Contents/plugins/android/lib/templates/`

有关模板的文件夹:

activities:工程模板相关,如 EmptyActivity 文件夹用于创建一个空页面的模板,GoogleMapsActivity 文件夹对应创建一个地图页面的模板等

gradle:放置了 gradle 模板,用于在新建工程的根目录下生成 gradle 文件夹,支持用户不用安装 gradle 就能使用 gradlew 命令

gradle-project:工程模板相关,用于构建 module,Android Project,Java Library 等

other:构建文件模板等

这里我们关心的是 activities 文件夹里面的内容

首先查看下 EmtpyActivity (空白页面模板) 里面的内容

globals.xml.ftl: 全局变量文件,保存一些全局变量,当中可以引用其他文件的全局变量

recipe.xml.ftl: 配置要引用的模板路径以及文件的生成规则

template.xml: 模板的配置信息,包括模板的显示图标,界面的表现,全局变量文件和执行文件的指定等

Android Studio 使用的是 FreeMarker 模板引擎,所以文件后缀都是 .ftl

常用标签使用

${}: FreeMarker 的语法,如 ${packageName}, ${superClass} 是 globals.xml.ftl 全局变量文件或template.xml.ftl 中定义变量引用

<#if></#if>: FreeMarker 的语法,条件判断语句

<#include>: FreeMarker 的语法,包含语句

copy: 将文件或者文件夹从 from 标签拷贝到 to 标签指定的路径

instantiate: 将文件或者文件夹,执行 FreeMarker 语法,从 from 标签实例化到 to 标签指定的路径

merge: 合并 from 和 to 标签分别指定的文件

open: 在工程打开后,默认打开指定的文件

实例:使用空白页面模板生成工程并打开后,可以看到默认打开了 MainActivity.java 和 activity_main.xml 文件

工程模板创建

新建 HTTemplate 文件夹内容如下:

template.xml

指定模板名、描述、最低支持 sdk 版本、类别等,输入界面要求指定包名和 Application 类名

globals.xml.ftl

引用公共文件内容

recipe.xml.ftl

merge AndroidManifest.xml 文件

copy 或者 merge 资源文件

copy 或 instantiate java 代码

merge build.gradle 文件

merge settings.gradle 文件

copy lib 文件夹里面的全部内容

copy module 工程

copy proguard-rules.pro 文件

root 文件夹

放置相关模板源文件,其中将源工程中依赖于配置的代码,按照 FreeMarker 语法进行替换

添加工程模板图标,并在 template.xml 中添加引用

settings.gradle 合并

查看 RecipeMergeUtils.mergeGradleSettingsFile 方法,基本逻辑如下:

读取目标文件的每一行内容,并判断每行内容的开头是否是 include 开头

是:在 include 后面插入内容

否:抛出异常

返回合并的内容

build.gradle 合并

查看 GradleFileMerger.mergeGradleFiles 方法,里面会调用 mergePsi 方法,其基本逻辑如下:

读取文件 source 和 dest 文件的内容,并转化得到 GroovyFile 类型对象

执行 mergePsi 方法

这里 mergePsi 执行合并的逻辑是

小结和后续工作

到此,基本上完成了我们原先期望实现的工程模板和网络请求代码自动生成的工作:

提供 ht-template 支持生成我们的模板工程

提供 Android Studio 插件 (NEIPlugin)

支持 ht-template 的下载安装

nei-toolkit 和 Node.js 的下载安装

nei-toolkit 和 Node.js 的使用,生成网络请求代码

这里还是有一些因为 Android 工程模板自身的限制而无法完成的内容点:

无法在 settings.gradle 指定 module 路径

无法合并 proguard-rules.pro 文件,暂时生成 proguard-rules.pro.template 文件

由于 build.gradle 对 apply 命令合并会出错和无法合并 dependencies 中的 apt 命令,所以无法在 build.gradle 中集成 ht-universalrouter

再次,除了网络请求代码编写是机械性的,其他的基于我们的工程模板生成的初始工程,也存在一定的代码编写机械性:初始页面代码生成、RecycleView 中的各个 ViewHolder 类、本地数据读取保存等,而这些工作将会是我们的后续工作。

标题

Q:本次的分享是不是需要有idea的插件化知识背景?

A:idea 插件开发的内容,可以查看官方文档 http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/setting_up_environment.html,里面有比较详细的介绍。

如果需要自己学习插件开发的话,就需要学习官方文档,不过我的分享中并没有讲述插件开发中的一些细节,应该不会有影响。

这次大家如果觉得听起来有点难,我想应该是这次分享需要有工程模板开发的背景,不然确实会有点难。

推荐下这篇文章,可以入门下工程模板开发的内容:

Mobile App Development: Tutorial How To Create Custom Android Code Templates

Q:请问neitoolkit是做什么的?

A:neitoolkit 在移动端,是一个配合我们的 NEI 接口管理平台(http://nei.hz.netease.com/),用来生成网络请求相关代码的一个工具,当然可以查看 README 介绍

支持根据 NEI 平台 定制生成项目初始结构及代码

支持 NEJ 发布工具 配置文件自动生成

支持 Fiddler 和 Charles 工具代理本地模拟数据,接口配置文件导出

支持自动生成移动端数据模型、请求类代码

支持自动导出模拟数据

集成了本地模拟容器

Q:请问上文的runtime怎么理解呀?

A:这里的 Runtime,其实就是执行了 java 中的 Runtime.getRuntime().exec(command); 方法。

这个方法的作用就是执行 sh (windows中cmd) 中的脚本命令。

Q:如果模版中有需要apt处理的代码,模版是不支持的是么?

A:恩,工程模板是不支持的,dependencies 中 非 compile 命令全部都是不支持的,这个可以从前面的源码分析中看出来。

   
次浏览       
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新活动计划
Node+Vue3.0前端全栈开发 7-5 [特惠]
Spring Cloud微服务架构 7-5[特惠]
SysML和EA系统设计与建模 7-26[特惠]
Python、数据分析与机器学习 8-23[特惠]
嵌入式软件架构设计 8-22[线上]
Linux内核编程及设备驱动 7-25[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...