七、自定义View
MS思考:Android面试一天一题(Day 30:老外的自定义View面试题)
MS思考:老外的自定义View面试题实现篇
MS思考:Android面试一天一题(5 Day):自定义View的状态是如何保存的?
分析篇:Android 自定义View入门
分析篇:Android 自定义ViewGroup入门实践
四种常用的标准自定义View方法(上)
四种常用的标准自定义View方法(下)
问题:自定义view效率高于xml定义吗?说明理由。
自定义view效率高于xml定义
1.少了解析xml
2. 自定义View 减少了ViewGroup与View之间的测量,包括父量子,子量自身,子在父中位置摆放,当子view变化时,父的某些属性都会跟着变化.
3. 效率就是一个View的 `测量`,`摆放`,`画`的次数问题,与多个View的.
问题:如何自定义ViewGroup
问题:如何画出一个印章的图案
android自定义view实现公章效果
问题:如何实现一个字体的描边与阴影效果
问题:自定义View如何考虑机型适配
问题:自定义View如何提供获取View属性的接口;
declare-styleable
八、开源库
MS思考:Android面试一天一题(Day 32:谈谈使用过的第三方开源库)
这么多开源框架,该用哪个好?
九、JNI开发及Framework开发
1、JNI系列问题
问题:如何使用JNI
JAVA中声明native 方法如private native String printJNI(String inputStr);
使用javah工具生成.h头文件这时候头文件中就会自动生成对应的函数JNIEXPORT jstring JNICALL Java_com_wenming_HelloWorld_printJNI
实现JNI原生函数源文件,新建HelloWorld.c文件,对刚才自动生成的函数进行具体的逻辑书写,例如返回一个java叫做HelloWorld的字符串等
编译生成动态链接so文件**
Java中调用Sysytem.load方法把刚才的so库加载进来,就可以调用native方法了
问题:如何通过JNI传递String对象
Java的String和C++的string是不能对等起来的,所以当我们拿到.h文件下面的jstring对象,会做一次转换我们把jstring转换为C下面的char*类型, 获取值
constchar* str;
str = env->GetStringUTFChars(prompt,false);
赋予值
char* tmpstr ="return string succeeded";
jstring rtstr = env->NewStringUTF(tmpstr);
问题:JNI 调用过程中 混淆问题
不混淆jni回调的类
十、实现解决方案及所遇知识难点
MS思考:Android面试一天一题(Day 31:Android技术难题解决方案)
MS思考:Android面试一天一题(吹牛题)
问题:如何实现一个网络框架(参考Volley)
1.缓存队列,以url为key缓存内容可以参考Bitmap的处理方式,这里单独开启一个线程。
2.网络请求队列,使用线程池进行请求。
3.提供各种不同类型的返回值的解析如String,Json,图片等等。
问题:设计一个从网络请求数据,图片,并加载到列表的系统,画出客户端架构并简单的分析下;
问题:设计一个文件的断点续传系统;
问题:设计一个图片缓存加载机制;
分析篇:Android 缓存机制
Bitmap的处理:
1.当使用ImageView的时候,可能图片的像素大于ImageView,此时就可以通过BitmapFactory.Option来对图片进行压缩,inSampleSize表示缩小2^(inSampleSize-1)倍。
2.BitMap的缓存:
1.使用LruCache进行内存缓存。
2.使用DiskLruCache进行硬盘缓存。
3.实现一个ImageLoader的流程:同步异步加载、图片压缩、内存硬盘缓存、网络拉取
1.同步加载只创建一个线程然后按照顺序进行图片加载
2.异步加载使用线程池,让存在的加载任务都处于不同线程
3.为了不开启过多的异步任务,只在列表静止的时候开启图片加载
十一、综合知识点
1、目录相关
MS思考:Android面试一天一题(Day 21:res目录-细节处见真章)
问题:Asset目录与res目录的区别
Asset目录与res目录的区别
问题:Android一个应用的工程目录结构是什么样的? src/res/assets/gen/bin/raw/目录分别是什么?proguard-project.txt/project.properties两个文件是什么?/res/assets/raw目录有什么异同?
2、适配相关
MS思考:Android面试一天一题(12 Day):语言切换
问题:Android的机型种类繁多,你是怎么适配的?
android机型适配终极篇
问题:dp, dip, dpi, px, sp是什么意思以及他们的换算公式?layout-sw400dp, layout-h400dp分别代表什么意思;
3、安全相关
问题:请解释安卓为啥要加签名机制。
问题:你知道的安全加密有哪些? (如果你说了一个加密,面试官就会接着跟进提问,所以之前你必须要会,不会的话背也要背下来)(安全加密)
问题:安卓权限管理,为何在清单中注册权限,安卓APP就可以使用,反之不可以(操作系统)
4、机制相关
问题:android中弱引用与软引用的应用场景
Android中弱引用与软引用的应用场景
问题:android长连接,怎么处理心跳机制
Android长连接,怎么处理心跳机制
5、更新修复相关
问题:multidex解决方法数过大的问题
问题:什么是65535? 解决方法是什么?
问题:对于应用更新这块是如何做的?(灰度,强制更新,分区域更新)
灰度:
(1)找单一渠道投放特别版本。
(2)做升级平台的改造,允许针对部分用户推送升级通知甚至版本强制升级。
(3)开放单独的下载入口。
(4)是两个版本的代码都打到app包里,然后在app端植入测试框架,用来控制显示哪个版本。测试框架负责与服务器端api通信,由服务器端控制app上A/B版本的分布,可以实现指定的一组用户看到A版本,其它用户看到B版本。服务端会有相应的报表来显示A/B版本的数量和效果对比。最后可以由服务端的后台来控制,全部用户在线切换到A或者B版本~
无论哪种方法都需要做好版本管理工作,分配特别的版本号以示区别。
当然,既然是做灰度,数据监控(常规数据、新特性数据、主要业务数据)还是要做到位,该打的数据桩要打。
还有,灰度版最好有收回的能力,一般就是强制升级下一个正式版
强制更新:点击打开链接
增量更新:bsdiff:二进制差分工具bspatch是相应的补丁合成工具,根据两个不同版本的二进制文件,生成补丁文件.patch文件。通过bspatch使旧的apk文件与不定文件合成新的apk。 不足:要区分版本,内置及版本相同破解版apk无法增量更新,最好进行sha1sum校验,保证基础包的一致性。
问题:几种常用的热修复及大概原理
热修复:Andfix为例子
1.大致原理:apkpatch将两个apk做一次对比,然后找出不同的部分。可以看到生成的apatch了文件,后缀改成zip再解压开,里面有一个dex文件。通过jadx查看一下源码,里面就是被修复的代码所在的类文件,这些更改过的类都加上了一个_CF的后缀,并且变动的方法都被加上了一个叫@MethodReplace的annotation,通过clazz和method指定了需要替换的方法。然后客户端sdk得到补丁文件后就会根据annotation来寻找需要替换的方法。最后由JNI层完成方法的替换。
2.无法添加新类和新的字段、补丁文件很容易被反编译、加固平台可能会使热补丁功能失效
问题:CrashHandler:获取app crash的信息保存在本地然后在下一次打开app的时候发送到服务器。
问题:插件化框架描述:dynamicLoadApk为例子
1.可以通过DexClassLoader来对apk中的dex包进行加载访问
2.如何加载资源是个很大的问题,因为宿主程序中并没有apk中的资源,所以调用R资源会报错,所以这里使用了Activity中的实现ContextImpl的getAssets()和getResources()再加上反射来实现。
3.由于系统启动Activity有很多初始化动作要做,而我们手动反射很难完成,所以可以采用接口机制,将Activity的大部分生命周期提取成接口,然后通过代理Activity去调用插件Activity的生命周期。同时如果像增加一个新生命周期方法的时候,只需要在接口中和代理中声明一下就行。
4.缺点:
1.慎用this,因为在apk中使用this并不代表宿主中的activity,当然如果this只是表示自己的接口还是可以的。除此之外可以使用that代替this。
2.不支持Service和静态注册的Broadcast
3.不支持LaunchMode和Apk中Activity的隐式调用。
问题:你觉得安卓开发最关键的技术在哪里?
问题:gradle、ant分别为是什么?具体能否会使用?
问题:混合开发,RN,weex,H5,小程序(做Android的了解一些前端js等还是很有好处的)
MS思考:Android面试一天一题(Day 23:当Android遇上JavaScript)
问题:说一款你认为当前比较火的应用并设计(直播APP)
十二、Android版本相关
问题:Android的各版本变化?
分析篇:Android5.0、6.0、7.0新特性
十三、工具相关
MS思考:Android面试一天一题(Day 17:老外的面试题)
1、git
git命令使用
Android Studio上git的使用
Android Studio上git的使用(2)