1. 问题抛出

1.1 开发方面

对于日常开发中,每写一个"#333",都要手动的在当前xml与colors.xml中来回切换,查看是否已经定义过,如果定义过则拿过来复用,如果没有就要新定义一个叫"#333"的资源名,然后再使用。同样的情况存在于dimen以及string,这无疑是重复冗余的操作。

1.2 维护方面

试想一下,你接手了一个老项目,发现color、string和dimen信息全部以硬编码的形式存在于项目的xml文件中,而项目中的xml文件成百上千,那么提取工程中全部硬编码的工作就会变得异常繁琐。

2. 插件解决

因此综上所述,考虑做一个AS的插件,可以解决上述两个问题。先看一下插件使用的效果

2.1 插件安装

首先在AS的插件商店里进行搜索YanXuan HardCode Opt进行下载安装。

2.2 对于单个文件的快捷键一键操作

快捷键为Commend+Ctrl+S,该操作会包含对单个文件的color、string和dimen三种硬编码提取,需要注意的是,需要在你写完代码之后,先Commend+S保存内容,再执行插件,否则会有文件缓存冲突的弹窗:

2.3 对于文件夹下的批量操作

右键选择你要执行插件的文件夹,可以选择其中一种硬编码提取,将对所选文件夹下的所有xml文件全部执行优化,并在log中提示执行结果,这里以color优化为例:

3. 插件解决的三个问题

3.1 哪几个层级可以执行插件
  • 在res/layoutXXX/或者res/drawableXXX/下面的xml文件
  • res目录下的/layoutXXX/或者res/drawableXXX命名的文件夹
3.2 怎么去查找硬编码
  • IntelliJ 的虚拟文件系统VirtualFile
  • xml解析将文件流转成Node树,再查找属性值
  • string查找:文案千变万化,毫无规律可言,所以没法从string的规律去查找,只能从指定的属性去查找, 即android:text和android:hint属性
  • color和dimen的查找:不同于string,color以及dimen是可以通过正则表达式实现筛选的:
Pattern.compile(“^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$");
Pattern.compile("([1-9]\\d{0,3}|0)[.]{0,1}[5]{0,1}dp");
  • 如果执行dimen优化,类似于xdp的值可以被识别,其中x是大于0的正整数或点5的小数,0<x<10000
  • 如果执行color优化,类似于#xxx、#xxxxxx、#xxxxxxxx的值可以被识别
  • 已过滤databinding的样式
3.3 找到之后如何替换
  • 对于dimen和color会优先取缓存,如果命中,则直接取出已有资源文件中的name,不改动value文件中的内容。而string不会读缓存,总会生成新的值
  • 直接修改Node数值的方式,这种方式会修改原有的代码(比如会格式化原有的代码)为了尽量不改动原有代码,放弃该方案
  • 把整个文件看成一整个字符串,通过String.indexOf的方式找到待更换的位置,使用replace的方式替换子字符串,再读写文件完成替换
  • values目录,以及dimen/string/color文件会自动识别或生成
  • 对于新资源的命名:
 - color以color_xxx来命名;- string以layout's name_text_index来命名;- dimen以size_xxdp来命名,带.5的小数以下划线代替小数点。

4. 插件使用时的注意事项

  • 对于单个文件,支持右键以及快捷键两种方式,快捷键默认三种优化一起执行。需要在你写完代码之后,先Commend+S保存内容,再执行插件,否则会有文件缓存冲突的弹窗
  • 对于文件夹,为了性能,仅支持右键选择一种优化方式
  • 在插件执行完毕后,会在Event Log中输出执行结果,color以及dimen会复用你工程中已存在的item value,而string因为与业务强绑定,因此只会生成一个新的item value
  • 欢迎大家下载尝试并提出意见~

Android开发——AS插件批量解决XML中的String/Color/Dimen硬编码相关推荐

  1. 开发chrome 插件, background.js中 console log 看不到解决方法

    开发chrome 插件, background.js中 console log 看不到解决方法 参考文章: (1)开发chrome 插件, background.js中 console log 看不到 ...

  2. 《Android开发艺术探索》自定义View中关于“HorizontalScrollViewEx”的改进

    在<Android开发艺术探索>一书中自定义View一节中提到了关于一个类似横向滑动List的自定义ViewGroup:HorizontalScrollViewEx.如果你使用过的话就会发 ...

  3. 解决xml中mybatis等的dtd提示问题

    解决xml中mybatis等的dtd提示问题 参考文章: (1)解决xml中mybatis等的dtd提示问题 (2)https://www.cnblogs.com/xiaohongxin/p/6627 ...

  4. android开发rn插件,在Android原生应用中嵌入React Native

    开发工具:Android Studio , WebStorm 参考链接:React Native官方中文文档 一.创建React Native项目 1.在本地React Native项目目录下,创建一 ...

  5. Android 开发环境搭建 与在编译中遇到错误make Error 45解决方法

    Android 开发环境搭建 一.安装ubuntu 10.10操作系统 使用光盘安装,注意分区,分一个swap分区为3G(原则需要与内存一样大,但可以稍微比内存大一点).当时是同事帮我弄的,swap开 ...

  6. Xamarin.Android开发及常见问题的解决

    一.Xamarin.Android开发环境的搭建 (一)所需组件 1.VS2013(VS2010以上即可) 2.JDK(http://www.oracle.com/technetwork/java/j ...

  7. Android开发桌面插件

    前提:公司应用需要开发插件,奈何我实在没有块的开发经验,查阅了一些资料,花了几天时间,完成了插件的开发. 开发桌面插件需要了解AppWidgetProvider,RemoteViewsService, ...

  8. Android自定义View研究(四) -- 在XML中定义View

    如果在一直使用SetContentView(new HellwView(this)感觉总是少了一点东西,少了什么了,失去了Android中使用XML定义组件的方便性性,这种感觉让人很不爽,呵呵,在这节 ...

  9. ym——Android开发MVP模式(解决了View和Model的耦合)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 什么是MVP呢?它又和我们常常听到的MVC有什么关系了以及区别呢? MVP 是从经典的 ...

最新文章

  1. timestamp与timedelta,管理信息系统概念与基础
  2. spark on yarn :state: ACCEPTED一直 出现
  3. MySQL(6)视图
  4. Angular的@Output与@Input理解
  5. gin 项目结构_Gin框架中文文档
  6. echart多个柱状图 设置y轴显示_Echart可视化学习笔记(五)
  7. 样条表示---插值和逼近样条
  8. Git笔记(11) 分支简介
  9. 个性潮流的设计PSD分层模板
  10. 播客“日谈公园”完成数百万天使轮融资,来自头头是道基金
  11. Sharepoint2013:在页面上显示错误信息
  12. 怎样把照片中的头像扶正_一个男人的微信头像,往往暴露了“人品”,你是哪一种?...
  13. 使用辅助任务来提升情感分类领域适应
  14. 很高兴向大家推荐《jBPM4工作流应用开发指南》这本书
  15. 扫雷游戏计算机版,扫雷经典版电脑版
  16. 好看的登录html界面,很漂亮的用户登录界面HTML模板
  17. 如何在android上编程,如何在Android中以编程方式与USSD对话框进行交互
  18. github-上传本地代码到github仓库
  19. 对于 Latex CJK 的一些解释
  20. linux系统制作qcow2,centos7.6下qcow2镜像制作方法

热门文章

  1. linux中IGV的运行,[Linux] IGV使用说明
  2. 问题 M: 取石子游戏
  3. 用C语言实现2的次方运算
  4. 主成分分析(PCA),概率主成分分析(PPCA)和因子分析(FA)的区别?
  5. 仿天猫商城后台数据库设计及运用
  6. 杜海涛偷吻吴昕传授恋爱秘诀 网友惊呼两人真情流露
  7. 达拉斯牛仔队门票的球队发挥其主场比赛在牛仔体育场在阿灵顿
  8. python中for循环流程图_Python while 循环
  9. Selenium IDE录制脚本
  10. 生成一段代码,能够判断双色球彩票是否中奖