360面试总结(Android)

360面试心得(Android)

这次360面试,总共面试了两轮,都是视频面试。

时间:2016-08-23

转载请注明原博客地址:

闲谈:

从大二暑假的时候开始,一直想进腾讯或者阿里,在招实习生的时候,最终遗憾落选。暑假的时候为了好好准备校招,我放弃了去步步高实习的机会,继续在原来的一家公司实习。在暑假的时候找师兄师姐内推了腾讯,阿里,最终都没有通过简历筛选,没有面试。说实话,刚开始内心是挺失落的,挺难受的,但经过一两天的调整,我也意识到自己的错误,以前那种强烈想进bat的欲望渐渐淡了下来,当然并不是说不想进bat,只是不再那么注重结果,更注重这奋斗过程中个人的成长。

360一面

差不多三十五分钟

  • 介绍你做过的项目
  • 手写单例模式
  • 布局优化
  • 有没有用过什么开源框架?
  • ImagLoader的实现原理
  • OnTouchEvent事件中 down事件 和up事件的传递
  • hashMap的实现 原理
  • LinkedHashMap的实现原理
  • 内存管理及优化
  • 点九图

点九图

https://isux.tencent.com/android-ui-9-png.html

放大后可以比较明显的看到上下左右分别有一个像素的黑色线段,这里分别标注了序号。简单来说,

序号1和2标识了可以拉伸的区域,

序号3和4标识了内容区域。当设定了按钮实际应用的宽和高之后,横向会拉伸1区域的像素,纵向会拉伸2区域的像素。如下图:

这里程序设置的文字垂直居中,水平居左的对齐方式。对齐方式是没有问题的,但是对于这种大圆角同时又有些不规则边框的的图形来说,错误的标注方式会让排版看起来很混乱。所以我们需要修正内容区域的线段位置和长度。

有两点需要特别注意下:

1.最外围的一圈像素必须要么是纯黑色,要么是透明,一点点的半透明的像素都不可以有,比如说99%的黑色或者是1%的投影都不可以有;

2.文件的后缀名必须是.9.png,不能是.png或者是.9.png.png,这样的命名都会导致编译失败。

内存管理及优化

我这里答的是内存泄漏和oom

少用static静态变量

1) 珍惜Services资源

我们知道service所在的Activity级别相对后台Activity的级别是比较 高的,一般不易被回收。

在service不再使用的时候,及时退出。最好的方法是使用IntentService

2)在UI不可见的时候释放资源

当用户切换到其它应用并且你的应用 UI不再可见时,你应该释放你的应用UI上所占用的所有内存资源。在这个时候释放UI资源可以显著的增加系统缓存进程的能力,它会对用户体验有着很直接的影响。

为了能够接收到用户离开你的UI时的通知,你需要实现Activtiy类里面的onTrimMemory()回调方法。你应该使用这个方法来监听到TRIM_MEMORY_UI_HIDDEN级别的回调,此时意味着你的UI已经隐藏,你应该释放那些仅仅被你的UI使用的资源。

请注意:你的应用仅仅会在所有UI组件的被隐藏的时候接收到onTrimMemory()的回调并带有参数TRIM_MEMORY_UI_HIDDEN。这与onStop()的回调是不同的,onStop会在activity的实例隐藏时会执行,例如当用户从你的app的某个activity跳转到另外一个activity时前面activity的onStop()会被执行。因此你应该实现onStop回调,并且在此回调里面释放activity的资源,例如释放网络连接,注销监听广播接收者。除非接收到onTrimMemory(TRIM_MEMORY_UI_HIDDEN))的回调,否者你不应该释放你的UI资源。这确保了用户从其他activity切回来时,你的UI资源仍然可用,并且可以迅速恢复activity。

3) 当内存紧张时释放部分内存

关于onTrimMemory的介绍

在你的app生命周期的任何阶段,onTrimMemory的回调方法同样可以告诉你整个设备的内存资源已经开始紧张。你应该根据onTrimMemory回调中的内存级别来进一步决定释放哪些资源。

TRIM_MEMORY_RUNNING_MODERATE:你的app正在运行并且不会被列为可杀死的。但是设备此时正运行于低内存状态下,系统开始触发杀死LRU Cache中的Process的机制。

TRIM_MEMORY_RUNNING_LOW:你的app正在运行且没有被列为可杀死的。但是设备正运行于更低内存的状态下,你应该释放不用的资源用来提升系统性能(但是这也会直接影响到你的app的性能)。

TRIM_MEMORY_RUNNING_CRITICAL:你的app仍在运行,但是系统已经把LRU Cache中的大多数进程都已经杀死,因此你应该立即释放所有非必须的资源。如果系统不能回收到足够的RAM数量,系统将会清除所有的LRU缓存中的进程,并且开始杀死那些之前被认为不应该杀死的进程,例如那个包含了一个运行态Service的进程。

同样,当你的app进程正在被cached时,你可能会接受到从onTrimMemory()中返回的下面的值之一:

TRIM_MEMORY_BACKGROUND: 系统正运行于低内存状态并且你的进程正处于LRU缓存名单中最不容易杀掉的位置。尽管你的app进程并不是处于被杀掉的高危险状态,系统可能已经开始杀掉LRU缓存中的其他进程了。你应该释放那些容易恢复的资源,以便于你的进程可以保留下来,这样当用户回退到你的app的时候才能够迅速恢复。

TRIM_MEMORY_MODERATE: 系统正运行于低内存状态并且你的进程已经已经接近LRU名单的中部位置。如果系统开始变得更加内存紧张,你的进程是有可能被杀死的。

TRIM_MEMORY_COMPLETE: 系统正运行与低内存的状态并且你的进程正处于LRU名单中最容易被杀掉的位置。你应该释放任何不影响你的app恢复状态的资源。

因为onTrimMemory()的回调是在API 14才被加进来的,对于老的版本,你可以使用onLowMemory)回调来进行兼容。onLowMemory相当与TRIM_MEMORY_COMPLETE。

Note: 当系统开始清除LRU缓存中的进程时,尽管它首先按照LRU的顺序来操作,但是它同样会考虑进程的内存使用量。因此消耗越少的进程则越容易被留下来。

4) 避免bitmaps的浪费

当你加载一个bitmap时,仅仅需要保留适配当前屏幕设备分辨率的数据即可,如果原图高于你的设备分辨率,需要做缩小的动作。请记住,增加bitmap的尺寸会对内存呈现出2次方的增加,因为X与Y都在增加。

Note:在Android 2.3.x (API level 10)及其以下, bitmap对象的pixel data是存放在native内存中的,它不便于调试。然而,从Android 3.0(API level 11)开始,bitmap pixel data是分配在你的app的Dalvik heap中, 这提升了GC的工作效率并且更加容易Debug。因此如果你的app使用bitmap并在旧的机器上引发了一些内存问题,切换到3.0以上的机器上进行Debug。

5) 使用优化的数据容器

利用Android Framework里面优化过的容器类,例如SparseArray, SparseBooleanArray, 与 LongSparseArray。 通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作。另外,SparseArray更加高效在于他们避免了对key与value的autobox自动装箱,并且避免了装箱后的解箱。

6) 请注意内存开销

对你所使用的语言与库的成本与开销有所了解,从开始到结束,在设计你的app时谨记这些信息。通常,表面上看起来无关痛痒(innocuous)的事情也许实际上会导致大量的开销。例如:

Enums的内存消耗通常是static constants的2倍。你应该尽量避免在Android上使用enums。

在Java中的每一个类(包括匿名内部类)都会使用大概500 bytes。

每一个类的实例花销是12-16 bytes。

往HashMap添加一个entry需要额一个额外占用的32 bytes的entry对象。

7) 请注意代码“抽象”

通常,开发者使用抽象作为”好的编程实践”,因为抽象能够提升代码的灵活性与可维护性。然而,抽象会导致一个显著的开销:通常他们需要同等量的代码用于可执行。那些代码会被map到内存中。因此如果你的抽象没有显著的提升效率,应该尽量避免他们。

8) 使用ProGuard来剔除不需要的代码

ProGuard能够通过移除不需要的代码,重命名类,域与方法等方对代码进行压缩,优化与混淆。使用ProGuard可以使得你的代码更加紧凑,这样能够使用更少mapped代码所需要的RAM。

9) 对最终的APK使用zipalign

在编写完所有代码,并通过编译系统生成APK之后,你需要使用zipalign对APK进行重新校准。如果你不做这个步骤,会导致你的APK需要更多的RAM,因为一些类似图片资源的东西不能被mapped。

Notes: Google Play不接受没有经过zipalign的APK。

360二面

一面过了十多分钟以后,接着就进行二面,都是视频面试,差不多二十分钟左右

  • AsyncTak的原理及常用方法
  • APK从安装到启动的过程
  • 平时是怎样学习的?
  • 学习和实习是在怎样协调的 ?
  • 有360手机助手有什么想了解的吗?

对360手机助手有什么想了解的?

这里我提问的是省流量升级是怎样实现的?

后面追问是不是利用动态加载技术。面试官解释的是不是你,是对比版本之间的二进制文件差异。

面试总结

题外话

两轮面试面试官人都挺好的,都面带笑容个,感觉很好说话,当天晚上我加了面试官的微信,问他多久会出结果,面试官问我说后面有没有接到电话,我说没有,然后面试官说应该被刷了。

个人心得

可能是第一次视频面试,感觉个人太紧张了,有好多原理性的东西讲着讲着就忘记讲了,面试的时候真的是太紧张了,发挥不太好,平时一定要多总结,不然面试的时候一下子总结地不太好,发挥不出应有的水平。

转载请注明原博客地址:

时间: 2024-10-22 12:49:07

360面试总结(Android)的相关文章

剖析Framework面试 冲击Android高级职位

第1章 学习指南本章会告诉大家为什么应该学习这门课,课程有哪些特色,能给大家带来什么收获,还会讲到课程的整体内容安排,最后还会给出一些学习建议,让大家能更好地学习这门课. 第2章 系统服务相关面试问题本章重点讲解系统核心进程,以及一些关键的系统服务的启动原理和工作原理相关的面试内容. 第3章 应用进程相关面试问题本章主要讲解应用进程的启动,以及伴随进程启动过程中的一些重要机制的初始化原理,比如binder机制,Application,以及Context等方面的面试问题. 第4章 Activity

面试准备android(一)

在牛客(一个很多笔试面试交流的平台,感觉每天一套可以萌萌哒(☆_☆))上看到一个大神,简直是offer收割机TAT,其面经中好多东西都是基础,觉得自己有必要总结并学习我不懂的模块,趁我还有时间,加油!! ps:大部分内容都是网上查找的,有侵权的话,立删(m(_ _)m) ------------------------------ 1.Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.Volley 的特点:特别适合数据量小,通信频繁的网络操作,防止OOM发生

高仿360手机卫士——Android源码

高仿360手机卫士 高仿360手机卫士界面android源码,左右滑动效果,超炫. 下载地址:http://www.devstore.cn/code/info/1173.html 运行截图:    热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.

给年后面试的Android程序员的一些面试建议

前言 今天写一篇关于Android面试相关的博客,需要说明的是本文只针对Android应用开发,不针对rom开发以及逆向工程.我想面试对于程序员来说是很重要的一件事件,面试结果的好坏直接决定了能否进入某个公司以及以什么级别和待遇进入某个公司.我参加面试的经验并不多,但是以面试官的身份面试别人倒是有很多次,所以我可以结合这些经验来介绍下如何更好地把握一个面试. 什么是合适的候选者 在介绍如何面试之前,这里先从公司的角度来分析:"到底什么样的候选者是公司所需要的技术人才?"就我在百度的一些

阿里安卓面试分析: Android应用的闪退(crash)问题跟踪和解析

一:问题描述    闪退(Crash)是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现,请从crash发生的原因分类与解决方法.在出现crash后如何捕捉并分析异常这两个问题给出自己的解决方案.    我们以Android平台为例,介绍下如何捕获Android应用的闪退信息,以帮助我们定位和解决导致闪退的问题代码.二:Android中的闪退    在讲解Android中的闪退之前,我们先来简单的复习下Java中的异常.1.Java中的异常    Java中的异常层次结构如下图所

热门前沿知识相关面试问题-android插件化面试问题讲解

插件化由来: 65536/64K[技术层面上]随着代码越来越大,业务逻辑越来繁杂,所以很容易达到一个65536的天花板,其65536指的是整个项目中的方法总数如果达到这个数量时则不无法创建新的方法了,所以基于这个原因插件化就产生了. 功能层面的解耦.维护团队的分离,这也是大势所趋,每个团队会维护一个APK中的不同的业务模块,如果每个业务模块升级都需要对整个APK进行升级,代价实在太大,虽说目前有H5的方式能解决这个问题,但是体验上肯定是没法中Native的APP进行比较的.虽说来自Faceboo

360面试记录

初面: SQL注入 (1)如何判断一个页面存在SQL注入,有哪些方法 (2)针对具体数据库如何进行注入,如access,sqlserver,mysql,oracle,mongodb,Nosql (3)碰到有Waf的情况如何绕过,有哪些绕过手段 XSS (1)XSS分类 (2)Dom型XSS应用场景 (3)XSS的具体作用 CSRF (4)原理 (5)具体应用场景 上传 (6)给定一个场景,如何绕过,黑白名单绕过 代码审计 (7)做过哪些代码审计,具体发现了哪些漏洞,原理是什么 EXP编写能力 (

【Android面试】(二):你不能不知道的view---加id和不加id的区别?

请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45313125,非允许请勿用于商业或盈利用途. 上次面试,Android开发,被问到:你知道android中,布局文件中加id和不加id有什么区别?这个我真的不知道,蒙了,只能硬着头皮说:加了id会在R文件中生成对应id的数值,然后扯了点view树,总之答非所问...虽然最后面试也过了,但是这个问题一直萦绕在心头,挥之不去.刚好今天复习Activity生命周期的时候

Android中如何像 360 一样优雅的杀死后台服务而不启动

Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死.这里主要着重介绍如何像 360 一样杀死Android后台服务,而不会再次启动. 一.已知的 kill 后台应用程序的方法 android.os.Process.killProcess(pid); activityManager.killBackgroundProcesses(pkgName); kill -9 pid 这三种方法都可以“杀死”后台应用程序