⑴ android无线开发的几种常用技术(阿里巴巴资深
完整的开发一个android移动App需要经过从分解需求、架构设计到开发调试、测试、上线发布等多个阶段,在发布后还会有产品功能上的迭代演进,此外还会面对性能、安全、无线网络质量等多方面的问题。
移动App的产品形态各不相同,有的是内容类,有的是工具类,有的是社交类,所以它们的业务逻辑所偏重的核心技术有些差别,但它们都会用到一些常用的技术方案。今天我们就先来简单介绍一下这些常用技术,以后会专门分专题来详细介绍这些技术的原理和使用场景。
1. Multidex
在Dalvik虚拟机所使用的dex文件格式中,用原生类型short来索引文件中的方法数,也就是最多只能有4个字节65536个method,在打包apk的过程中会把工程所需要的全部class文件都合并压缩到一个dex文件中,也就是说自己开发的代码加上外部引用的库的方法总数不能超过65535。
随着业务逻辑的不断增长,很容易就会超过这个限制,在编译期间就会遇到这样一个错误:
还好google官方给出了一个解决方案Multidex,它会把dex文件拆成两个或多个,第二个dex文件叫classes2.dex,在Application实例化后会从apk中解压出classes2.dex并将其拷贝到应用的目录下,通过反射将其注入到当前的ClassLoader中。但是这个方案非但不能解决一切问题也不能直接拿来用,而要加入自己的一些改造,来解决NoClassDefFoundError、INSTALL_FAILED_DEXOPT等问题,以保证自己的dex被顺利的加载流畅的执行。
2. Plugin
Multidex虽然可以解决方法数的限制,但随着业务逻辑越来越多,apk的大小也变得越来越多,而且有一些功能并非全部用户都想用的,所以会把一些功能模块独立出来做成插件,让用户可以按需下载更新,这样既减小了包大小,又改善了用户体验。
插件类似于windows的dll文件,放在某个特定目录,应用程序主框架会用LoadLibrary加载各dll文件,按插件接口去访问插件。Android的插件技术也是这样,利用一个进程可以运行多个apk的机制,用ClassLoader将宿主apk之外的类加载进来,插件的context可以通过createPackageContext方法创建。因为插件中的activity,service等组件如果没有在AndroidManifest.xml中声明将不能运行,所以需要预先在AndroidManifest.xml中声明一个代理类(ProxyActivity),将这个ProxyActivity传给插件,让插件的activity也有访问资源的能力。
3. Hot Patch
有时一些严重的crash bug或漏洞需要紧急修复,但有些用户不会或不愿意立即升级,而且频繁升级,没有特别的功能更新只是修复bug的升级,对活跃用户是一种伤害。热补丁就可以解决这样的窘境,它是一种可以线上修复的技术方案,有动态改变方法的能力,一般大型的移动应用都会使用热补丁来处理紧急事件。
Hot Patch可以通过hook来修改java的method,注入自己的代码,实现非侵入式的runtime修改,或者采用正向编程,通过工具生成patch文件,通过jni bridge指向补丁文件中的方法。还有就是利用ClassLoader,在dex中查找class时,如果找到类则返回,找不到就从下一个dex文件中继续查找,由此可以想到,在把问题修复后,可以单独生成一个dex,通过反射插入到dexElements数组的最前面,这样就能让dalvik加载补丁里的类了。
4. Push通道
Push是移动App常用的一种无线技术,基础是基于TCP的心跳机制,和客户端维持一个长连接。用处是向客户端推送消息,或者代替客户端定时去从服务器pull的策略,改为客户端接收到push消息后再去pull。
如果每个应用都自己实现push通道的话,cpu就会不定时地经常被唤醒,耗电量达到难以容忍的程度,而且自己搭建push平台的成本也很大,实时性和效率也存在问题,一般都直接使用一些服务商提供的push方案,这些push平台一般都经过了优化设计,在跨平台和网络穿透性、长连接心跳包、多客户端App链路复用、服务和连接保活等技术上做了优化。比如Agoo最初是淘宝无线事业部开发的push服务,在逐渐完善和支撑淘系其他app后,通过服务端容量、通讯协议优化、业务和开放能力的拓展改进后,与友盟等合作,开始向第三方提供推送服务。
5. 应用加固
一款热门的移动app或游戏发布后会受到很多的关注,经常会遇到二次打包的盗版行为,破解者要么修改游戏的资源文件、道具、分值甚至直接把访问的站点指向自己架设的服务器,损害了开发者的利益;要么偷偷植入自己的恶意代码,表面上看起来跟正版的app完全一样,在后台却盗取用户隐私,植入木马;要么通过反向工程学习原app的核心技术,打破技术上的竞争壁垒。
为了防止被破解只通过混淆是远远不够的,即使是在native层混淆也还是会被人熟练的反编译,所以需要一套对apk的保护方案来反调试、防逆向和防篡改。一般的加固方法都是对原apk先进行加密,然后和壳合并生成新的apk。壳是用来解密apk的dex文件。当应用启动时,壳先解密原apk,准备好自己定义的ClassLoader,然后获取源程序中的Application名称,通过反射找到正确的Application对象,运行它的onCreate方法,这样原apk才能被真正运行。其他一些反调试的方法有针对反编译工具,在源程序中加入一些无效的指令或无效的指针,引发反编译工具的崩溃,还有就是加花指令,利用一些跳转,堆栈操作等指令,让破解者无法清楚地理解反汇编后的内容。
6. 其他
除了上述几点外,在服务端还会涉及灰度策略、链路流量优化、动态更新配置、防DNS劫持等技术,在客户端会涉及用户埋点上报、在线监控、进程保活、H5和native混合开发、注入框架等。
⑵ 在Android中实现图片锐化,中值滤波,变为黑白灰度图。在java中可实现,但在Android中一些import 出错。
有可能是两个包有相同的方法,但功能和参数有所不同,要修改的是,你把所有import都删除掉,再重新导包,按Ctrl+Shift+O快捷键,所需要的包就导进去了,如果有两种选择的时候,如果还有重复,那么你可能有两个相同属性和方法的包在项目的Lib里面的,只是版本不同,那么你又把一个删除。再编译就OK了
⑶ 边缘检测,图像模糊,灰度化和图像去雾的基本思路是什么呢 说出是需要改变哪些色彩空间的值。。。
我挨个说一下吧,也算给自己复习一下。
一 边缘检测
方法很多很多啊。
1 常用的是用各种边缘检测算子对图像进行卷积运算,计算出来图像每个部分的梯度值,由于边缘有突变的像素值,所以梯度大的地方很可能是边缘。常见的有 sobel算子等。
2 形态学运算,主要是针对二值化之后的图比较高效,直接先膨胀再腐蚀,然后相减图像就是边缘。
3 canny算法,这个用的很多,我也很喜欢,主要是用到强边缘和弱边缘进行区分。
4 通过识别feature进行识别,在边缘不明显的时候比较有效。
二 图像模糊
这里你要知道一个概念,什么是模糊呢?
咱们近视眼就是一个模糊,这个模糊就是眼睛的成像不能精确的成像在视网膜上吧?
你可以想象一下,其实这就是一个尺度变换的问题,你看一张报纸很清楚,但是从五十米外看你这张报纸(我们假设能看得到),就非常模糊,不能辨认吧?
我这里就引出这个模糊的概念:叫做高斯滤波,高斯滤波其实就是一个尺度变换。
我再打个比方吧,比如一个围棋棋盘,黑线是黑线,棋盘是棋盘,即使黑线很细,你也能分清楚是吧?
但是如果你摘下眼镜看呢?黑线变粗了是吧?黑线变暗了是吧?
其实真正原因是棋盘的信息进入了原本黑线的地方,而黑线也进入了棋盘的地方。
这就是滤波的魅力,可以使像素各个梯度变小,让图像的像素点之间的联系没有那么强烈。。
既然引出高斯滤波,那就有其他的各种滤波,比如拉普拉斯滤波,中值滤波,均值滤波。
实际操作中应用的也都是算子求卷积的方法。
三 灰度化
你看电视的时候应该知道,电视上的一个彩色点,其实是GRB颜色模式,就是绿红蓝三色。
对应这个RGB颜色模式,你可以通过对这三个颜色通道的值进行处理,比如我就定义 V=(R+G+B)/3。那么这个V就包含了三种颜色的信息了吧?
但是一般的我们不直接用三个平均,而是由各个相应的系数相乘得到。
这是RGB颜色模式,但是如果你用到HSV颜色模式,问题就简单多了。
什么是HSV模式呢?你遥控器上可能有 色度 饱和度 亮度按钮吧?
这个就是HSV模式,其中这个V 就是 亮度 value,这个就直接是灰度信息了。
四 图像去雾
我对这个去雾的理解是,图像增强。
也可以叫做是图像锐化,这个过程正好和图像模糊相对应。
模糊是让梯度值变小,锐化就是让梯度变大。
对应的方法也是响应的算子进行滤波了。
而需要注意的是,锐化用的是高通滤波,模糊是低通滤波。
因为边缘信息一般都是频率高的信号。
视频分析系统团队
风之风信子