shell正则表达式

正则的意义

正则对于平时的开发工作是非常有意义的,如果不用正则有可能你需要复杂的逻辑去完成一个需求。然而,使用正则的时候经常会骂娘, 为什么骂娘? 无非两个原因: 一、看不懂了。二、忘记了规则实在写不出来。 其实,如果不是特别经常使用正则确实会忘的比较厉害。但是,如果你对正则进行一个深入的理解,是有助于长期记忆的。

阅读全文

Gradle守护进程导致的android打包异常

公司内部打包平台可以根据不同分支不同渠道信息进行自动化打包。昨天发版打包时竟然发现了一个特别诡异的问题导致生成的 apk 安装包直接崩溃。

问题描述

先选择含有听云sdk 代码的分支进行自动化打包,打包完毕验证 apk 没有问题; 然后选择不含有听云 sdk 代码的分支进行自动化打包,打包完成,验证 apk,直接启动崩溃。查看 log
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/networkbench/agent/impl/instrumentation/NBSSQLiteInstrumentation;
看到上述 log,第一反应有点懵逼,怎么会包听云 sdk 中的类呢。明明代码中没有引入听云 sdk。 难道 代码 checkout 出错了?难道 build脚本我忘记 clean Task 了? 难道 clean 代码没有 clean 干净?……

阅读全文

SQLite迁移到GreenDao

从原生的 SQLite 迁移到 GreenDao 数据库框架整体上来讲还是相对比较容易的,这也归功与 GreenDao 易用的 API 和编译期注解。

整体的设计思路

db_framework

阅读全文

Android数据库调研以及GreenDao3使用

网易新闻客户端对数据库的依赖是比较重的,很多数据都存在了客户端数据库,因此我们很早之前就想将数据库模块进行改造。于是我们对目前 Android 上使用比较广泛的数据库框架做了一个调研,并写了一个 demo 比较了一下各个框架的性能和易用性。

Android 上常用的数据库框架

调研了一下目前 android 上常用的数据库框架,主要有:

阅读全文

AOP技术在网易新闻中的应用

AOP概念

百度百科中对AOP的解释如下:
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
说白了,AOP其实就是OOP的补充,OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。

阅读全文

网易新闻热补丁技术实践

两年之前android hot fix技术炒的非常热,各大厂商也是花样百出,各自献计,一时间出现了百家齐鸣的现象。但是各家都有各家的问题。当然网易其实也不甘落后,公司不同部门也研发了自己的热更新热补丁方案。网易新闻也是不断的探索未知,先后实践过一些方案, 目前使用的还是基于AOP的方案。
到目前为止,新闻android客户端上线热补丁技术也已经将近两年的时间了。也曾经为部门立下赫赫战功。一直想给这套方案起一个优雅的名字,但是始终没有想到满意的。直到今天早上,偶然间看到了一个单词Vulcan([‘vʌlkən]伏尔加,罗马神话中的火神与金工神),对这个词非常有感觉,那我就暂时已Vulcan对我们这套热补丁方案命名吧。
其实,很早之前就想写一下这套实践方案的思路,一直手懒没有写,今天看到了Vulcan这个词,一时兴起,提笔书之。

阅读全文

网易新闻瘦身实践

随着业务的不断增长,网易新闻客户端已经承载了过多的功能,不仅仅是一个新闻资讯的app,而是成了公司各个业务线的载体。因此,体积增长的问题就暴露了出来。体积最大时达到了30M,这对一个android应用级别的app来说算是非常大的了。于是不得不把瘦身的工作提到日程上。

分析apk,查看个模块的占比

这一块目前来说还是非常方便的,直接使用android studio提供的apk分析工具,将自己的apk拉入进去,查看一下包体积的状况即可。

如上图所示,可以看到主要的体积占用是再lib下的so库, 资源文件和dex这三个部分。于是我们根据分析采取了以下措施。

阅读全文

AppBarLayout的五中ScrollFlags

最近使用CoordinatorLayout和AppBarLayout,总结一下AppBarLayout的scrollFlags属性;
scrollFlags共有五中取值提供给AppBarLayout的ChildView使用, 在布局中直接使用app:layout_scroolFlags设置, 对应的职位scroll, enterAlways, enterAlwaysCollapsed, snap, exitUntilCollapsed; 代码中通过’setScrollFlags(int)’来进行设置。

阅读全文

git仓库迁移

git仓库从一台服务器迁移到另外一台服务器:
1) 从原有仓库克隆一份裸版库,sample

1
git clone --bare git://github.com/username/project.git

阅读全文

OKHttp设置Header的那些坑

项目中网络底层库使用的okhttp,但是上层使用的Volley和glide;于是就设计的到了通用的请求header设置。于是通过Interceptor给设置的统一的header,但是okhttp的api确实有点坑啊。上线后发现图片的请求有两个UA,而且两个UA一个是我们设置的一个是glide默认的。
排查发现我们调用的Request.Builder.addHeader(k, v) 这个api是添加header,不会移除调之前有的header信息,比如设置UA,glide库设置了一个默认值,而我们又调用了这个api,这就产生了两个重复的UA。
正确的api是调用Request.Builder.header(k, v)来设置header,这个api会覆盖之前已有的header。
也可以先通过Request.Builder.removeHeader(K)先移除,然后再调用addHeader(K, V)

阅读全文