捋一下android知识点(1)—— Dalvik和ART相关

近期忙完了一个TV的项目,因为不想让自己的涉猎面变窄(其实自问还是有太多不懂的地方),其他不会用(明明就是小白一只),只关注TV开发。故端正态度,系统的捋一下安卓的知识点,并且进行一些进阶的尝试。总结的知识树来进行复习和深入学习。这个是简化版,是根据之前有一张别人总结的但自己不知道出处的图来进行重画的,加了一点自己的总结,以后会继续完善。希望自控力很差的自己可以坚持下去,成为习惯。

总结了几个大佬的相关文章 源在这里,有的自己添加的,如有缺漏,欢迎指正:

https://blog.csdn.net/csdn_aiyang/article/details/85780925#%E4%B8%80%E3%80%815.0%E6%96%B0%E7%89%B9%E6%80%A7

https://blog.csdn.net/csdn_aiyang/article/details/82870955

https://blog.csdn.net/u014800493/article/details/73088091

 

 

捋一下android知识点(1)—— Dalvik和ART相关

咱们这个发展史指的当然是从系统角度出发,只聊各版本特性,望做了解:

Android2.2

系统上:

1.Android首次在Dalvik上使用JIT(Just In Time Compiler),在运行时对dex/odex进行编译优化,将Dalvik Code编译为精简的Native Code,JIT的引入,将Dalvik的运行性能提升了3-6倍

2.缺点是每次运行都需要编译,因为每次都需要编译,所以会造成额外的电量消耗。

api上:

https://blog.csdn.net/ddna/article/details/5624408

Android平台现在支持应用主动要求安装在外部存储设备(如SD卡),以取代将其安装在设备的内部存储区。

Android4.4

系统上:

1.Android带来了全新的运行环境ART(Android Run Time)和全新的编译策略AOT(Ahead Of Time)

2.AOT是静态编译,在安装时,会启动dex2oat过程,将dex文件与编译成ELF文件,每次运行是不需要重新编译。

3.需要注意的是,彼时 ART 是和 Dalvik 共存的,用户可以在两者之间进行选择

4.我自己加的:目前大部分厂商定制机顶盒都是基于4.4版本的,因为稳定性(2019.8)预测其他安卓智能硬件也是这个版本。小米天猫等盒子为6.0

api上:

https://developer.android.com/about/versions/android-4.4.html

  1. 您的应用在 Android 4.4 上运行时无法读取外部存储空间上的共享文件,除非您的应用具有 READ_EXTERNAL_STORAGE 权限。也就是说,没有此权限,您无法再访问 getExternalStoragePublicDirectory() 返回的目录中的文件。但是,如果您仅需要访问 getExternalFilesDir() 提供的您的应用特有目录,那么,您不需要 READ_EXTERNAL_STORAGE 权限。
  2. WebView 类的底层代码和相关 API 已升级为基于现代的 Chromium 源代码快照。

Android5.0

系统上:

1.全面替换为ART运行环境,编译策略也改为AOT

2.缺点:首次安装的时间会变长,会额外增加文件大小,一个100M的app,预编译后可能达到200M

3.自己加的:webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);                   
 都无效了,如需让webview内容自适应屏幕,请webView.setInitialScale(int scale);进行缩放 scale是获取当前屏幕的宽或高与规定宽高的比值

api上:

https://developer.android.com/about/versions/android-5.0-changes.html

  1. 在 Android 5.0 中,ART 运行时取代 Dalvik 成为平台默认设置。Android 4.4 中已引入处于实验阶段的 ART 运行时。
  2. Material Design 样式
  3. 支持 64 位 ART 虚拟机(这个插件化时,尤其是一些游戏接入,4.4变5.0会报找不到jniLibs里的文件(以so为例),需要创建64位文件夹并在里写一个占位的.so文件),Android中的so文件都是在Android APP安装的的时候复制到data/data/包名 下边的。Android 5以前的Android系统会先后查看armeabi-v7a和armeabi文件夹下的so文件,取其并集放置到APP目录下,而Android5以后的系统会先检查armeabi-v7a文件夹,如果有so文件,就只会把armeabi-v7a目录下的so文件拷贝APP目录下,如果armeabi-v7a文件夹下没有so文件,则会拷贝armeabi中的so文件。
  4. 重点注意: 加了很多新控件,如抽屉布局,菜单布局,卡片布局,列表布局新增RecyclerView等

Android6.0

api上:

https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

  1. 动态权限管理
  2. APP 关联

引入运行时权限,要确定应用是否已被授予权限,调用新增的 checkSelfPermission() 方法。要请求权限,调用新增的 requestPermissions() 方法。

重点注意:动态的权限申请,6.0以下的版本可以直接申请权限直接使用了,以上的版本需要一些敏感权限时需要动态申请

Android7.0

系统上:

1.运行环境仍是ART,但是编译策略改为AOT和JIT混合编译

2.在首次安装时,不会进行预编译,直接运行,使用运行时编译,在手机处于空闲或者充电状态的时候,再进行预编译。

3.优点:集合了AOT和JIT的优点,使得安装速度加快,运行速度/存储空间和耗电量等指标都得到了优化

api上:

https://developer.android.com/about/versions/nougat/android-7.0-changes.html

分屏多任务

Doze 模式

重点注意: 7.0对于SDCard的文件URI的访问做了限制,获取文件uri的方式也变了,开发时需要注意。

传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。

解决办法:

https://blog.csdn.net/lmj623565791/article/details/72859156

Android8.0

api上:

https://developer.android.com/about/versions/oreo/android-8.0-changes

1.针对 8.0 的应用需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级。

2.针对 8.0 的应用,创建通知前需要创建渠道,创建通知时需要传入 channelId,否则通知将不会显示

3.如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。我们目前只能简单 try-catch startService()

重点注意:

8.0限制了后台服务这些,启动后台服务需要设置通知栏,使服务变成前台服务。

对于安装位置来源的应用做了更严格的限制,在app更新安装时需要做些处理。

Android9.0

api上:

https://developer.android.com/about/versions/pie/android-9.0-changes-all

刘海设计

Material Design功能更新

权限收紧

重点注意:Android 9.0强制使用https,会阻塞http请求,如果app使用的第三方sdk有http,将全部被阻塞。

上一篇:tools: the art of debugging with GDB DDD


下一篇:[UWP]为什么ContentControl的ControlTemplate里放两个ContentPresenter会出问题(绕口)