Android Matrix矩阵详解

Android中有两个比较重要的矩阵,ColorMatrix和Matrix。ColorMatrix用来改变bitmap的颜色和透明度,Matrix用来对bitmap平移、缩放、错切。

ColorMatrix(色彩矩阵)

Android中Bitmap色彩用了一个[R, G, B, A],4*1的矩阵来保存。
image_1al1ljmtjdjfb2f12fb1aku1t6o13.png-3kB

Android插件化探索(四)免安装运行Activity(下)

在上一篇中,我们介绍了两种免安装启动Activity的方法。但是那两种方法都有缺陷,必须在AndroidManifest.xml中注册。那么今天,我们来探索其它几种不需要在清单文件中注册的启动方式

静态代理启动activity

通过前几篇的探索我们知道,通过DexClassLoader可以加载类,通过AsserManager可以加载资源。但是Activity确有一个令人苦恼的问题——生命周期。
我们知道宿主中的Activity都有生命周期,那我们可不可以借助宿主Activity来借尸还魂?

Picasso 源码解读

基本概念

使用说明

Picasso,一个强大的图片下载与缓存库,出自Square公司。基本使用如下:

1
2
3
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);

也可以进行全局配置(只能配置一次)。

1
2
3
4
5
6
7
8
9
10
11
Picasso  picasso=new Picasso.Builder(this)
.addRequestHandler()//自定义请求处理,默认已支持Drawable,Content,File等等
.defaultBitmapConfig()//bitmap配置
.downloader()//下载器,可选okhttp或urlconnection,也可自定义
.executor()//线程池
.indicatorsEnabled()//提示器
.loggingEnabled()//日志
.memoryCache()//自定义内存缓存策略
.requestTransformer()//Request预处理
.listener()//下载失败监听
.build();

Android插件化探索(三)免安装运行Activity(上)

【Android插件化探索(一)类加载器DexClassLoader】
【Android插件化探索(二)资源加载】

前情提要

在上一篇中有一个细节没有提到,那就是getResourcesForApplication和AssetManager的区别。

getResourcesForApplication

getResourcesForApplication(String packageName),很显然需要传入一个包名,换言之,这个插件必须已经被安装在系统内,然后才能通过包名来获取资源。你可能会想,不安装照样可以获取包名啊。的确,通过pm.getPackageArchiveInfo()可以获取安装包信息。但是,这些包都是没有在PMS中注册的。如果仍然这样获取,会提示如下错误。

1
android.content.pm.PackageManager$NameNotFoundException: com.maplejaw.hotplugin

Android插件化探索(二)资源加载

前情提要

在探索资源加载方式之前,我们先来看看上一篇中没细讲的东西。还没看过的建议先看上一篇Android插件化探索(一)类加载器DexClassLoader

PathClassLoader和DexClassLoader的区别

DexClassLoader的源码如下:

1
2
3
4
5
6
7
public class DexClassLoader extends BaseDexClassLoader {
//支持从任何地方的apk/jar/dex中读取
public DexClassLoader(String dexPath, String optimizedDirectory,
String libraryPath, ClassLoader parent)
{

super(dexPath, new File(optimizedDirectory), libraryPath, parent);
}
}

Android插件化探索(一)类加载器DexClassLoader

本文部分内容参考自《Android内核剖析》

基本概念

在Java环境中,有个概念叫做“类加载器”(ClassLoader),其作用是动态装载Class文件。标准的Java SDK中有一个ClassLoader类,借助它可以装载想要的Class文件,每个ClassLoader对象在初始化时必须指定Class文件的路径

没有使用过ClassLoader的读者可能会问:“在过去的程序开发中,当我们需要某个类时,只需使用import关键字包含该类就可以了,为什么还要类加载器呢?”简单的讲,import中所引用的类文件有两个特点:

  • 必须存在于本地,当程序运行时需要该类时,内部类装载器会自动装载该类,这对程序员来讲是透明的,即程序员感知不到这一过程。
  • 编译时必须在现场,否则编译不过会因为找不到引用文件而正常编译。