MS(5):android之进阶篇

七、自定义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)

你可能感兴趣的:(MS(5):android之进阶篇)