自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 HashMap、ArrayMap、SparseArray分析比较

一、原理分析 1、HashMap分析 HashMap是基于hash表非同步map实现,key和value都可以为null。其hash表实现方式是”拉链法”,可理解为链表的数组,如下图所示: HashMap部分源码如下:/** * The hash table. If this hash map contains a mapping for null, it is * not re

2016-08-15 18:19:26 6732 1

原创 SparseArray解析

SparseArray是android V4包中提供的工具类,在某些场景下,可以用来替代Hashmap进行对象的存储,其内部实现了一个矩阵压缩算法,可以进行矩阵压缩,大大减少了存储空间,节约内存。此外它的查找算法是二分法,提高了查找的效率。SparseArray的value可以是任意类型,但key只能是Integer、Long类型。所以在key为Integer、Long的场景下,SparseArr

2016-07-23 02:32:53 1010

原创 插件框架篇之Activity中theme、launchMode等设置问题

问题: 插件中所有Activity都是通过ProxyActivity代理启动,只需要在主工程的manifest.xml中配置ProxyActivity就可以了。 但是manifest中ProxyActivity的配置是应用于所有插件Activity的,所有导致theme、launchMode等配置灵活度不够。 解决方案: 在PluginConfig中继承ProxyAcitivy衍生插件代理X

2016-07-23 02:27:46 464

原创 插件框架篇一之解决系统语言切换插件语言不变的问题

问题: 做国际化的时候,改变系统语言,主工程改变语言,插件只有关闭进程后才会改变。问题分析: PluginLoader工程中->JarResources类->getResourceByCl方法 截取部分代码如下:AssetManager am = (AssetManager) AssetManager.class.newInstance();am.getClass().getMethod("

2016-07-23 02:21:54 650

原创 LayoutInflater源码解析

android.view.LayoutInflater是布局解析的主要类,包括setContentView也是走的LayoutInflater。LayoutInflater解析布局主要入口就是inflate()方法,我们就从inflate(int resource, ViewGroup root, boolean attachToRoot)方法开始分析。inflate(int resource, V

2016-07-23 02:15:11 207

原创 插件框架篇一之scrollbars

问题:部分手机(如三星)ListView或GridView设置scrollbars显示时会报错奔溃。问题分析: ScrollView继承于View,在View的构造器中初始化scrollbars。 根据initializeScrollbars判断是否需要进行scrollbars初始化,并在initializeScrollbars函数进行初始化。/** * <p> * Initia

2016-07-23 02:10:07 1676

原创 插件框架篇一之部分4.0及以下手机(如三星、摩托罗拉)TextView点击/Touch时出错

问题: 部分2.3手机(如三星、摩托罗拉)TextView点击/Touch时,报图片资源not find错误。问题分析: 基于android 4.0源码。 结合”插件框架篇之三星手机插件EditText的textSelectHandle图标报错”篇,分析TextView源码: 在onTouch函数中也调用了textSelectHandle图标。解决方案: 所有TextView或其子

2016-07-23 02:04:15 417

原创 插件框架篇一之LayoutInflater解析layout时android.view、android.widget与WebView错误

问题: LayoutInflater解析插件中layout组件时,统一按android.view.*处理,导致TextView等android.widget组件出错。问题分析: 分析LayoutInflater源码 在createView时传递了android.view参数。 createView中通过ClassLoader反射加载组件类,创建TextView时,传入的name参数是

2016-07-23 02:01:20 438

原创 插件框架篇一之三星手机Dialog样式问题

问题: 三星手机系统插件中的Dialog背景黑色无透明、而且diaolog未居中显示。解决方案: 手动设置Dialog window的LayoutParams和背景。

2016-07-23 01:57:53 391

原创 插件框架篇之三星手机插件EditText的textSelectHandle图标报错

问题: 三星手机中插件EditText获取焦点或长按显示SelectHanlder图标的时候,报资源丢失错误。问题分析: 基于android 4.0源码。 EditText继承于TextView。 分析android.view.TextView源码: public TextView(Context context, AttributeSet attrs, int defStyle)构造函

2016-07-23 01:55:19 718

原创 插件框架篇一之插件so库的加载

问题:插件中的so无法通过System.loadLibrary加载。问题分析: 在System.loadLibrary函数中通过Runtime.getRuntime().loadLibrary(libName, VMStack.getCallingClassLoader())加载so库,其中VMStack.getCallingClassLoader()获取的是加载当前插件类的ClassLoader

2016-07-23 01:51:05 2220

原创 插件框架一之Android5.0非正式版rom插件中new WebView报错

问题:在Android5.0非正式版rom中,插件中new WebView报错。解决方案: 无改rom源码,所以只能通过调试大致推断原因是由于该Android5.0 rom WebView资源单独封装在apk中,在new WebView时加载该资源,但插件定位到插件资源目录下时与webView资源加载器不是同一个,所以导致#20220..无法找到,是accessible_content_view的

2016-07-23 01:49:06 345

原创 插件框架一之三星ContentView报错bug

问题:在三星手机中,插件Activity中setContentView出错,报的是无法找到资源id #7f…解决方案: 问题出在三星手机rom中中setContentView用到的一些资源只能在主工程resources下完成。所以在ProxyActivity中启动插件activity之前先进行setContentView操作,并添加merge布局,在插件中往content的Fragment中添加布

2016-07-23 01:47:20 222

原创 插件框架一之解决插件布局自定义组件无法使用问题

问题: 在插件中的xml布局中的自定义组件无法使用。分析: 1、LayoutInflater.from(Context)创建LayoutInflater时,执行了Context的getSystemService方法。 LayoutInflater: 2、Context的getSystemService方法在Activity, ContextThemeWrapper中实现,在Context

2016-07-23 01:44:28 851

原创 插件框架一之主工程Application中theme使用主工程资源问题

问题:Application中theme自定义style带有主工程资源,影响PrxyActivity的调用。 如果manifest中注册的Activity没有定义theme,就会复用Application中的theme,而PrxyActivity中调用setContentView之前已经把res资源重定向到插件路径下,所以会出现theme中自定义的资源无法调用问题。解决方案: manifest中

2016-07-23 01:36:50 399

原创 插件框架一之ContentProvider和BroadcastReceiver

问题:由于插件是以单独apk形式存在的,所以插件中需要静态注册的ContentProvider和BroadcastReceiver无法生效。解决方案: 1、ContentProvider 主要用于数据库的创建,需要在manifest中注册,但是ContentProvider中数据的创建和ContentResolver对数据库的增删改查操作是相对分开的。所以,可以将ContentProvider的

2016-07-23 01:35:34 499

原创 插件框架篇一之Activity和Service

问题:插件是单独以apk形式存在,其中的Activity和Service均无法在manifest中静态注册,所以无法直接调起。解决方案: 采用代理Activity,通过代理Activity的生命周期来管理插件Activity的生命周期。步骤: 1、在主工程中创建代理Activity,取名为ProxyActivity,并在主工程的manifest中进行注册。 2、在ProxyActivity中通

2016-07-23 01:34:30 197

原创 插件框架篇一之jar插件加载方式

随着项目的不断扩大,遇到问题如下: 1、代码也将变得臃肿,而且每次应用更新都需要下载很大的应用包; 2、多项目之间模块重用; 3、项目管理复杂度增加; 4、每次修改模块bug都需要提交应用商店审核。 为了解决以上问题,接下来将分别研究jar插件(dex)和apk插件两种框架。 本文主要介绍jar插件的两种加载方式:静态加载和动态加载。 准备工作如下: 1、win7 64位环境下;

2016-07-23 01:31:34 1396

原创 插件框架篇一之jar和apk打包

(最后附Fat jar介绍) 环境:Win7 64bit+Eclipse 将工程资源文件进行插件化打包时,遇到问题点: 1、export->JAR file无法编译libs中的jar文件到dex文件; 2、export->Fat jar打包的资源文件无法通过AssetManager进行访问; 3、以上两种方式均可进行选择性打包,apk打包无法过滤文件解决方案: 一、针对问题1,可通过问题

2016-07-23 01:18:53 1010

原创 插件框架篇一之问题解决汇总

在搭建插件框架的过程遇到并解决了很多问题,先将遇到的主要问题汇总如下: 一、已解决问题 1、插件包采用什么样的格式。(见笔记:插件框架篇一之jar和apk打包) 2、如何动态加载插件包和调用插件类。(见笔记:插件框架篇一之jar插件加载方式) 3、如何解决资源调用问题。 4、如何解决四大组件之Activity和Service无法静态注册问题。(插件框架篇一之Activity和Service

2016-07-23 01:08:40 376

原创 插件框架PluginLoader

2014年9月,公司项目过于臃肿,而且遇到65536方法数超限问题。计划准备拆分模块,并通过插件方式进行在线更新。当时我花了一个月时间,开发这个插件框架,并把搜索、聊天室、游戏等模块打成插件形成,期间项目经历了大大小小十几个版本迭代,插件框架也一直稳定运行到现在。该插件主要原理是动态代理。插件主要开发时间是在2014年9月到10月,后续只是修复一些bug,主要精力集中在了业务开发上了。

2016-07-23 00:57:02 620

开启博客之旅

由于自身比较内向,之前一直热衷于做私人笔记,但这几年的工作越发让我明白,与人沟通、相互交流是非常重要的。软件技术飞速发展,自己想要跟上时代的步伐,就要不断了解新动向,学习新技术。准备把有道笔记的文章移到CSDN,开始新的博客之旅。一起进步,与君共勉!

2016-07-23 00:15:26 69

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除