Android面试题之三(...)

写到面试题三,才发觉,本就不应该给他分初,中,高,这样的等级的。

这不,这会后面括号里不知道该怎么分类了。

有了一和二,就不能说初中级了。

说高级吧。现在也算不上高级别面试题了。

就好比去年i9100还是三星的机皇,今年呢。。


时代永远在前行,没有最好,只有更好。


言归正传:

先copy一份2-3月前还算比较难点的Android面试题。

其实准确的不能说是难,而是太冷门,以及太细节。

传说是阿里巴巴的一份面试题。

/********************************************************copy

刚刚看帖子 发现几道android面试题 感觉有点小难

1.为了降低android程序的内存使用峰值和APK文件的大小,我们一般使用_____________工具对资源图进行额外处理。

2.Android系统会自动派发各种事件,事件从触发到相应的程序相应的派发顺序是_________。

3.发布Android程序时,APK文件要先签名,再用Zipalign做4字节对齐。( )

4.实现多个进程共享数据的时候,只要设置AndroidManifest文件的shareUserId属性即可,签名可以不一致( )。


5.在JNI的实现代码中,如果要实现跨线程调用JNI接口,我们需要先调用jni.h中的_________函数,跨线程调用JNI接口完毕后,再调用jni.h中的____________________函数来善后。


6.如果一个Activity被设置为“singleTop”模式并且还驻留在后台,此时再通过startActivity启动这个Activity时,Activity的_______________成员函数会被最先回调到,我们一般在这个回调函数中来处理相关逻辑。


PS:3、4题是判断题,其它是填空题

********************************************************/

个人稍微回答下。可能有很多不足之处,仅作借鉴

问题1

.为了降低android程序的内存使用峰值和APK文件的大小,我们一般使用_____________工具对资源图进行额外处理。

答:这个估计一般人都知道了,就是9图工具。而且这个工具真的很好用,就我几个阶段反编译一些apk文件来看。

比如一年前的时候的应用,基本没有用到这块,除了几个大型公司做的app,用到了工具。2011年末的几个应用,9妹就来势汹汹了。

而且发现9图后图片除了能更好的适配防拉伸效果等,还微微减小了图片大小。同时因为能做多适配和大小缩放不失真的调整,间接的就减少了做多套适配图片而增减

资源包的臃肿。


问题2:

Android系统会自动派发各种事件,事件从触发到相应的程序相应的派发顺序是_________。

答:这个涉及到Framework层了。本人没怎么接触。看关于这个帖子的这个题有人给出过两种答案:

1.EventHub->KeyInputQueue->WindowManagerService->ViewRoot->...

2.WindowsManager->phoneWiondw->Activity

其实两个想表达的意思是差不多的。就是一个服务队列,接受到事件。从队列中将该事件分发给WindowManagerService也就是窗口管理类服务,然后分发个对应的窗口Window,窗口中有个主View,主View又分由上而下子View。

这里就要提到两个函数,也是刚开始我搞晕了的两个函数:

第一个是dispatchXXXXEvent和onXXXX(onTouchEvent,onKeyDown);

以前对这个onxxxx的重写时很多的,这个dispatchXXX基本是没用过。然后我一直也没明白这个派发机制的干嘛的。

后来看下了源代码会发现,dispatch分发传递到最后一层时,就执行了onxx事件。

说白了就是dispatch是发送事件,onxx是处理事件。

  public boolean dispatchTouchEvent(MotionEvent event) {
        if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
                mOnTouchListener.onTouch(this, event)) {
            return true;
        }
        return onTouchEvent(event);
    }

这是View中的一段代码。

具体关于分发事件的可以查考该博文:Android FrameWork——Touch事件派发过程详解

不太明白的也没事。可以看个大致流程,呵呵。


问题3:

.发布Android程序时,APK文件要先签名,再用Zipalign做4字节对齐。( )

答:这个是判断题,无论你知不知道,好歹还能蒙一个。先说下答案,对的。以我的了解。

这题出的其实比较偏门,偏门的意思是大部分人都不会关心这个。

我也是在最近弄Ant自动打包时,才是熟悉了下这个问题。

因为ant脚本这玩意我也是第一次玩,看了下资料,以及基本语法和书写方式。

一般我们打包可能直接用adt工具了,说白了它就是集成了一个打包工具。

ant只不过就是我们自己来写而已,里面涉及到很多javac,zipalign和proguard什么的,就是把一些工具的命令行操作语句窜起来。

然后接触到要使用一个zipalign优化工具

简答了解下:这是一个归档对其工具,对资源做了优化,对未压缩的数据做了某种意义上的4字节对其。

具体为什么这个顺序是对的呢。不知道这图算不算一种说明方式:




这是我打完一个未签名包后,工具的提示。

对于为什么出这样的题,估计是是想看应聘者是否去接触过一些细节和工具,或是对于ant打包的接触?


问题4:

实现多个进程共享数据的时候,只要设置AndroidManifest文件的shareUserId属性即可,签名可以不一致( )。

答:/**

*是。具体原因就不知了。

**/

这里先谢谢下面评论中那个哥们,确实对于我可能测试过的几个问题我都做了详细回答。这个因为没有测试,就完全是copy了那会论坛下的几个答案,以为做个

总体答案的记录就行了。

这是刚测试后的答案。

答;不能。

因为设置了shareUserId后,在你应用安装的时候系统在对读取配置文件安装信息时就会检测这个问题,既你的A应用和B应用实现了shareUserId一样。

但是在安装时签名不一样的话,安装过程就是失败的。



问题5:

在JNI的实现代码中,如果要实现跨线程调用JNI接口,我们需要先调用jni.h中的_________函数,跨线程调用JNI接口完毕后,再调用jni.h中的_____函数来善后。

答案:/***

*   网上查了一下,第五题应该是GetJavaVM, DestroyJavaVM() .copy来的答案。。也不是很懂。

*

***/

答:这个问题原来只是copy过来的一份答案。谢谢 Innost 前辈对错误指出。涉及到底层的,有很多不足,首先也说下做这块总结只要是想把这几个问题有个还算靠谱的答案,因为现在google或是百度下这几个问题,都只是给出了题目,下面有回答和讨论的。我这边只是想做个简单归档,可能有很多不足,希望指正或是给下更好的答案。

上班抽闲大致花了1-2小时看了下这方面的资料。因为本人对C这块不熟,看的其实有点吃力。

JavaVM和JavaEnv的概念。(因为答案基本围绕了这两个在讨论, Innost 也提到说看下这个概念)。

JavaVM即java虚拟机,主要是一个进程(也就是多个线程来访问),简单说就是在一个应用进程启动后背创建。

JavaEnv,虚拟机环境,这个是只能被他创建的线程来访问,里面持有该线程访问的数据。

利用jvm可以获取当前线程的env。然后通过两个函数,来实现环境依附跨线程的访问和访问完后的释放。

 jint AttachCurrentThread(void **penv, void *args) {
        return functions->AttachCurrentThread(this, penv, args);
    }

 jint DetachCurrentThread() {
        return functions->DetachCurrentThread(this);
    }

这两个函数定义可以在jni.h中找到。

这边其实有考虑到两个参数 _jvm和_env.因为看下上面的代码是通过jvm调用 AttachCurrentThread来获取_env,

那_jvm这个参数又是何时获取,怎么获取的。

这个是网上copy的一份解说:

/----------------------------------------------------

JavaVM接口
第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数)。第一个参数会传入JavaVM指针。
第二种方式,在native code中调用JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args)可以得到JavaVM指针。
两种情况下,都可以用全局变量,比如JavaVM* g_jvm来保存获得的指针以便在任意上下文中使用。
Android系统是利用第二种方式Invocation interface来创建JVM的。

JNIEnv接口
JNI开发最常见的错误就是滥用了JNIEnv接口。需要强调的是JNIEnv是跟线程相关的。
在native method中,JNIEnv作为第一个参数传入。那么在JNIEnv不作为参数传入的时候,该如何获得它?JNI提供了两个函数:(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL)和(*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_2)。两个函数都利用JavaVM接口获得JNIEnv接口。

------------------------------------------/

其实这块挺晕的:

看jni.h中对于jvm好env获取是这样的定义。

env->GetJavaVM(&g_vm); 

 jvm->AttachCurrentThread(&e, &thread_args);

就是通过env获取虚拟机,通过虚拟机获取env。。。。有点先有蛋还是鸡的味道。

对于Android调用了jni几块,比如mediaPlayer模块。我看下了,发现env这个都是自己传进去。

其实还是很不懂。

只是先把这个错误答案改过来。

其实对于上面这个先调用获取jvm理论上也是对的,获取jvm后在获取env。对于后面这个空说销毁jvm可能就不对了。

本题的中心可能主要还是围绕env这个来说事。

更多详情可以看下下面老兄的建议。


问题6:.如果一个Activity被设置为“singleTop”模式并且还驻留在后台,此时再通过startActivity启动这个Activity时,Activity的_______________成员函数会被最先回调到,

我们 一般在这个回调函数中来处理相关逻辑。

答案:onNewIntent().singTask模式的亦是如此。这个因为刚接触过。想singleTop和singleTask除了一般说的防止产生大量的相同的Activity对象,产生内存中的冗余,

同时也可以很巧妙的解决一些问题。我有一个固定的Activity,比如简单的某个购物应用的购物栏界面。即,用户在每个购物界面点击添加购买后都会跳转到这个界面然后添加相应的购买商品条目。如果是一般的启动模式,我每次点击添加购买,就重新启动了一个购物车界面,并且在这个界面中也没有前面几次已经购买的商品条目,于我们的思路相违背。因此这个购物栏界面,理论上我就可以设计成一个单例。这样也就同样很容易的解释了这个题目的初衷了吧。因为一般面试官不可能只是看下你的答案,更多的会问下你几种启动模式的运用场景。这里也顺便提及下4种启动模式。这个不算冷门也很实用的知识,可以注意下,同时也可以大致的了解Android中关于Task的知识。


以上即是整理的一部分面试题,做了下记录和如果是我的话来做的一些看法

*********************************************************************************************/

以下是我最近觉得自己想到的几个问题。

因为最近说招人的时候,可能部分有2年左右工作经验,1年以上Android开发经验的应聘者,基本薪资都要求在1w上了。

于是对于面试的问题也不能仅仅只局限于笔试题这些做烂了的题目或是对方说下某个项目产品的流程框架模块实现什么的。

可能更多会要问一下,对于应用界面功能,交互设计的看法,以及如何编码实现一个不失优雅的和功能性的首页面。

然后是对于应用常见异常和错误的分析以及解决方式,再简单和细分点就是对于资源代码的优化,自动打包和测试,应用的防篡改和反编译。


题目一;

功能性界面的实现,比如记住用户名这个功能。

答:当然,对于初级可能会问按钮按下非按下的效果的实现,也就是选择器的应用。(但是真的,还有人会回答你,监听按钮事件然后代码来实现setbackground。。。)

言归正传,这个其实应该是很常见功能性界面。一般都是知道大致的思路的,用个偏好设置,保存一下就ok了。那么再细点呢。这个偏好设置要保存的基友几个参数,用户名,密码,然后呢?对了,那就是是否选折记住用户名密码的这个checkbox。因为我一开始做的时候忘记保存这个了。每次无论是否是checkbox是何种状态,我都保存和读取用户名和密码去了。。。

因此简单的:


图画的比较搓。。因为不太会用。

当你能把大致思路理清后,那么面试的就知道,这事你能解决,而不是笼统的说,用偏好设置啊。这就好比,在论坛中常看到这样的帖子和问答。

这个界面布局怎么实现。回答:相对布局。

好忧郁的回答。。

当然,最后也要看出题人出的题目,对提问人的要求,首先,该功能性代码量和思路要竟可能的能在短时间完成,并且不是模糊性的。


问题二:

代码混淆和压缩优化打包输出。

答;说白了,就是想问下你对progurad是否熟悉以及接触过。问这个问题其实是我自己也不懂,只会最简单的一句话傻瓜配置。但是又想做自定义的配置。

然后老大说了:对于面试时,你可以问下你自己遇到的,不能解决的问题。呵呵。

对于第三方jar包加入报错的处理,混淆后应用运行的异常。

当然,这块问题其实也是渐渐的必须要了解的东西,因为现在的大部分应用基本都重视被反编译的问题了。

问这个,第一点看面试者是否接触过,如果很熟悉,在原来的项目运用过,自定义配置过,那最好了。

第二点,如果没有,那么没事,可能却是没用到,那么就看对方是不是自己主动去了解过,简单说,是否有所谓热爱追求新技术,知识的汲取不仅仅局限于当前,有善于发现和进取的心。


问题三:

代码测试以及优化的了解?

答:这个可能就觉得这面试官比较傻逼和笼统了。确实,这问题闻到有点蛋疼。

其实稍微转化下可以问面试者对于原来项目完成后,是否做过测试框架和代码优化调试。

当然,这个是比较高层次了,因为对于自动化测试什么的,我知道的国内可能就一些大型公司会刻意去定制一套测试机制和框架。

问这个问题,其实也是自己的私心,因为我也想了解下一般,功能性测试框架或是界面交互性测试框架,个位大牛是如何实现。

对于代码优化,是否有一套自己成熟的方案。让我也入入门呗。

对于这个问题,其实你只要能说出自己的想法就可以了,如果你切好做过,那就更棒了。以及碰巧说你简单的用过sdktools下的monkey(测试工具)或是TraceViewer(性能追踪工具),那也不错,说明你知道自己去接触。而不是纯粹在那一味写代码。


问题四:

自定义的UI设计。

答:问这个问题其实每个公司可以参考自己产品的用户体验和视觉体验来问。

当然,既然问的是高手,你就不能傻乎乎的问,比如一个半透明或是dialog风格的的Activity的实现。

简单点的可以问下如何自定一个界面的加载动画,自定义的dialog。。

然后如果联系到自身的产品:第一点,由于目前我们的产品的某一个Activity的界面要展示的内容比较多,又不想简单的说用一个scrollView拖拉来实现,如何最有效的的利用有限的界面空间 1>.使用折叠效果的textView,这个也是一个朋友提到的,具体可以产考目前各大app商店,点击某个应用后,产品简介的那个空间。 2>.抽屉效果,这个其实是个不错的效果,具体代码其实网上大把的有,只要你能说出个思路就差不多,因为其实面试人也不是太懂,或者也只是借鉴网上而实现过。

第二点:自定义的首界面元素。因为我们应用可能下个版本要实现用户自定义的首界面。这个可以参考手机桌面图标拖拉,添加删除效果。这个效果其实有点难度,长按后的界面浮动效果,用户自定义后的配置保存。活着还带点什么特效,自动排序。对于这个涉及到的知识可能就多了,首先可能要对Window和windowmanager这几个对象有很好的了解,配置保存格式或是表单的处理。


问题五:

Http和Socket协议,xml/json

答:网络模块这个基本是每个公司都会问的一个问题。因为一个互联网应用,不可能不处理这块内容。

然后这个问题也是很笼统的,http可能会问下常用的头参数。这个其实没多大意义,但是也是很必要。按意义来说,正的写过很多次网络处理的人,其实也很少去真正了解下各个参数 的含义,可能就字符集,内容类型。其实深入点的可以这么问,是否在原来公司或是项目中f封装过自己的网络处理jar。因为很多公司的网络处理都不是说每个项目重新写起来的。然后对于传输格式的解析。xml就不说了,json这个对于普通对象的处理,对于数组对象的处理,以及是否自己修改过或是简单搞过自己的json解析器。因为Android自带的json解析,就那么九个类,还不带直接解析对象。用起来比较局限。

问这个问题,主要也不过是看看面试者是否真正接触和书写过网络模块。对于简历中的一句熟悉http xxxx,现在互联网应用基本没几个应用不使用网络模块吧,你的项目中是有这块内容,但是真正的你了解或是做过处理过的,那又有多少呢。


问题六:

3D动画特效或是游戏方面的

答:3D动画。首先我觉得会做游戏的人脑子都是比较清晰的,那么多x,y坐标,中心点,旋转点,长,宽,高,角度。参数多的晕人。

对于简单的2D特效,可能都会,3D能?需要那几个辅助类,Camera 吧。游戏的话View和surfaceView框架的选择。通用的游戏模块分类(这里纯粹是私心哈哈)。

我目前也真在学习接触。


好吧,问的有点偏题了。

其实总结下:

1.如果你可能刚毕业,接触Android大半年或是培训过,有几个好不错的demo项目并且能理清里面的思路,要的4-6千水平的薪资,你是个踏实的人。对于面试,能知道大部分的基础知识,了解一个项目的流程,并且有上进心,那就很不错了。你知道自己能干什么,也会知道你还要干什么。因为你不可能把薪水局限在这么点吧。

2.如果你有1年上未满两年Android开发经验。至少你跟团队完成1-2款成熟的商业项目,熟悉这个项目流程,至少参与30%以上编码。完全熟悉网络协议和处理。实现多种自定义的控件等,那么你要个8-10k上下的薪资,过年过节发个奖金,也算是个性情中人。对于面试时,你基本可以直接和面试官交流你的项目的过程和成果,你自己对项目的改进优化的看法,用的觉得自己比较出彩的技术,以及那些难点或是顽固性bug的解决。

3.这第三条其实不太好总结了。因为没见过,或是没法定位。熟悉多平台开发。3年以上工作经验,1年ios,2以上年的Android。基本开的要求都在1.5-2w了。仅是开工资的这其实也不算太高,因为如果你真有这方面多平台开发经验,我想,你不仅仅只是个开发工程师的角色了。走技术还是产品,也是个人爱好了。参与过几个平台至少1款商业项目的整体开发,当然如果是独立开发过,那就更加出色了。因为这比纯粹的拿到一个半成品的项目增加或是修改来的难度高多了。然后或是有线上的app应用,无论下载量如何,至少你开始有自己的想法了。

并且这样水品的人除了工资要求,可能还会考虑其他的福利问题。那面试中问到的问题就多了。


4.这边突然发现中间断了一层。一般市场开1-1.5w的开发人员。那么这部分可能已经可以担任一个中小级项目的项目经理了,至少他应该独立完成过一款产品(不包含视觉,交互,美工设计)。那么就可以问下对于应用优化,有利于团队协作管理的方面的问题。版本控制,自动打包测试。也就是上面我简单总结的几方面的问题。

本人其实也不懂,只不过有这方面的人来面试,我觉得吧,总的问几个别太二逼的问题吧。并且意义性比较大。顺便也能提高下自己。


本阶段的面试题个人总结完。

其实也是发现最近网络上也没什么太多新鲜感的面试题,说白了还是老一套的。

真的比较难得那就都是些framework层和C层的知识,但这对于大多数做应用的互联网公司来说,用其实并不多,除非那些搞流媒体,游戏引擎,语音,地图导航。

-end


  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值