- 博客(167)
- 资源 (62)
- 收藏
- 关注
原创 Android 一种在Dalvik虚拟机上多Dex加载优化的方案
在Android源码中,DexFile中有一个openDexFile方法,就是通过byte数组加载一个Dex,可以达到秒级加载,亲自测了下,如果一个使用Multidex加载的App,第二个Dex如果需要加载耗时2s+,则使用这个函数去加载,只需要300ms以内即可完成
2016-11-28 18:26:24
7302
原创 一篇胎死腹中的Android文章——Dex文件结构解析
前言国庆的时候,为了理解DexDiff算法,花了几天时间研究了下Dex的文件结构,算是有个整体的把握,这篇文章是在姜维的 《Android逆向之旅—解析编译之后的Dex文件格式》基础上,自己对Dex格式的理解,以防忘记,做一次备忘。在理解Dex文件格式之前,需要了解两个概念:字节序和LEB128格式
2016-10-24 11:52:19
6275
2
原创 Android最佳实践——深入浅出WebSocket协议
WebSocket协议是一种建立在TCP连接基础上的全双工通信的协议。全双工就是指客户端和服务端可以同时进行双向通信,强调同时、双向通信。WebSocket可以应用于即时通信等场景,比如现在直播很火热,直播中的弹幕也可以使用WebSocket去实现。
2016-10-17 22:25:54
36255
3
原创 Android 热补丁技术——资源的热修复
今年真是热补丁框架的洪荒之力爆发的一年,短短时间内,已经出现了好几个热修复的框架了,基本上都是大同小异,这里我就不过多的去评论这些框架。只有自己真正的去经历过,你才会发现其中的坑。事实上,现在出现的大多数热修复的框架,稳定性和兼容性都还达不到要求,包括阿里的Andfix,据同事说,自己的app原本没有多少crash,接入了andfix倒引起了一部分的crash
2016-09-15 08:55:30
24660
5
原创 记一次Docker下安装Logstash+Elasticsearch+Kibana经历
前言最近遇到一个困惑,在kibana上捞自己想要的数据,无奈无法提取一个字段中的kv值。作为一个移动开发人员,对这种东西简直就是日了狗了,请教了下公司推荐组的人,也没有得到结果,还是得自己动手,所谓靠别人不如靠自己。这个数据在kibana上显示的是一个用英文逗号分隔,用等号连接的键值对,假设这个字段显示的是args,其值为:args:key1=value1,key2=value2,key3=valu
2016-08-27 15:20:55
25702
2
原创 Mac OSX Docker下搭建Android+Jenkins+Gitlab
之前写过一篇Mac OSX搭建Jenkins持续集成环境,后来mac从10.11升到了10.11后,Jenkins就不可用了,最近测试一些功能需要再次用到Jenkins,为了杜绝之前发生的问题,这次就用Docker来搭建,记录一下。安装Docker for mac随着Docker的不断迭代,官方已经对Mac有了支持,不再像之前那样,mac下搭建个docker还要装各种东西。首先下载官方的Docker
2016-08-15 21:44:26
7868
原创 在Android中使用Lombok减少编码
Lombok的介绍,可以看官网的一段视频 https://projectlombok.org/。说得简单一点,该框架可以用来精简java代码,提升开发效率,利用注解在编译期生成getter/setter/toString()/hash/equals/construct等等方法。在web中用得比较多,但是在android上估计用得少之又少。个人认为在没有很好的评估该框架的兼容性前,在实际生成项目中最好
2016-08-13 16:24:19
10668
2
原创 Gradle系列之从init.gradle说起
用过maven的开发者都知道,在maven里一些信息可以定义在全局的配置文件中,比如把一些仓库信息定义在用户目录/.m2/setting.xml文件中,这样就不用每个项目都配置这些相同的配置了。对于Andorid开发者来说,使用gradle比使用maven更常见,在开发中说不定你会在每一个项目中配置一遍公司的仓库地址,定义一些相同的配置,那么在gradle中有没有类似maven的这么一个配置文件可以
2016-07-31 18:18:23
29583
原创 Android Classloader热修复技术之百家齐放
大概在2015年10月底,QQ空间发了一篇叫《安卓App热补丁动态修复技术介绍》的文章,文章中提到为了能让Class进行热修复,其中一个条件就是防止类被打上CLASS_ISPREVERIFIED标记,具体的做法便是让一个Dex引用另一个Dex(hack.apk)中的空类(为了让业务无感知,需要在编译时动态注入字节码),并且在应用程序Application类起来的时候要加载这个hack.apk。也就是
2016-07-21 19:24:39
9380
1
原创 Android OkHttp实现HttpDns的最佳实践(非拦截器)
之前写过一篇文章 Android 使用OkHttp支持HttpDNS,该文章中使用的是OkHttp的拦截器来实现HttpDNS。在请求发出去之前,将URL中的域名替换成ip,再往Header中添加Host。这种方式有以下优点。上层方便控制哪些请求使用了HttpDNS,可以做相应的容灾处理,比如ip请求失败时使用域名进行重试。同样的也有很多缺点。Https场景下ip直连出现的证书校验问题代理场
2016-06-20 16:47:23
21346
3
原创 如何脱离Android源码环境编译aapt
由于要修改aapt源码,所以clone了一份android源码,无奈mac的ssd只有256G,所以把源码下到了虚拟机里,这个虚拟机在移动硬盘中,系统是ubuntu的,编译linux和windows版的aapt没有问题,但是需要编译mac的aapt时就遇到了问题,我不可能把ubuntu中的源码整个拷到mac中去编译,加起来有好几十G呢,ssd已经爆了。于是,我需要将aapt的最小依赖环境提取出来。标
2016-06-08 14:15:23
6952
原创 Ubuntu下Android Studio Gradle sync failed peer not authenticated
最近需要用到Ubuntu,不料遇到了一个奇葩问题,尝试了各种方法没有结果,后来在github上找到了解决方法。原因是https导致的,把证书导入进可以了。
2016-05-28 19:18:49
4252
原创 Android热更新之so库的热更新
声明:本篇文章禁止转载,原创地址:http://blog.youkuaiyun.com/sbsujjbcy/article/details/51475499【区长原创】本来想写资源的热修复的,虽然方案差不多已经完成了,但是考虑到一些敏感问题,资源修复就不写了。那就来写写so的热修复,其原理和class的修复是一样的,但是so的热修复的需求并不高,就当做学习吧。首先来总结一下Android的ClassLoade
2016-05-22 16:28:30
14024
2
原创 如何在不影响原有aapt源码的情况下编译定制版aapt
上篇文章Android aapt实现资源分区(补充携程aapt源码)讲了通过修改aapt源码来实现资源的分区。但是我想保留一份原来的源码,而不是通过git去查看历史的版本。这时候,就需要编译自定义的模块。在这之前,需要搭建环境和下载源码,具体可以参考google官方的文章。Establishing a Build EnvironmentDownloading the SourceBuildin
2016-05-15 19:28:59
9000
原创 Android aapt实现资源分区(补充携程aapt源码)
大致内容看这篇文章Android中如何修改编译的资源ID值(默认值是0x7F…可以随意改成0x02~0x7E),但是该文章中修改并不完全,是有问题的,见后文细说。该文章也参考了携程的aapt源码。从该文章中看到修改的地方主要有这么几个地方。 - 加入- -apk-module 参数读取外部packageId值。 - 根据Bundle把packageId传入,并进行传递。 -
2016-05-14 12:16:26
8989
1
原创 Android 从枚举到注解最佳实践
背景前几天看到秋百万的一篇文章Android 中的 Enum 到底占多少内存?该如何用?,其实我对这个东西还是很敏感的,因为最近我就在Android的项目中就用到了一个枚举类。其实不是不知道枚举的坏处,而是枚举具有很好的约束能力,所以才选择了它。但是似乎在Android平台上其约束能力体现出来的优点还不足以抵消它的缺点,恰恰其带来的内存消耗牺牲更大。当然我是知道这一点的,但是我没对具体的数值做过测试
2016-05-01 22:45:56
6154
2
原创 反射还能这么玩?
其实本来想加个前缀,结果标题是《Android 中反射还能这么用?》,后来想想,也不恰当,就把Android去了,本身反射是Java的东西,你硬生生的加个Android显然是不恰当的。 这几天稍微过了一下Weex的源码,可谓是亲眼目睹了它的源码。无意间发现一个类,叫WXHack,搜索一下代码,发现在Weex里用的地方就一处,好奇心驱使下去看了WXHack的源码,好家伙!看完之后总觉得这个类似曾相识
2016-04-29 11:32:18
9935
原创 Mac OSX搭建Jenkins持续集成环境
为什么是用Mac而不是Linux服务器呢?因为自己的linux服务器配置太垃圾了。。。。如果你有linux服务器并且配置还可以,那么就用linux服务器吧,本篇文章以mac为例。至于什么是Jenkins,百度。。。下载Jenkinsjenkins-1.651.1.pkg安装mac正常软件的安装流程几个命令alias ci_start="sudo launchctl load /Library/Lau
2016-04-16 11:56:49
18920
原创 聊聊Android 热修复Nuwa有哪些坑
前面写了两篇关于Nuwa的文章然后我说了Nuwa有坑,有人就问Nuwa到底有哪些坑,这篇文章对自己在Nuwa上走过的坑做一个总结,如果你遇到了其他坑,欢迎留言,我会统一加到文章中去。当然有些也不算是Nuwa的坑,算是ClassLoader这种方式进行热修复暴露出来的问题吧。
2016-03-31 21:51:50
11527
原创 Android 热修复使用Gradle Plugin1.5改造Nuwa插件
从1.5开始,gradle插件包含了一个叫**Transform**的API,这个API允许第三方插件在class文件转为为dex文件前操作编译好的class文件,这个API的目标就是简化class文件的自定义的操作而不用对Task进行处理,并且可以更加灵活地进行操作。我们如何注入一个Transform呢,很简单,实现Transform抽象类中的方法,使用下面的两个方法之一进行注入即可
2016-03-12 10:13:21
19454
2
原创 Android 热修复Nuwa的原理及Gradle插件源码解析
现在,热修复的具体实现方案开源的也有很多,原理也大同小异,本篇文章以Nuwa为例,深入剖析。 Nuwa的github地址 https://github.com/jasonross/Nuwa 以及用于hotpatch生成的gradle插件地址 https://github.com/jasonross/NuwaGradle而Nuwa的具体实现是根据QQ空间的热修复方案来实现的。
2016-03-06 19:09:17
20212
5
原创 如何使用Android Studio开发Gradle插件
缘由首先说明一下为什么会有这篇文章。前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术DynamicAPK,还有希望做最轻巧的插件化框架的Small。这三个App有一个共同的地方就是大量的使用了Gradle这个强大的构建工具,除了携程的框架外,另外两个都发布了独立的Gradle插件提供自动化构建插件,或者生成热修复的补丁。所以学习一下Gradle插件的编
2016-03-03 11:21:01
46879
8
原创 Android JSBridge的原理与实现
在Android中,JSBridge已经不是什么新鲜的事物了,各家的实现方式也略有差异。大多数人都知道WebView存在一个漏洞,见WebView中接口隐患与手机挂马利用,虽然该漏洞已经在Android 4.2上修复了,即使用@JavascriptInterface代替addJavascriptInterface,但是由于兼容性和安全性问题,基本上我们不会再利用Android系统为我们提供的
2016-02-28 09:08:49
44747
30
原创 Android 获取当前网速质量调整网络请求
在开发中,有时候常常需要根据用户当前的网速来做一些操作,比如图片的加载,当网速非常好的时候,比如连接的是wifi,我们就会下载高分辨率的图片,反之,当用户使用的是2g网时,我们则给他下载低分辨率的小图,从而节省用户流量。而Facebook其实已经给我们提供了这么一个库,详见network-connection-class。使用其实超级简单,先加入依赖compile 'com.facebook.net
2016-02-22 13:22:07
16270
2
原创 MVP模式在Android开发中的最佳实践
这篇文章拖了好久了,一直存在草稿箱里没有继续写,趁几天有空,撸撸完。回想一下,你刚刚学习Android的时候,总会看到一些书上写着,Android使用的是MVC模式,Activity就是一个Controller,或许那个时候,你没有什么深刻的体会。随着经验的积累。你发现,Activity既是Controller,掌管着许许多多的业务逻辑,同时它也作为View的一部分,控制着视图层的显示。
2016-02-21 13:47:56
6891
原创 Android 扩展OkHttp支持请求优先级调度
在当今这个App泛滥的时代,网络请求几乎是每一个App必不可少的一部分,请求几乎遍布App的每一个界面中。我们进入A界面后,App发起了一系列请求,这时候假如还有一部分请求没有被执行,我们就进入B界面开始新的网络请求,这时候原来A界面的网络请求我们有两个选择:取消A界面的所有未开始执行的网络请求不取消A界面的所有网络请求,但是B界面的请求要优先于A界面的请求执行,B界面的网络请求执行完毕后再去执行
2016-01-24 19:52:17
6967
1
原创 Android开发中无处不在的设计模式——动态代理模式
继续更新设计模式系列,写这个模式的主要原因是最近看到了动态代理的代码。 先来回顾一下前5个模式: - Android开发中无处不在的设计模式——单例模式 - Android开发中无处不在的设计模式——Builder模式 - Android开发中无处不在的设计模式——观察者模式 - Android开发中无处不在的设计模式——原型模式Android开发中无处不在的设计模式——策略模式
2016-01-21 11:37:17
11318
原创 Android 使用OkHttp支持HttpDNS
首先,需要明确一个概念,什么叫做HttpDNS以及为什么要用HttpDNS。HttpDNS是使用HTTP协议向DNS服务器的80端口进行请求,代替传统的DNS协议向DNS服务器的53端口进行请求。也就是使用Http协议去进行dns解析请求,将服务器返回的解析结果,也就是域名对应的服务器ip获得,直接向该ip发起对应的api服务请求,代替使用域名。那么为什么要使用HttpDNS呢?主要原因有三点
2016-01-17 17:36:51
18450
5
原创 Android 善用Okio简化处理I/O操作
Okio库是一个由square公司开发的,它补充了java.io和java.nio的不足,以便能够更加方便,快速的访问、存储和处理你的数据。而OkHttp的底层也使用该库作为支持。而在开发中,使用该库可以大大给你带来方便。目前,Okio的最新版本是1.6.0,gradle的引用如下compile 'com.squareup.okio:okio:1.6.0'
2016-01-15 14:44:01
35999
原创 Android FastJson与不规范JSON引发的血案
去公司实习了,没多少时间更博客了,距离上一篇博客也有一个来月了。看标题,应该可以看出,这篇文章是讲一个坑,以及如何填坑。 坑是什么?有两个坑,其一是fastjson的bug,其二是不规范的json字符串。如何填坑,不要着急,后文详细说明。首先,我们看一个json字符串
2015-12-27 21:37:56
22221
4
原创 Android RecyclerView瀑布流布局添加Footer实现上拉加载
这篇文章应该是晚到了好几个月,之前想写,但是中途遇到了一些棘手的问题,无奈没有去写。写这篇文章的最初来源是一个朋友问我在Android中如何实现瀑布流布局?,当时我的回答是使用RecyclerView,后来他又问我那怎么实现上拉加载并添加Footer呢?我想都没想就回答他根据type的不同去添加一个Footer,监听滚动事件,当滑动到最后显示footer并回调对应的接口,那么,这个过程就会遇到一个F
2015-11-30 15:10:20
10184
3
原创 Andriod React Native 样式表中可用样式属性
写了这么多篇Android React Native的博文,基本上把复杂的东西都搞定了,接下来来看看一些轻松的东西,和布局有关,就是css样式,那么一个View可以设置哪些css样式呢,是和web中的css样式完全一样呢,还是有所不同呢?其实你只要在样式表中书写一个不存在的样式,就会报一大堆错,提示你该样式不存在,然后提供所有可用的样式给你,如图下面的样式就是样式表中所有可用的属性。"alignIt
2015-11-24 18:58:28
27357
原创 Android React Native使用原生UI组件
Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候我们不得不自己动手封装一下,从而能够使用那些React Native没有为我们封装的原生组件,比如WebView,官方并没有提供Android端的实现,那么我们现在就动手封装一下WebView。
2015-11-23 15:12:03
14003
2
原创 Android React Native加载图片资源的正确姿势
在这篇文章中Android React Native的使用细节问题提到了 图片使用的问题,也提到了无论用哪种方法都不能加载app内部的图片资源的问题,当时的代码是这样子的 <Image source={ require('image!icon') } />在官方文档中也是这么写的Image但是在另一个页文档中却与其相矛盾的,Images,估计这页文档刚加入不久也就是说正确的app内部图片加载姿势应该
2015-11-22 21:12:14
41041
1
原创 Android React Native在Android Studio中执行bundleReleaseJsAndAssets 打包失败的解决方法
这个坑在文章记一次在Windows上搭建React Native Android环境踩过的坑中我已经提到过,当时找不到解决方法,只能开一个命令提示符终端独立执行打包。就像这样子react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output C:\Users\Adminis
2015-11-21 19:17:22
11182
1
原创 Android React Native使用原生模块
有时候我们的App需要访问平台API,并且React Native可能还没有相应的模块包装;或者你需要复用一些Java代码,而不是用Javascript重新实现一遍;又或者你需要实现某些高性能的、多线程的代码,譬如图片处理、数据库、或者各种高级扩展等等。 而用React Native可以在它的基础上编写真正原生的代码,并且可以访问平台所有的能力。如果React Native还不支持某个你需要的
2015-11-20 22:55:06
17733
2
原创 Android React Native自定义组件的流程
假设我们现在有这么一个需求,就是自定义一个组件,该组件由一个小图标和图标的文字说明组成,并且带有背景色,背景色可设置,宽度高度可设置。如下图所示正是两个这样的组件所组成。首先,在index.android.js目录下新建一个js文件,命名为item.js,在里面输入模板代码
2015-11-20 14:56:02
8327
1
原创 Android React Native的使用细节问题
踩了几天React Native Android的坑。总结为一句话,目前android学习react native还为时过早,坑太多,需要你慢慢去踩。就目前来讲,能踩的坑基本上都踩了一遍,所以还是等它稳定下来再去学吧,否则会浪费掉一大堆时间。单位在React Native中,组件的宽度,高度都是不用写单位的,你写个100,在Android中代表的到底是100px还是100dp,就不得而知了,这时候自
2015-11-20 13:26:41
7151
1
原创 Android React Native组件的生命周期
和Android一样,React的组件也有对应的生命周期。Android React Native组件的生命周期可以总的概括为下面这一张图。可以把组件生命周期大致分为三个阶段:第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,在这里完成了组件的加载和初始化;第二阶段:是组件在运行和交互阶段,如图中左下角虚线框,这个阶段组件可以处理用户交互,或者接收事件更新界面;第三阶段:是组件卸载消亡的阶
2015-11-19 13:15:55
5528
1
原创 记一次在Windows上搭建React Native Android环境踩过的坑
要说最近技术圈什么比较活跃,我想除了动态加载框架和热修复技术之外,非Facebook的React Native莫属了吧,其实RN对IOS的支持比较早,但是Android似乎难产了,直到9月份才刚开源。距离RN开源也有一段时间了,一直没有去学习,今天兴趣来潮,索性学一把吧。本文假设你的Windows上安装了Android SDK,并配置好了环境变量。安装Node.js从官网https://nodejs
2015-11-18 23:04:01
15595
1
Android ORM系列之GreenDao关联关系映射
2015-09-01
Android 使用ORMLite打造万能泛型Dao简化数据持久化层
2015-08-27
Android 使用LeakCanary 检测内存泄露
2015-08-26
Android插件化开发之OpenAtlas中四大组件与Application功能的验证
2015-08-24
Android插件化开发之解决Atlas组件在宿主的注册问题
2015-08-21
Android插件化开发之Atlas插件适配
2015-08-20
Android ORM系列之ActiveAndroid
2015-08-20
AXMLPrinter2
2015-08-14
Android SVG动画PathView源码解析与使用教程(API 14)
2015-08-11
Android(Java) 模拟登录知乎并抓取用户信息
2015-08-10
Android新技术学习——阿里巴巴免Root无侵入AOP框架Dexposed
2015-08-07
Android底部Tab页基于ViewPager的实现
2015-07-08
Android应用发布后的统计——百度移动统计的应用
2015-07-05
Android Support Percent Library
2015-07-01
实战EmptyView,为ListView的加载缓冲
2015-06-20
如何使用Android Studio 开发Gradle插件
2016-03-03
如何使用Android Studio开发Gradle插件(一)
2016-03-02
Android JSBridge的原理与实现
2016-02-28
Android 获取当前网速质量调整网络请求
2016-02-22
Android RecyclerView瀑布流布局添加Footer实现上拉加载
2015-11-30
Android 使用OpenCV的三种方式(Android Studio)
2015-11-17
Android 即时音视频解决方案1——腾讯云
2015-09-25
Android 即时音视频解决方案1——环信
2015-09-25
Android IM之基于Openfire+Smack的聊天服务器的搭建与测试
2015-09-25
Android使用Bmob移动后端云Restful API需要注意的问题
2015-09-24
Android Studio使用新的Gradle构建工具配置NDK环境
2015-09-15
Android ORM系列之GreenDao最佳实践
2015-09-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人