Android性能优化 #
一、性能优化概述 #
1.1 优化目标 #
- 流畅度:60FPS,16ms内完成渲染
- 内存:避免OOM,减少内存占用
- 电量:减少耗电操作
- 启动:快速启动,减少等待时间
1.2 性能分析工具 #
| 工具 | 用途 |
|---|---|
| Android Profiler | CPU、内存、网络分析 |
| Layout Inspector | 布局层次分析 |
| Systrace | 系统级性能分析 |
| LeakCanary | 内存泄漏检测 |
| StrictMode | 严格模式检测 |
二、内存优化 #
2.1 避免内存泄漏 #
kotlin
// 错误:Activity泄漏
class MyActivity : AppCompatActivity() {
companion object {
private var instance: MyActivity? = null
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
instance = this // 泄漏
}
}
// 正确:使用弱引用
class MyActivity : AppCompatActivity() {
companion object {
private var instance: WeakReference<MyActivity>? = null
}
}
2.2 Handler内存泄漏 #
kotlin
// 错误
class MyActivity : AppCompatActivity() {
private val handler = Handler(Looper.getMainLooper())
private val runnable = Runnable {
// 使用Activity引用
}
}
// 正确
class MyActivity : AppCompatActivity() {
private val handler = Handler(Looper.getMainLooper())
override fun onDestroy() {
super.onDestroy()
handler.removeCallbacksAndMessages(null)
}
}
2.3 Bitmap优化 #
kotlin
// 加载缩略图
val options = BitmapFactory.Options().apply {
inSampleSize = 4 // 缩小4倍
}
val bitmap = BitmapFactory.decodeFile(path, options)
// 使用Glide自动优化
Glide.with(context)
.load(url)
.override(200, 200)
.into(imageView)
2.4 内存抖动 #
kotlin
// 错误:在onDraw中创建对象
override fun onDraw(canvas: Canvas) {
val paint = Paint() // 每次创建
canvas.drawRect(rect, paint)
}
// 正确:复用对象
private val paint = Paint()
override fun onDraw(canvas: Canvas) {
canvas.drawRect(rect, paint)
}
三、启动优化 #
3.1 启动类型 #
| 类型 | 说明 |
|---|---|
| 冷启动 | 进程不存在,需要创建 |
| 温启动 | 进程存在,Activity需要重建 |
| 热启动 | 进程和Activity都存在 |
3.2 优化Application #
kotlin
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
// 只做必要的初始化
initEssential()
// 延迟初始化
GlobalScope.launch(Dispatchers.IO) {
initNonEssential()
}
}
private fun initEssential() {
// 必要的初始化
}
private fun initNonEssential() {
// 非必要的初始化
}
}
3.3 使用App Startup #
kotlin
dependencies {
implementation("androidx.startup:startup-runtime:1.1.1")
}
class MyInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 初始化代码
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
xml
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.MyInitializer"
android:value="androidx.startup" />
</provider>
3.4 懒加载 #
kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 延迟加载非关键UI
binding.root.post {
loadNonEssentialUI()
}
}
}
四、布局优化 #
4.1 减少布局层级 #
xml
<!-- 使用ConstraintLayout减少层级 -->
<androidx.constraintlayout.widget.ConstraintLayout>
<TextView />
<Button />
</androidx.constraintlayout.widget.ConstraintLayout>
4.2 使用merge #
xml
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView />
<Button />
</merge>
4.3 使用ViewStub #
xml
<ViewStub
android:id="@+id/stub"
android:layout="@layout/progress_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
kotlin
binding.stub.inflate()
4.4 避免过度绘制 #
kotlin
// 检查过度绘制
// 开发者选项 -> 调试GPU过度绘制
// 移除不必要的背景
<LinearLayout
android:background="@null">
五、电量优化 #
5.1 减少网络请求 #
kotlin
// 批量请求
suspend fun fetchAllData() {
val deferred1 = async { api.getData1() }
val deferred2 = async { api.getData2() }
val result1 = deferred1.await()
val result2 = deferred2.await()
}
5.2 使用WorkManager #
kotlin
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build()
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
5.3 定位优化 #
kotlin
// 使用合适的定位精度
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_BALANCED_POWER_ACCURACY,
10000L // 10秒更新一次
).build()
5.4 后台任务优化 #
kotlin
// 使用JobScheduler
val jobInfo = JobInfo.Builder(JOB_ID, ComponentName(this, MyJobService::class.java))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build()
val jobScheduler = getSystemService(JobScheduler::class.java)
jobScheduler.schedule(jobInfo)
六、列表优化 #
6.1 RecyclerView优化 #
kotlin
// 设置缓存大小
recyclerView.setItemViewCacheSize(20)
// 使用DiffUtil
class UserDiffCallback : DiffUtil.ItemCallback<User>() {
override fun areItemsTheSame(oldItem: User, newItem: User): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: User, newItem: User): Boolean {
return oldItem == newItem
}
}
6.2 ViewHolder优化 #
kotlin
class UserViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val nameView: TextView = view.findViewById(R.id.name)
fun bind(user: User) {
// 避免在bind中创建对象
nameView.text = user.name
}
}
七、ANR优化 #
7.1 避免主线程阻塞 #
kotlin
// 错误:主线程IO操作
fun loadData() {
val data = File("data.txt").readText() // ANR
}
// 正确:使用协程
fun loadData() {
lifecycleScope.launch(Dispatchers.IO) {
val data = File("data.txt").readText()
withContext(Dispatchers.Main) {
updateUI(data)
}
}
}
7.2 使用StrictMode检测 #
kotlin
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build()
)
}
八、总结 #
本章详细介绍了Android性能优化:
- 性能优化目标和工具
- 内存优化技巧
- 启动优化方法
- 布局优化策略
- 电量优化方案
- 列表优化技巧
- ANR优化
性能优化是一个持续的过程,需要在开发中不断关注和改进。
最后更新:2026-03-26