上一篇
安卓应用检测注意事项
- 行业动态
- 2025-04-21
- 5
安卓应用检测核心注意事项
权限管理
危险权限声明
- 必须动态申请敏感权限(如位置、通讯录、录音等),未申请直接使用会导致崩溃。
- 示例:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- 动态申请代码:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE); }
权限分组逻辑
- Android 6.0+ 将权限分为“普通权限”和“危险权限”,危险权限需动态申请。
- 常见危险权限组:
| 权限组 | 示例权限 | 用途 |
|———|———-|——|
| 位置 |ACCESS_FINE_LOCATION
| 定位功能 |
| 存储 |WRITE_EXTERNAL_STORAGE
| 文件读写 |
| 通讯录 |READ_CONTACTS
| 获取联系人信息 |
安全破绽检测
组件暴露风险
- 未设置
android:exported="false"
的Activity
、Service
、Receiver
可能被外部应用调用。 - 示例:
<activity android:name=".MainActivity" android:exported="false"> ... </activity>
- 未设置
WebView安全隐患
- 禁用
file
协议访问:<WebView android:layout_width="match_parent" android:layout_height="match_parent" android:webViewClient="true" />
- 启用混合内容限制(HTTPS环境下禁止HTTP资源):
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW);
- 禁用
代码混淆与反调试
- 使用 ProGuard/R8 混淆代码,避免逆向分析:
-keep class . { ; } -dontwarn android.support.
- 使用 ProGuard/R8 混淆代码,避免逆向分析:
性能优化
启动时间检测
- 使用
adb shell am start-activity
测量冷启动时间,目标控制在 3秒内。 - 优化方向:减少主线程阻塞、异步加载资源。
- 使用
内存泄漏检测
- 工具:Android Studio Profiler、LeakCanary。
- 常见场景:未解绑
BroadcastReceiver
、未关闭Cursor
、静态引用持有上下文。
耗电分析
- 使用 Battery Historian 分析电量消耗,重点关注:
- 频繁唤醒的
AlarmManager
。 - 后台服务(如定位、蓝牙)未及时关闭。
- 频繁唤醒的
- 使用 Battery Historian 分析电量消耗,重点关注:
兼容性测试
屏幕适配
- 支持不同分辨率(如 1080×1920、720×1280)和密度(ldpi~xxxhdpi)。
- 使用
dp
/sp
单位,避免写死像素值。
系统版本兼容
- 最低支持版本需声明:
defaultConfig { minSdkVersion 21 // Android 5.0 }
- 动态判断 API 版本:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Android 6.0+ 特有逻辑 }
- 最低支持版本需声明:
厂商ROM适配
- 测试主流厂商(华为、小米、OPPO、三星)的定制系统,注意:
- 华为的
Android 10+
移除了第三方后台启动限制。 - MIUI 的权限管理更严格。
- 华为的
- 测试主流厂商(华为、小米、OPPO、三星)的定制系统,注意:
隐私合规
个人信息收集声明
- 在
AndroidManifest.xml
中声明隐私政策网址:<application android:name=".App" android:usesCleartextTraffic="true"> <meta-data android:name="com.example.privacy_policy" android:value="https://xxx.com/privacy" /> </application>
- 在
SDK合规性
集成第三方SDK需确认其符合《个人信息保护法》要求,避免违规采集用户数据。
代码质量检测
Lint检查
- 使用 Android Lint 检查代码规范问题(如未使用资源、内存泄漏风险)。
- 命令:
./gradlew lint
。
依赖库安全性
- 检查
build.gradle
中的依赖库版本,避免使用已知破绽版本(通过dependencyCheck
插件)。
- 检查
相关问题与解答
问题1:如何判断应用是否过度申请权限?
解答:
- 根据功能必要性评估权限,
- 必要权限:实现核心功能必须的权限(如地图类应用需要位置权限)。
- 非必要权限:与功能无关的权限(如申请通讯录权限仅用于统计用户)。
- 使用工具:Android Studio的“权限使用情况”报告,或手动审查代码中权限申请逻辑。
问题2:应用在后台被杀死后如何恢复服务?
解答:
- 方案1:JobScheduler
- 适用于定时任务(如同步数据),系统会根据资源情况自动调度。
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); JobInfo job = new JobInfo.Builder(jobId, new ComponentName(this, MyJobService.class)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .build(); jobScheduler.schedule(job);
- 适用于定时任务(如同步数据),系统会根据资源情况自动调度。
- 方案2:WorkManager
- 兼容不同系统版本的后台任务,支持周期性工作。
WorkManager.getInstance(context).enqueue(new OneTimeWorkRequest.Builder(MyWorker.class).build());
- 兼容不同系统版本的后台任务,支持周期性工作。