戳蓝字“牛晓伟”关注我哦!
用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章,技术文章也可以有温度。
前言
问题系列主要的作用是把我在研究Android源码过程中遇到的各种问题集合起来,当然这些问题在Stack Overflow、google是没有搜到解决方案的,希望本系列可以帮助大家。
1. 问题描述
Android Studio调试services源码时不显示参数、局部变量值。(Android 13代码)
2. 原因与解决
原因
是因为在编译services.jar的时候开启了混淆,混淆即对代码中的类名、变量名、方法名等变为简单、难懂的名字,这样人无法看明白这些名字,就很难去猜测代码意思。这是导致调试的时候显示不了参数、局部变量的值原因。如下代码:
//文件名:services/Android.bp
java_library {
name: "services",
defaults: ["services_java_defaults"],
installable: true,
dex_preopt: {
app_image: true,
profile: "art-profile",
},
省略代码······
}
soong_config_module_type {
name: "system_optimized_java_defaults",
module_type: "java_defaults",
config_namespace: "ANDROID",
bool_variables: ["SYSTEM_OPTIMIZE_JAVA"],
properties: ["optimize"],
}
//下面配置会对代码进行混淆、裁剪
system_optimized_java_defaults {
name: "services_java_defaults",
soong_config_variables: {
SYSTEM_OPTIMIZE_JAVA: {
optimize: {
enabled: true,
// TODO(b/210510433): Enable optimizations after improving
// retracing infra.
optimize: false,
shrink: true,
proguard_flags_files: ["proguard.flags"],
},
// Note: Optimizations are disabled by default if unspecified in
// the java_library rule.
conditions_default: {},
},
},
}
做过App开发的同学应该都清楚,App的release版本代码也是需要开启混淆和代码裁剪的,谁曾想到services.jar也进行了代码混淆和代码裁剪的。
解决
解决该问题就非常简单了,把混淆关掉重新编译services.jar后,push到Android设备即可。如下代码:
//文件名:services/Android.bp
//下面配置会对代码进行混淆、裁剪
system_optimized_java_defaults {
name: "services_java_defaults",
soong_config_variables: {
SYSTEM_OPTIMIZE_JAVA: {
optimize: {
//置为false,混淆不可用
enabled: false,
// TODO(b/210510433): Enable optimizations after improving
// retracing infra.
optimize: false,
//把裁剪也置为false
shrink: false,
proguard_flags_files: ["proguard.flags"],
},
// Note: Optimizations are disabled by default if unspecified in
// the java_library rule.
conditions_default: {},
},
},
}
欢迎关注我的公众号