插件化方案对比

0x00 前言

市面上的插件化,已经百花齐放,趋于完善。
主流的开源框架主要的代表有 Alibaba 的 Atlas , 360 的 Replugin 和 DIDI 的 VirtualAPK 。
实现插件化的技术难点

  • 代码的加载:
  • 资源的加载
  • 四大组件动态加载
  • 配套的打包插件.

输出 Apk 所有的依赖

一 作用

因为 Gradle 的依赖发生冲突的时候, 会解决冲突, 默认是使用最高的版本, 但是也会因为 force 字段的关系选择较低的版本, 我们往往需要知道打到APK里面依赖的具体版本.

Gradle Transform 初探

环境: gradle 4.1

0x00 背景

去年的时候写个 Android Plugin Transform 初探 . 现在我们接着之前的脚步来学习 Gradle 下的 Transform . 同时熟悉一下 Android Plugin 在该规则下的应用.

0x01 历史

Android Plugin 是在1.5.0-beta1 版本加入的. 1.5.0 的 Release 是在2015 年的 11 月.
Gradle 的 Transform api 是在 3.5 版本引入的. 3.5.0 的 Release 是在 2017 年的 4 月.
相似的命名, 相似的功能,

Android 脚本自动化 SDK 原理 • View Hierarchy 的获取

View Hierarchy

背景

在脚本录制回放过程中, 我们需要获取 View Hierarchy 的意图有三个.

  • 将 View Hierarchy 结合 App 截图 发送给前端. 前端用这两个做可视化显示.
  • 在录制中.需要获取 View Hierarchy 遍历控件, 对控件进行监听.
  • 在回放中. 需要根据 View Hierarchy 找到 回放操作 对应的控件.

小技巧︰ 动态代理 巧用

一 背景

android 的中设置监听有两种.

  • 一种 setOnXXListener (eg View.setOncClickListener()) .
  • 一种 addOnXXXListener (TextView.addTextWatchListener());
    两种的区别是第一种内部只会保存一个listener, 每次调用就是覆盖.
    第二种内部会保存一个List, 每次调用的时候就是添加一个监听器.

借助微信 构建 Android Project 编译通知

一 背景

最近萌生一个想法, 在项目编译成功的时候给自己发送一条微信.

效果图.png

二 原理

我们需要跟微信进行交互 , 为了达到这个效果 . 我们在 微信 App 内开启一个 Http 服务. 当项目编译完成以后发起一个 Http 请求. Http 服务响应这个请求. 将获取的数据转发发送给自己 .

AspectJ 在Android 上的应用和加速

原文地址

开头

java上的AOP 框架比较出名的是AspectJ,比较可惜的是这个框架是在gradle上需要一些变换才能使用。
在使用这个框架之前,我们来看AspectJ 命令的几个比较重要的参数:
-classpath:class和source 的位置
-aspectpath: 定义了切面规则的class
-d:指定输出的目录
-outjar:指定输出的jar上
-inpath:需要处理的.class
classpath 的作用是在当解析一个类的时候,当这个类是不在inpath 中,会从classpath 中寻找。
在使用AspectJ的时候, 我们用以下几个方面来优化我们的速度。

Android Plugin Transform 初探

环境: android gradle 2.3

transform api

一 概况

transform 开始于1.5.0-beta1 可以用于在android 打包,class转换成dex 过程中,加入开发者自定义的处理逻辑. 他也可以处理native.只是native 这里处理的是so 文件的,再加工难度比较大.

二 定义

ContentType:
CLASSES,
RESOURCES,
DEX,
NATIVE_LIBS,
CLASSES_ENHANCED,
JACK
ContentType表示文件的类型. CLASSES 这个是javac 编译成class文件
RESOURCES: 这里的resources 单指Java 的资源.
DEX 这个是class 文件dx 编译成的dex 文件.
比较可惜的是自定义的 transform 无法处理这些文件. 具体原因看后面.
Scope:
PROJECT(0x01),
PROJECT_LOCAL_DEPS(0x02),
SUB_PROJECTS(0x04),
SUB_PROJECTS_LOCAL_DEPS(0x08),
EXTERNAL_LIBRARIES(0x10),
TESTED_CODE(0x20),
PROVIDED_ONLY(0x40)