回想起前年左右,本身去社招的时候,一连串下来问了好多如今都是历历在目。回想起之前才以为 纸上得来终觉浅,绝知此事要躬行
全部的面试题答案并非百分百的标准,要靠你本身的感悟和有本身的想法,才能独树一帜脱颖而出的。全部仅供参考
全部的都在这个PDF中有所汇总,983页花了几十个小时整理出来的。仍是比较全面的有Android,Java小知识,到性能优化.线程.View.OpenCV.NDK.大厂面试,算法等等,你们能够联系我看看对自身有没有用android
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
能够点击关于我联系我获取完整PDF
( VX:mm14525201314)
Mockito;
注意: 单元测试不适合测试复杂的 UI 交互事件git
Gradle
自动化测试、机型适配测试等首先要了解 Java 四种引用类型的场景和使用(强引用、软引用、弱引用、虛引用)github
SoftReference
对象是用来保存软引用的,但它同时也是一个 Java 对象,因此当软引用对象被回收以后,虽然这个 SoftReference
对象的 get 方法返回null,但 SoftReference
对象自己并非 null,而此时这个 SoftReference
对象已经再也不具备存在的价值,须要一个适当的清除机制,避免大量SoftReference
对象带来的内存泄露ReferenceQueue
来处理引用对象的回收状况。当 SoftReference
所引用的对象被 GC 后,JVM 会先将 softReference
对象添加到ReferenceQueue
这个队列中。当咱们调用 ReferenceQueue
的 的 poll() 方法,若是这个队列中不是空队列,那么将返回并移除前面添加的那个Reference
对象public static void main(String[] args) throws InterruptedException { //假设当前JVM内存只有8m Person person = new Person( "/K=" ); ReferenceQueue Person> queue = new ReferenceQueue>( ); Sof tReference Person> softReference = new SoftReference<Person>(person, queue ); реrѕоn = null;// 去掉强引用, new Person ( "/K=" );的这个对象只有软引用了 Person anotherPerson = new Person( "/L=" )//没有足够的空间同事保留两个Person对象,因此触发GC机制 Thread.sleep(1000); Sys tem. err . println( "软引用的对象 ------" > softReference.get( )); Reference softPollRef = queue . poll( ); if (softPollRef != null) f System.err.println( " SoftReference对象中保存的软引用对象已经被GC,准备清理SoftReference对象"); //清理softReference } }
CERT.SF
和 CERT.RSA
签名文件以及 MANIFEST.MF
清单文件。AssetManager
对象检索的应用资源。resources.arsc
。armeabi
armeabi-v7a
, arm64-v8a
, x86
, x86_64
,和mips
。resources.arsc
: 包含已编译的资源。该文件包含res/values/ 文件夹全部配置中的 XML 内容。打包工具提取此 XML 内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc8
文件中的内容路径 ,例如布局文件和图像。Dalvik / ART
虚拟机可理解的X DEX 文件格式编译的类。AndroidManifest.xml
: 包含核心 Android 清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件.该文件使用 Android 的二进制XML 格式。lib
、class.dex
和 res 占用了超过 90%的空间,因此这三块是优化 Apk
大小的重点(实际状况不惟一)图片文件压缩是针对 jpg
和 png
格式的图片。咱们一般会放置多套不一样分辨率的图片以适配不一样的屏幕,这里能够进行适当的删减。在实际使用中,只保留一到两套就足够了(保留一套的话建议保留xxhdpi
,两套的话就加上 hdpi
),而后再对剩余的图片进行压缩(jpg
采用优图压缩,png
尝试采用pngquant
压缩)面试
buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile("proguard-android. txt"),’proguard-rules.pro’ } }
shrinkResources
为 true 表示移除未引用资源,和代码压缩协同工做。minifyEnabled
为 true 表示经过 ProGuard
启用代码压缩,配合 proguardFiles
的配置对代码进行混淆并移除未使用的代码。apk
的同时,也提高了安全性。armeabi
、armeabi-v7a
和 x86
这几种类型,这里能够只保留 armeabi
或 armeabi-v7a
的其中一个就能够了,实际上微信等主流 app 都是这么作的。build.gradle
直接配置便可,NDK
配置同理defaultConfig { ndk { abiFilters 'armeabi' } }
插件化是指将 APK
分为 宿主和 插件的部分。把须要实现的模块或功能当作一个独立的提取出来,在 APP 运行时,咱们能够动态的 载入或者 替换插件部分,减小 宿主的规模算法
而 热修复则是从修复 bug 的角度出发,强调的是在不须要二次安装应用的前提下修复已知的 bug。编程
Android 中经常使用的两种类加载器, DexClassLoader
和 PathClassLoader
,它们都继承于BaseDexClassLoader
,二者 区别在于PathClassLoader
只能加载 内部存储目录dex/jar/apk
文件。DexClassLoader
支持加载 指定目录(不限于内部)的 dex/jar/apk
文件缓存
经过给插件 apk
生成相应的 DexClassLoader
即可以访问其中的类,可分为单 DexClassLoader
和多DexClassLoader
两种结构。安全
ClassLoader
机制,主工程引用插件中类须要先经过插件的 ClassLoader
加载该类再经过 反射调用其方法。插件化框架通常会经过统一的入口去管理对各个插件中类的访问,而且作必定的限制。性能优化
ClassLoader
机制,主工程则能够 直接经过类名去访问插件中的类。该方式有个弊端,若两个不一样的插件工程引用了一个库的不一样版本,则程序可能会出错。原理在于经过反射将插件 apk
的路径加入AssetManager
中并建立 Resource
对象加载资源,有两种处理方式:微信
addAssetPath
时加入全部插件和主工程的路径;因为 AssetManager
中加入了全部插件和主工程的路径,所以生成的Resource
能够同时访问插件和主工程的资源。可是因为主工程和各个插件都是独立编译的,生成的资源 id 会存在相同的状况,在访问时会产生资源冲突。apk
路径,各个插件的资源是互相隔离的,不过若是想要实现资源的共享,必须拿到对应的 Resource
对象。引入组件化的缘由: 项目随着需求的增长规模变得愈来愈大,规模的增大致使了各类业务错中复杂的交织在一块儿,每一个业务模块之间,代码没有约束,带来了代码边界的模糊,代码冲突时有发生, 更改一个小问题可能引发一些新的问题, 牵一发而动全身,增长一个新需求,须要熟悉相关的代码逻辑,增长开发时间
组件化开发流程就是把一个功能完整的 App 或模块拆分红多个子模块( Module ),每一个子模块能够 独立编译运行,也能够任意组合成另外一个新的 App 或模块,每一个模块即不相互依赖但又能够相互交互,可是最终发布的时候是将这些组件合并统一成一个 apk,遇到某些特殊状况甚至能够升级或者
第二种组件之间的自定义类和 自定义方法的调用要稍微复杂点,须要 ARouter
配合架构中的 公共服务(CommonService
) 实现:
CommonService
) 中声明 Service
接口 (含有须要被调用的自定义方法), 而后在本身的模块中实现这个 Service 接口, 再经过 ARouter API
暴露实现类。ARouter
的 API 拿到这个Service
接口(多态持有, 实际持有实现类), 便可调用 Service
接口中声明的自定义方法, 这样就能够达到模块之间的交互。AndroidEventBus
其独有的Tag, 能够在开发时更容易定位发送事件和接受事件的代码, 若是以组件名来做为 Tag 的前缀进行分组, 也能够更好的统一管理和查看每一个组件的事件, 固然也不建议你们过多使用 EventBus
。RouterHub
存在于基础库, 能够被看做是全部组件都须要遵照的通信协议, 里面不只能够放路由地址常量, 还能够放跨组件传递数据时命名的各类 Key 值,再配以适当注释, 任何组件开发人员不须要事先沟通只要依赖了这个协议, 就知道了各自该怎样协同工做, 既提升了效率又下降了出错风险, 约定的东西天然要比口头上说强。RouterHub
中, 太麻烦了, 也能够在每一个组件内部创建一个私有 RouterHub
, 将不须要跨组件的路由地址放入私有 RouterHub
中管理, 只将须要跨组件的路由地址放入基础库的公有 RouterHub
中管理, 若是您不须要集中管理全部路由地址的话, 这也是比较推荐的一种方式。ARouter
路由原理:ARouter
维护了一个路由表 Warehouse,其中保存着所有的模块跳转关系,ARouter
路由跳转实际上仍是调用了 startActivity
的跳转,使用了原生的Framework 机制,只是经过 apt 注解的形式制造出跳转规则,并人为地拦截跳转和设置跳转条件
Hook 是一种用于 改变 API执行结果的技术,可以将系统的API 函数执行 重定向(应用的 触发事件和 后台逻辑处理是根据事件流程一步步地向下执行。而 Hook 的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件同样,而且可以在钩上事件时,处理一些本身特定的事件,例如逆向破解 App)
插桩是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,然后从新打包,是静态的篡改; 而 Hook则不须要再编译阶段修改第三方的源码或中间代码,是在运行时经过反射的方式修改调用,是一种 动态的篡改
做用: 经过宽测量值 widthMeasureSpec
和高测量值heightMeasureSpec
决定 View 的大小
组成: 一个 32 位 int 值,高 2 位表明 SpecMode
(测量模式),低 30 位表明 SpecSize( 某种测量模式下的规格大小)。
三种模式:
SpecSize
。对应 LyaoutParams
中的match_parent 或具体数值。SpecSize
,View 的大小不能大于这个值。对应LayoutParams
中的 wrap_content。图片加载库:Fresco 丶Glide 、o Picasso 等
AnimatorSet
正是经过playTogether()
、playSequentially()
、animSet.play().with()
、before()
、after()
这些方法来控制多个动画协同工做,从而作到对动画播放顺序的精确控制
// animation主要用于tween动画 //根据资源获得动画 Animation roitateAnimation = AnimationUtils.loadAnimation(this,R.anim.rotata_anim); //播放动画完成以后,保留动画最后的状态 rotateAnimation.setFillAfter(true); //播放动画 btnRotate.startAnimation(rotateAnimation); // animator主要用于属性动画 objectAnimator animator = objectanimator.ofFloat(textview,"alpha,1f,0f,1f); animator.setDuration(5000); animator,start(); AnimatorSet animatorSet = new AnimatorSet(); //移动 objectAnimator ty = object Animator.ofFloat(btn,"translationY",0,300); ty.setDuration(1000); //旋转 objectAnimator ty = objectAnimator.ofFloat(btn, "rotationY", 0,1080); //透明度 objectAnimator alpha = objectAnimator.ofFloat(btn, "alpha", 1,0,0.5f,1); //缩放 objectAnimator sx = objectAnimator.ofFloat(btn, "scaleX",1,0.5f); //一块儿播放 // animatorSet.playTogether(items); animatorSet.play(ry),with(sx).after(ty).before(alpha); animatorSet.start();
请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
能够点击关于我联系我获取完整PDF
(VX:mm14525201314)