Artifactory搭建本地仓库
个人博客
http://www.milovetingting.cn
Artifactory搭建本地仓库前言之前使用Nexus Repositories Manager搭建了Maven本地仓库(可参考Android Gradle分类下的Android Gradle 多项目构建文章)。这里,用另一种方法:使用Artifactory来搭建本地仓库(参考Allen老师的课程)。
启动下载Artifactory后,如果环境是window系统,可以直接双击运行bin目录下的artifactory.bat文件,在浏览器地址栏输入:http://localhost:8081/artifactory/,进入后台管理面板。
创建本地仓库点击左侧菜单栏用户图标,然后选择右侧的Repositories下的Local,在打开的界面中,点击右上角的New,在弹出的界面中选择Maven,输入Repository key,这个key就是本地仓库的名字,可能任意输入,但不能和已存在的仓库重名,输入后,不用修改其它,直接点击右下角的Save&Finish。
创建本地仓库的操作过程如下:
创建远程仓库点击左 ...
修改Android Studio新建工程时repositories的默认配置
个人博客
http://www.milovetingting.cn
修改Android Studio新建工程时repositories的默认配置前言由于众所周知的原因,Android Studio中连接google和jcenter的仓库时,会比较慢,较大机率会失败。为解决这个问题,可以设置仓库为阿里云的仓库:
123maven{ url 'https://maven.aliyun.com/repository/public/'}
或者设置为本地搭建的仓库,如:
123maven{ url 'http://192.168.240.21:8081/nexus/content/groups/public/'}
如果每次新建工程 后,都需要手动修改仓库的配置,那么还是比较麻烦。因此,需要修改新建工程时repositories的默认配置。
修改repositories默认配置在Android Studio安装目录下,找到以下子目录:\plugins\android\lib\templates\gr ...
ASM字节码插桩
个人博客
http://www.milovetingting.cn
ASM字节码插桩前言热修复的多Dex加载方案中,对于5.0以下的系统存在CLASS_ISPREVERIFIED的问题,而解决这个问题的一个方案是:通过ASM插桩,在类的构造方法里引入一个其它dex里的类,从而避免被打上CLASS_ISPREVERIFIED标签。热修复可以参考其它资料或者前面写的一篇文章。本文主要介绍ASM插桩,主要参考 https://juejin.im/post/5c6eaa066fb9a049fc042048
ASM框架ASM是一个可以分析和操作字节码的框架,通过它可以动态地修改字节码内容。使用ASM可以实现无埋点统计、性能监控等。
什么是字节码插桩Android编译过程中,往字节码插入自定义的字节码。
插桩时机Android打包要经过:java文件–class文件–dex文件,通过Gradle提供的Transform API,可以在编译成dex文件前,得到class文件,然后通过ASM修改字节码,即字节码插桩。
实现下面通过自定义Gradle插件来处理class文件来实现插桩。
自定义Gr ...
在Android Studio中调试Gradle插件
个人博客
http://www.milovetingting.cn
在Android Studio中调试Gradle插件前言在开发Gradle插件时,经常会需要通过调试来排查问题,如果只使用日志输出来定位的话,效率不高,可以通过单步调试来定位问题。关于调试插件的资料,网上比较多,最终经过实践,参照这一篇文章 https://juejin.im/post/5dc8d947e51d455523170b7f 的方法,实现了插件的调试。在此也记录一下具体步骤。至于Gradle插件的开发,可以参照其它的资料,或者参考上一篇文章。
新增 Run/Debug Configuration通过【Run】-【Edit Configurations】新增Configuration
在打开的界面,单击左上角的+,选择Remote
在编辑界面,复制Command line arguments for remote JVM的配置,选择Use module classpath为需要调试的插件,Name项可以随意。
编辑好后,点击OK保存。
创建Run Configuration在Gradle面板 ...
自定义Gradle插件
个人博客
http://www.milovetingting.cn
自定义Gradle插件自定义Gradle插件可以分三种
定义在具体的Module对应的gradle文件里。这种方式定义的插件只能在定义的Module中使用
定义名为BuildSrc的Module,在BuildSrc里定义。这种方式定义的插件只能在同一个工程中使用。
定义其它名字的Module,在新定义的Module里定义插件。这种方式定义的插件可以给第三方使用。
下面针对这三种方式,以开发一个可以让用户自定义配置的插件为例,分别来展开具体的定义插件过程
定义在Gradle文件里定义在app模块下的gradle文件中,增加定义
12345678910class CustomInnerConfig { String key}//定义extensionextensions.create("customInnerConfig", CustomInnerConfig.class)task("CustomInnerTask", group: ' ...
热修复
个人博客
http://www.milovetingting.cn
热修复前言最近在熟悉Android热修复方面的知识,纸上得来终觉浅,因此写了一个基于dex分包方案的简单Demo。
热修复是什么在热修复技术出现前,对于已经发布的应用,如果遇到BUG,需要再次发布版本,用户需要更新应用版本,才可以解决问题。这种方式,存在新版本覆盖所需要的时间较长、需要全量更新的问题。而基于热修复技术,可以打包出修复的补丁包,推送给客户端或者客户端拉取,可以减少修复BUG所需时间、减少更新包大小。
热修复分类
基于Dex分包的热修复方案原理在Android中,类加载器的结构如下:
加载Dex的流程PathClassLoader与DexClassLoader都可以加载Dex,但最终都是通过他们的父类BaseDexClassLoader的findClass方法加载的
123456789101112131415161718public class PathClassLoader extends BaseDexClassLoader { public PathClassLoade ...
桥接模式
个人博客
http://www.milovetingting.cn
桥接模式模式介绍桥接模式也称为桥梁模式,是结构型设计模式之一。
模式定义将抽象部分与实现部分分离,使它们都可以独立地进行变化。
使用场景
一个系统需要在构件的抽象化角色和具体角色之间增加更多灵活性,避免在两个层次之间建立静态的继承关系,可以通过桥接模式使它们在抽象层建立一个关联关系。
不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统。
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
简单使用定义抽象类
123public abstract class CoffeeAdditives { public abstract String addSomething();}
定义实现类
1234567891011121314151617public class Sugar extends CoffeeAdditives { @Override public String addSomething() { return "加糖"; ...
外观模式
个人博客
http://www.milovetingting.cn
外观模式模式介绍外观模式在开发过程中的运用频率非常高。通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节。外观模式是我们封装API的常用手段。
模式定义要求一个子系统的外部与内部通信必须通过一个统一的对象进行。
使用场景
为一个复杂子系统提供一个简单接口。
当需要构建一个层次结构的子系统,用外观模式定义子系统中每层的入口点。
简单使用定义Phone接口
1234public interface Phone { void dial(); void hangup();}
定义Phono实现类
12345678910111213public class PhoneImpl implements Phone { @Override public void dial() { System.out.println("打电话"); } @Override public void hangup ...
享元模式
个人博客
http://www.milovetingting.cn
享元模式模式介绍享元模式是对象池的一种实现,用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果,以提升性能、避免内存移除等。
模式定义使用共享对象可有效地支持大量的细粒度的对象。
使用场景
系统中存在大量的相似对象
细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
需要缓冲池的场景
简单使用创建接口
12345public interface Ticket { public void showTicketInfo(String bunk);}
实现接口
12345678910111213141516171819public class TrainTicket implements Ticket { private String from; private String to; private int price; public TrainTicket(String fro ...
装饰模式
个人博客
http://www.milovetingting.cn
装饰模式模式介绍装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。
模式定义动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更为灵活。
使用场景需要透明且动态地扩展类的功能时。
简单使用定义Component
12345public abstract class Component { public abstract void operate();}
定义具体的Component
12345678public class ConcreteComponent extends Component { @Override public void operate() { System.out.println("ConcreteComponent operate"); }}
定义Decorator
12345678910111213141 ...