扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Android以Linux操作系统内核为基础,实现硬件设备驱动、进程和内存管理、网络协议栈、电源管理等核心系统功能。除此以外,Android还增加了一些面向移动设备的特有功能,如低内存管理LMK(Low Memory Killer)、匿名共享内存(Ashmem: Anonymous Shared Memory),以及进程间通信Binder机制。这些功能的增强进一步提升了Android在内存管理、进程间通信等方面的安全性。
公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出榆树免费做网站回馈大家。
Android之前的版本并不存在硬件抽象层。鉴于硬件厂商并不希望公开其设备驱动的源代码,Google对此将Linux内核驱动程序进行封装,屏蔽掉底层的实现细节,向上提供统一的接口,这就是硬件抽象层。

HAL(Hardware Abstraction Layer)规定了一套应用层对硬件层的读写和配置的统一接口,本质上是将硬件的驱动分为用户空间和内核空间,其中内核驱动程序运行在内核空间,HAL运行在用户空间。上图中的Stub,以so库的形式存在,可以理解为proxy。上层通过调用标识获得HAL的相关Stub,进而取得相应操作。
系统运行时库由系统类库和Android运行时构成。系统类库基本上用C/C++编写,基本功能说明如下:

当然,还有Android NDK(Native Development Kit),使得应用程序可以不依赖Dalvik虚拟机进行开发。Android运行时核心库提供android.os, android.net, android.media等核心API,而Dalvik虚拟机依赖Linux内核,实现进程隔离与线程调度管理、安全与异常管理、垃圾回收等功能,并被改进以适应低内存、低处理器速度的移动设备环境。
再往上就是应用程序框架层了。一系列的Android应用程序所需的类库,使得开发人员可以快速地进行程序开发,也可以通过继承实现个性化的扩展。如Activity Manager负责主线程ActivityThread的创建、Activity生命周期的维护,并为窗口提供交互的接口。
应用层就是与用户直接交互的应用程序,如SMS短信、图片浏览器、地图以及开发人员所开发的应用程序。
广播作为Android 四大组件有非常广泛的用途。广播可以用作进程间通信,也会用作进程内部某些组件内消息的传递。
这就会有个问题,如果想让发送的广播只有我自己能收到,不想被别人劫持到,来获取到广播中的敏感信息。
另外其他人如果发送相同Action的广播来伪造真正的广播,就会欺骗我的receiver.
如何安全高效的实现进程内部的广播发送呢?
有人说可以使用给广播加权限啊,你可以在Intent中指定PackageName 啊,后面的文章详解,先简单看下:
当然这都是书上告诉我们的方式,但是我感觉还不够简单。当然经过一番配置你可以实现了。
好了,现在安全解决了,那高效呢?
我们翻看context.sendBroadcast源码,看到发送广播的流程真的是相当的复杂啊。曾经天真年少的我竟然幻想一天弄懂广播的整个过程,但当我看到sendBroadcast方法的行数时我脸上是大写的崩溃。暂且不谈广播队列的分发规则和过程。这中间是存在的两次binder call就让这个过程变的不是那么高效。
首先你sendBroadcast会把广播信息告诉System_server (第一次Binder call),然后system_server经过一番查看找到你要的receivers,然后进入分发队列等待分发(过程很复杂),然后调用APP进程receiver的onReceiver()方法(第二次Binder call).大兄弟,我明明只想在我的进程内部发送一个广播在进程内部接收,为啥还要通过system_server呢。就算你长得帅,你有Free style,可是你很忙啊,找你的人那么多。自己的事情自己做,这是小学了老师经常教导我们的。看来Google的程序员一直没有忘记小学老师的教诲:
看,迈着整齐步伐雄赳赳气昂昂向我们走来的是LocalBroadcast:
先来看官方说明:
意思就是这个很牛逼,和全局广播相比有很多数不清的优势。(看来实现这个的哥们和实现全局广播的哥们关系不大好,竟然用这个词语: has a number of advantages) 。
我们下面来看下LocalBroadcastManager的源码:
1.先来看下LocalBroadcastManager的构造,是使用标准的单例模式实现的。
APP开发者拿到mInstance之后就可以调用registerReceiver、unregisterReceiver、sendBroadcast。
看到构造函数中没有做复杂的操作,在主线程初始化了一个Handler.
可以猜测到这个Handler正是用于对广播的分发。
2.广播的注册、反注册、发送流程
如果让我们来自己来实现广播的注册、反注册、发送我们会怎么搞呢?
首先,注册的时候需要提供BroadcastReceiver和对应的IntentFilter,我们可以对这种数据结构进行封装,放到一个类中ReceiverRecord。
然后维护一个ReceiverRecord对象列表,用于记录当前注册了哪些BroadcastReceiver。可以简单使用ArrayListReceiverRecord.
在unRegister的时候根据提供的BroadcastReceiver对象,遍历List找出对应的receiver进行移除。
这样每来一个unRegister我们都需要对Receiver列表做一次遍历,开销有点大,在查操作比较多的时候我们可以使用MAP。
HashMapBroadCastReceiver, ReceiverRecord
ReceiverRecord中已经包含BroadcastReceiver对象了,所以value直接使用IntentFilte就行了,简化数据结构。
那如果一个Receiver注册了多个IntentFilter呢?比如说一个receiver对象注册两次传入不同的IntentFilter.所以Value需要改造为ArrayListIntentFilter。 最终用于维护当前Reciver对象列表的数据结构是这样事儿的:
HashMapBroadcastReceiver, ArrayListIntentFilter mReceivers .
当删除时可以通过receiver对象为key在map中快速查找并移除。
发送广播的时候呢?我们知道sendBroadcast时只传入了Intent对象,Intent携带了Action用于和已经注册的receiver匹配。在查找receiver时,需要对 HashMapBroadcastReceiver, ArrayListIntentFilter mReceivers 的Value进行遍历,每一个Value ArrayListIntentFilter 又需要遍历一次。这个查找的开销实在太大了。
看来我们为了实现Action和receiver的快速匹配需要再维护一个数据结构了。同样是频繁查找的需求使用HashMap.
将Action作为Key,value肯定是与之匹配的receiver了。因为一个Action可能会对应多个receiver,receiver注册的时候可以使用相同的Action.所以value需要使用ArrayListBroadcastReceiver. 当发送广播时可以快速根据Action找到对应的receiver。对了,不仅仅要使用Action匹配,filter中还有其他信息匹配成功之后才能确认是真正的receiver.所以需要使用ReceiverRecord作为value,因为不仅包含了receiver对象,同时包含了IntentFilter.所以最终的数据结构是 HashMapString,ArrayListReceiverRecord.
我们来看Google是怎么实现的呢?
先来看两个内部类:
再来看几个成员变量:
广播的发送过程
广播的反注册过程
可以看到最终把要发送的广播加入队列mPendingBroadcasts,然后使用Handler发送消息给主线程处理的,调用executePendingBroadcasts()进行分发。
LocalBroadcast也支持使用同步的方式进行分发:
1.LocalBroadcast是APP内部维护的一套广播机制,有很高的安全性和高效性。
所以如果有APP内部发送、接收广播的需要应该使用LocalBroadcast。
2.Receiver只允许动态注册,不允许在Manifest中注册。
3.LocalBroadcastManager所发送的广播action,只能与注册到LocalBroadcastManager中BroadcastReceiver产生互动。
也不知到当初是那条筋搭错了,将证书的时间弄得这么短,在这里强烈的提醒一下各位,在生成证书的时候一定要注意一下时间,一般将时间设在25年以上就可以了(上架到google play是必须在25年以上的)。现在证书过期了,那么没办法,只能换了,直接替换证书会有一个问题就是需要将之前的旧证书的app卸载之后才能重装。这就问题大了。这样用户的数据不就没了吗?看来还是得找别的方案。
用过Android studio的打包就会知道,在签名那块是有V1和V2两种的,勾选就可以了,使用 gradlew 命令去打包的也可以在 build.gradle(app) 中设置的:
V2,解决了V1不安全的问题。V3要解决的问题就是让不同证书之间可以平滑过渡。(但是V3签名方式是有限制的,下面再说)
看了一下官方,发现签名方式有V3了(悄悄地告诉你,还有V4了)。于是就看了一下,大致的签名方式是这样的:
首先,你得准备一些文件:
old_project.jks (旧的证书,在我这就是我那过期的证书)
new_project.jks (新的)
old.apk(一个使用旧证书打包的apk,没有证书的也行)
apksigner(用于apk签名的工具,请使用29.0.2以上的,这个是在sdk中build-tools文件夹下找到的)
第二步:这一步称之为轮替,也叫沿袭,生成 lineage ,通过下面这条命令就可以了:
这样就会在当前文件夹下新生成一个名为“lineage”的文件。(这个文件很重要),这一步是必须旧证书在前,新证书在后,这样才是一个正确的轮替。(虽然换过来也是成功的)
第三步:使用上面所有的东西(包括生成的lineage)作V3签名:
这样就完成了,你可以通过命令去检查一下是否已经是启用了V3
可以看到V3的那一行已经是true了。
真正研究过之后发现,V3签名,很是鸡肋:
首先,V3是android 9.0开始支持的。也就是说如果你的手机是Android9.0之前的,都不能覆盖安装,第二,由于证书过期了,那么就是说无法上架到应用宝(可能有些应用市场是能上的,但是大多数应用市场是上不了的),那么使用V3签名方式打包之后的apk,由于打包过程使用了个密钥库(也就是两个 .jks 文件),你猜猜apk的签名是谁的呢?使用 keytool -list -printcert -jarfile 命令查看了一下,是旧的!!!(也就是轮替的时候放在前的证书)。所以依旧是上架失败的!!!白忙活了。除非应用市场将其检验方式换成V3的应该就可以了,可是并非所有版本的Android系统都可以直接覆盖安装,所以就算是安全上架了,系统版本低的还是要卸载才能安装。可能应用市场也是基于这个考虑吧。
如果需要更详细的了解V3签名方案,可以查看官方文档 Apk签名方案V3
更加详细的签名操作可以看这里 apksigner
希望大家在开始项目的时候一定要检查一下使用的证书是不是有问题。如果有,赶紧重新弄一个!!!!!
在先后经历了七个版本(DP1~4,Beta1~3)的测试后,Android 11终于在2020年9月9日正式上线了第一个稳定版。或许是因为此前在发布测试版时,谷歌方面已经召开过了规模不小的线上发布会,因此最终正式版反而是选择了相当“低调”的上线方式。
当然,如果你是一位谷歌Pixel系列机型的用户,那么这种低调的正式版发布方式其实并不会有太大的影响,毕竟就在今天的凌晨,全球的Pixel用户就已经收到了包含详细功能说明的系统推送。而在我们三易生活撰写这篇文章的时候,这部分用户可能早就已经玩上新系统好几个小时了。
但是“谷歌亲儿子”在当今Android手机的阵营中,毕竟只占很小的一部分,因此对于绝大多数的智能手机用户来说,正式版Android 11说到底还是一个有点遥远的概念。甚至可能相当一部分用户都要靠未来购买新机才有可能真正用上新版Android系统。正因为如此,提前熟悉一下新系统的界面与功能,自然也就变得很有必要了。
通知栏大变样,聊天软件获得“特权”地位
众所周知,如今智能手机的APP出于各种目的,普遍都非常喜欢给用户推送通知。体现在用户感受上,往往就是一会不看手机,系统的通知栏,信息就已经多到了甚至能滚动好几页的地步。
有鉴于此,在Android 10时代谷歌首次对通知栏信息进行了优先级的划分。通过提供“无声通知”功能,Android 10允许用户自行屏蔽不想要看到的通知信息,同时也不会触发相应APP的通知检测功能(也就是软件不会发现自己被屏蔽)。而这一功能到了国内的深度定制系统上,更是被发展为便利的通知自动折叠功能,AI会自动判断哪些应用的通知“不重要”,从而有效减少通知栏的杂乱现象。
但是从用户体验的角度上来说,一味地“精简”通知栏实际上也会造成不便。比如对于那些流行的社交软件而言,如果它们的通知被折叠、被隐藏,或者延迟显示的话,那后果可能就不仅仅是简单的“不方便”了。
正因如此,在Android 11上,谷歌对于通知栏的策略进行了一些“纠偏”式的修改。其中最显著的改动,就是专门针对短信以及社交软件增加了两个全新的通知样式,“优先对话(Priority conversations)”和“对话气泡(Bubbles)”。
所谓优先对话,简单来说就是在通知栏上为短信和社交软件开辟了一块“专用区域”,所有的社交信息都会在这块区域集中显示,并位于其他大多数APP通知信息的上方。如此一来,社交软件的对话信息就会更为显眼,更不容易错过,也不会被系统“折叠”了。
不仅如此,Android 11甚至还原生支持了专供聊天软件使用的“气泡通知”效果。当有新信息到来时,屏幕边上就会显示气泡通知,点按即可弹出一个悬浮式的聊天窗口,从而实现无需退出当前APP,直接回复聊天内容的便捷功能。
媒体控制功能增强,蓝牙耳机和智能音箱受益
可只要是用过蓝牙耳机的用户就知道,在此前的Android版本上,虽然系统本身对于各大蓝牙协议的支持非常全面,但是在一个很常用的细节上,过往的Android系统表现得却堪称糟糕。这,就是多个音频输出设备之间的快速切换功能。
试想一下,当我们正戴着蓝牙耳机的时候,突然有事需要启用手机的外放扬声器,亦或是当手机正同时连接到蓝牙耳机、智能手表,以及智能音箱等多个设备的情况下,需要在不同的设备间迅速切换输出。此时,有些手机会通过一根独立的音频管理程序,在通知栏的最下方提供一个切换的快捷按钮,但大部分没有考虑到这一点的机型,就只能进入“设置”菜单,然后再点进蓝牙设备列表,进行手动切换。
很显然,这非常的不方便,因此它也很自然的成为了谷歌在开发新系统时必须要解决的问题之一。在Android 11上,用户现在就可以直接在通知栏的媒体控制卡片里看到当前所使用的输出设备(扬声器、耳机,或是蓝牙音箱等等),只需轻轻点一下就能进行切换了。
很显然,这比过去的体验可方便多了,只不过它也确实来得太慢了一些,而且怎么看都很像是谷歌从隔壁的iOS系统上汲取了“灵感”。当然从另一个角度上来说,提供更为便利的音频输出切换功能,实际上也可以看作是谷歌方面认可了蓝牙耳机和智能音箱等无线音频输出设备的重要性。从此手机厂商或许就更有理由,不再保留3.5mm有线耳机孔了。
更严格的权限控制,让流氓软件无处可藏
很久很久以前,当玩家朋友说起“原生安卓”时,他们通常会感叹这套系统那极简和无广告的系统界面,但同时也对其糟糕的权限控制功能扼腕叹息。可以说正是由于早期的Android系统无法有效限制大量流氓软件的自启动和后台行为,这才让各类“深度定制”系统迅速赢得了消费者的欢迎。
好在自从Android 6.0之后,谷歌就一直在加强原生Android的权限控制功能。从最初在系统中加入权限管理器,到后来一步步收紧系统权限本身,在经历了多次改进后,如今的Android 11正有望成为史上最安全,“对流氓软件最不友好”的移动操作系统。
谷歌做了什么?首先,如果大家平时有留意一些软件在请求系统权限时弹出的选项,就会知道在以往的Android版本里,用户的选择基本上可以概括为三类,即“始终允许”、“仅在该软件运行时允许”,和“不允许”。其中最危险的是“始终允许”,因为这意味着流氓软件哪怕是在后台偷偷自启时也能获取到敏感的系统权限,显然是很不安全的。
因此在Android 11里,谷歌彻底取消了“始终允许”这一选项。新的权限选择选项被更改为了“只允许一次”、“只在运行时允许”和“不允许”。如此一来,那些喜欢后台自启动,偷偷驻留后台的软件,如今便不再能够背着用户去偷拍、偷听、偷看联系人信息了。
不仅如此,考虑到可能有许多用户并不理解权限管理功能对于保护个人隐私的重要性,谷歌这次还引入了一个新的“权限重置”机制。它指的是当一个软件在一段时间里未被打开时,它原本已经申请过的系统关键权限就会被收回。而当用户再点开这一软件时,系统会重新提示软件的权限申请信息,要求用户重新手动开启某些权限。
这样做有什么好处?一方面来说,它相当于更频繁的提醒用户“您现在使用的APP有这样这样这样一些敏感权限,可能侵害您的个人隐私”,从而大幅增加了用户主动限制应用权限的可能性,让流氓软件无法再只靠第一次启动时申请的权限,就一直“作恶”下去;另一方面来说,这种机制本身实际上也可以用于发现流氓软件,试想一下,如果在Android 11上某个你时隔许久都没有使用的APP,再次点开时却没有重新弹出权限申请信息,那么这可能就只意味着一件事,那就是它平时就经常偷偷自启。
更快的更新速度,让这届Android更有盼头
最后,我们不得不提一下此次Android 11的更新情况。虽然从整体上来看,Android如今每一次新的大版本发布之后的更新普及速度距离苹果的iOS系统还差得很远,但不可否认的是,随着越来越多的手机厂商积极且深入的参与到Android的共同开发与测试工作,我们也可以看到大量的第三方品牌Android机型在系统更新方面表现得越来越好。
比如说就在今天早上,除了谷歌自家的Pixel系列机型获得官方的Android 11正式版系统推送之外,包括一加、小米、OPPO和realme在内的多个国内品牌也“不约而同”的推出了新版固件。虽然它们之中的大多数名义上还标注着“测试版”,但实际上在这些系统的底层,都已经是全部用上了最新的正式版Android 11。
这意味着什么?首先我们完全有理由期待,以上的这些国内手机品牌将有望在很短的时间里推出他们基于Android 11的“正式版”系统更新。对于消费者而言,这很显然是一件令人兴奋的好事。
其次,从目前外媒对于Android 11的相关报道来看,除了以上的四家国内手机品牌,我们似乎并没有发现其他厂商做到了“第一时间提供系统更新”。哪怕这几家品牌目前基于Android 11正式版代码的系统,还多半都打着“测试版”的旗号,但它至少也已经给我们传达了两个很关键的信息。
一是中国手机企业目前已经积极的参与到了Android系统的早期开发与测试工作,二是中国品牌的智能手机如今已经相当重视“系统更新”对于提升用户体验的作用。很显然,无论是从行业地位的层面、还是从消费者利益的层面上来说,这个事实都值得我们为之而欢呼。
java.net.UnknownServiceException : CLEARTEXT communication to not permitted by network security policy
的经历
Android P请求HTTP网络报错:
注:此问题发生在 API=27 的新项目工程
在Android P的手机上 AndroidTargetSdkVersion 设置为28或以上并且使用了HTTP 请求.
解决方法:
解决
俄亥俄州立大学带领的一支研究团队,刚刚在新研究中发现:
成千上万款 Android 应用程序,似乎都包含着不可告人的隐藏后门 —— 表明恶意开发者仍在继续将 Google Play 商店作为攻击目标。
本次研究调查了 15 万款应用程序,其中 2/3 来自谷歌官方的应用商店,另外一些则来自三星、百度等第三方应用商店。
【来自:ohio-state.edu】
来自俄亥俄州立大学、纽约大学、以及亥姆霍兹信息安全中心的研究人员,对 15 万款 Android 应用程序展开了细致且深入的调查。
研究人员指出,在 15 万个 App 中,几乎有 1.3 万个存在后门行为(比如秘密访问密钥和主密码)。
今年早些时候,数十个隐私倡导组织致信谷歌 CEO 桑达尔·皮查伊,以期减少预装在设备上的过时软件。
最后,新研究随机选择了 30 款至少具有百万安装量的应用,发现其中有一款竟然允许远程登录。
遗憾的是,Google Play 商店一直受到此类问题的困扰,且谷歌安全团队经常只能被动地等待威胁公开后,才立即对恶意软件采取行动。
只能说,比网上乱下载的要安全
但是!并不代表绝对安全!!
举一个我最近遇到的事例
前几天安装了一个软件,是从手机自带的应用商店下载的。
安装的当天我并 没有 感觉到什么 异常 ,安全管家 没有报毒 ,软件运行也很流畅, 功能 也 正常运行 。
但是第二天,我的手机就开始收到大量的 垃圾短信垃圾电话 (当天的骚扰拦截甚至达到了三位数!)
我意识到事情不对劲,赶紧 删掉 了 软件 ,向运营商 申请 了 屏蔽信息和电话 ,才得到解决。
那么我们回头来看看这个软件
提取安装包,检查每一项可执行资源,很快就找到了问题所在
assets文件夹里,套用了一个jar压缩文件。
众所周知,assets文件夹里的所有文件都可以在软件调用时直接被修改后缀 (哪怕是从文本类型更改为视频类型)
而这个文件打开之后是另一个软件
一个软件套用另一个软件的操作很常见,关键取决于套用的软件用途是什么
而这个软件,是用来 更改地区设置 的 (甚至仅提供大陆以外地区的)
那么开发者用这个干了什么?
答案是:用来 登录菠菜网站
我们回头来看主体软件,拆分其dex
在其变量命名等过程中,进行了包括 登录网站,后台读取QQ、微信、微博等操作,甚至禁用了360等杀毒软件的安装
至于登录网站以后进行了什么操作,我们不得而知,但可以肯定的一点是:我的手机号就是从这里被传播的
被登录网站
随后,我将情况反馈给了服务商,并发表了这条评论
综上,应用商店下载的软件安全性也不能得到完全的保证
但至少,不会存在锁机等大型恶意病毒
所以,请禁止软件申请不必要的权限,不要安装来路不明的软件
从安卓应用商店的很多软件评价来看,状况不是很好,那些下载量500万+的应用软件,也可能就是个坑。根本不好用,甚至不能用。还是要靠自己火眼金睛来甄别好的应用和骗人的应用。
另外提一个小问题,有些安卓应用如手机百度8.1版本,甚至强制要求定位权限,否则无法使用。存在一个过分要求权限的问题。
自从手机进入智能时代,病毒和流氓软件就成为了人们预防的主要对象。
Android系统出现后,市场占有率达到了85%之多。且由于其开源以及碎片化的特性,成为了流氓软件的众矢之的。幸运的是,Android将安全作为手机的第一优先级,并使用了沙盒机制和权限控制来限制应用,来预防潜在的流氓行为。但尽管如此,市面上还是存在着大量的流氓软件和病毒
使用官方市场,最简单的法则就是使用Android官方的应用商店—Google Play Store。这里是最接近“0”流氓软件的地方,要注意这里我用的词语是“接近”,因为每天有成千上万个应用被上传到应用市场,而审核机制并不能确保完全过滤掉流氓软件。
国内的大部分手机由于没有Google服务包,也就缺少了Google的官方应用商店,但我们就因此不能避免感染流氓软件了吗?并不是。幸运的是,在 Android设备中,应用程序并不被限制在唯一一个应用商店中发行,一些类似亚马逊Appstore的第三方应用商店也有权限发行应用软件,并且安全性不亚于Google Play Store。
需要注意的是,国内第三方应用商店种类繁多,某些商店中可能会包含一些来源不明的应用,我们要避免使用这些商店中的应用软件。
避免使用未知来源的应用程序
Android的“设置--安全”中,有一个选项叫做“未知来源——允许安装来自Play商店之外的其它来源的应用”。这个选项默认是关闭的,我不建议开启。不知道大家有没有遇到过类似情况,打开某些网站后,会弹出后台下载窗口自动下载应用程序,下载完毕后还会弹出安装窗口。
这样的应用安装包不一定通过正规应用商店的审核,安装后轻则可能会泄露个人信息,重则被盗取银行账户资料,或导致数据丢失和损坏。而“未知来源”这个设置如果被关闭,那么这样的应用就无法被安装到手机当中,也就阻挡了不明应用所带来的伤害。
Android应用商店的软件里边什么样的软件也有,安全性不好说,我都是通过360手机助手来下载安装软件的。
挺好的,不用关心,自动更新
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流