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性能优化:

  1. 性能优化目标和工具
  2. 内存优化技巧
  3. 启动优化方法
  4. 布局优化策略
  5. 电量优化方案
  6. 列表优化技巧
  7. ANR优化

性能优化是一个持续的过程,需要在开发中不断关注和改进。

最后更新:2026-03-26