Android中的ClassLoader

概述

  • BootClassLoader:主要用于加载系统的类,包括 java 和 android 系统的 类库,和 JVM 中不同,BootClassLoader 是 ClassLoader 内部类,
    是由 Java 实现的,它也是所有系统 ClassLoader 的父 ClassLoader
  • PathClassLoader:用于加载 Android 系统类和开发编写应用的类,只能加载已经安装应用的 dex 或 apk 文件,也是 getSystemClassLoader 的返回对象
  • DexClassLoader:可以用于加载任意路径的 zip,jar 或者 apk 文件,也是进行安卓动态加载的基础

Read More

Android常见问题整理

问题描述

1
2
3
4
5
6
7
8
!SESSION 2017-08-29 15:27:40.107 ----------------------------------------------- 
eclipse.buildId=unknown java.version=1.8.0_112-release java.vendor=JetBrains s.r.o BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=zh_CN Command-line arguments: -os win32 -ws win32 -arch x86_64 -data @noDefault
...
!ENTRY org.eclipse.osgi 4 0 2017-08-29 15:27:41.441
!MESSAGE Application error !STACK 1 java.lang.NullPointerException
at org.eclipse.core.runtime.URIUtil.toURI(URIUtil.java:280)
at org.eclipse.e4.ui.internal.workbench.ResourceHandler.loadMostRecentModel(ResourceHandler.java:127)
...

解决办法

  1. 进程管理器中杀死monitor.exe进程;
  2. 删除$HOME/.android/monitor-workspace目录
Read More

包体积优化

删除无用资源

底层库优化

有时候,可能只使用了开源库中对某部分功能,可以对其源码进行删减重新打包。

图片压缩

放入项目之前,对图片进行压缩,比如使用tinypng

图片资源格式的选择

优先选择使用webp格式

Gradle配置

minifyEnabled true //删除无用代码
shrinkResources true  //删除无用资源

Read More

Android中的集合

SparseArray

SparseArray由两个数组mKeys和mValues存放数据;其中key的类型为int型,这就显得SparseArray比HashMap更省内存一些。SparseArray存储的元素都是按元素的key
值从小到大排列好的。使用二分查找来判断元素的位置,数据量较小时比HashMap更快。

  • SparseIntArray:当map的结构为Map<Integer,Integer>的时候使用,效率较高。
  • SparseBooleanArray: 当map的结构为Map<Integer,Boolean>的时候使用,效率较高。
  • SparseLongArray: 当map的结构为Map<Integer,Long>的时候使用,效率较高。
Read More