Debug with Android Emulator

本文指导如何通过分步调试方法学习Android,并以WebKit为例深入解析调试过程。包括下载编译x86emulator及DebugJavaFrame和C++库,解决编译bug,配置调试选项,以及在Eclipse中进行Java与C++部分的调试。

摘要

研究Android, 最好的方法莫过于Step by Step地Debug。本文记录了下载编译x86 emulator及Debug Java Frame和C++库的过程。以WebKit为例,介绍Android的调试过程。

代码下载

从Google下载源码,本文以Android 4.2.2 r1学习WebKit为例。如果你也和我一样从Google下载Android源码有困难,可以从这里下载

下载eclipse: >>>>

下载ADT, 需要和Android SDK对应,查看一下Android 4.2.2 r1的SDK需要的ADT版本是20.0.0

$ cat sdk/files/plugin.prop 
# begin plugin.prop
plugin.version=20.0.0
http :// dl.google.com/android/ADT-21.0.0.zip

编译之前

先解决两个编译bug: http://blog.youkuaiyun.com/telnetchen/article/details/17596181

加上调试所需要的编译选项

在这里加上framework的调试信息

frameworks/base/core/java/android/webkit/DebugFlags.java

拷贝build/buildspec.mk.default到根目录并且改名为buildspec.mk,加入以下内容:

DEBUG_MODULE_libwebcore:=true
DEBUG_MODULE_libxml2:=true
DEBUG_MODULE_libchromium_net := true
TARGET_CUSTOM_DEBUG_CFLAGS:=­-O0 ADDITIONAL_BUILD_PROPERTIES += debug.db.uid=100000

查找所有模块:

确认以下的配置(false),以免出现文件过大的编译错误

external/webkit、Android.mk:
LOCAL_PRELINK_MODULE := false

编译

source build/envsetup.sh
lunch full_x86-eng 
make sdk -jx

生成的SDK目录:out/host/linux-x86/sdk/android-sdk_eng.${USER}_linux-x86

安装ADT及指定SDK

打开Eclipse, Help -> Install New Software ...

安装完ADT后,Eclipse要求重启,启动起来会要求SDK

创建一个简单的WebKit应用并开始调试

Java部分可以在Eclipse中逐步跟踪,对于C++部分,还需要用gdb

Run the following command on your computer: 
adb forward tcp:5039 tcp:5039
Run the following command on your running emulator: 
gdbserver 10.0.2.2:5039 ­­attach pid
Run the following commands in gdb:
set solib­-absolute­p-refix out/target/product/generic_x86/symbols
set solib­-search­-path out/target/product/generic_x86/symbols/system/lib
file out/target/product/generic_x86/symbols/system/app_process
在某个地方设置一个break point,就可以用你喜欢的gdb了.

对于Java部分如果还提示找不到某个文件,可以让它去framework目录下继续找。

<think>好的,用户的问题是如何在Android开发中避免硬编码debuggable属性,并自动分配调试和发布模式。首先,我需要回忆一下Android构建系统的相关知识。通常,在Android项目中,build.gradle文件用于配置构建变体,比如debug和release。用户可能不想在AndroidManifest.xml中直接写android:debuggable="true"或false,这样硬编码会导致切换环境时需要手动修改,容易出错。 接下来,我应该考虑使用Gradle的构建变体来自动管理debuggable属性。Gradle允许为不同的构建类型设置不同的参数,比如debug类型自动启用调试,release类型禁用。这样在构建时,对应的属性会自动应用到APK上,无需手动修改清单文件。 然后,检查用户提供的引用内容。引用[1]提到处理异常时不会展开原生堆栈帧,这可能与调试相关,但暂时不直接关联。引用[2]讨论了JEB动态调试的模式,说明调试模式影响启动过程,这可能意味着用户希望根据构建类型自动设置debuggable,以便在需要时附加调试器。引用[3]中的进程初始化判断示例,可能提示用户希望在不同构建类型下执行不同代码,比如仅在debug模式下初始化某些调试工具。 接下来,我需要确定如何通过Gradle配置自动设置debuggable。在模块的build.gradle文件中,android块下的buildTypes可以定义debug和release,并在其中设置debuggable属性。例如,debug构建类型默认debuggable为true,而release为false。这样Gradle在构建时会自动处理,无需硬编码。 另外,用户可能希望在代码中根据是否是调试模式来执行不同逻辑。这时候可以使用BuildConfig.DEBUG,这是一个由Gradle自动生成的布尔值,在debug构建时为true,release为false。这样可以在应用代码中条件执行调试相关的代码,比如日志输出或初始化调试工具。 还需要考虑如何避免在AndroidManifest.xml中硬编码debuggable。实际上,Gradle在构建时会自动根据构建类型覆盖该属性,所以无需在清单文件中设置。如果存在冲突,需要确保清单中没有显式的android:debuggable,而是由构建系统控制。 此外,可能需要处理自定义构建变体的情况,比如有多个flavor或组合构建类型。这时候需要确保每个变体正确继承或覆盖debuggable属性。例如,在productFlavors中定义不同的配置,但通常主buildTypes的配置会更优先。 用户可能还关心如何验证配置是否生效。可以建议检查生成的APK的AndroidManifest.xml,确认debuggable属性是否正确设置。或者通过代码中判断BuildConfig.DEBUG的值来测试。 最后,总结步骤:配置build.gradle中的buildTypes,利用BuildConfig.DEBUG在代码中区分环境,避免清单文件中的硬编码,并处理多进程或初始化时的条件判断。同时,确保构建系统自动管理这些属性,提升开发效率和减少错误。</think>在Android开发中避免硬编码调试模式的最佳实践可通过Gradle构建系统实现自动配置,以下是具体实现方案: ### 1. 使用Gradle构建变体自动配置 在模块级`build.gradle`中通过构建类型自动设置`debuggable`属性: ```groovy android { buildTypes { debug { debuggable true minifyEnabled false } release { debuggable false minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } ``` Gradle会自动为不同构建类型生成对应的APK,其中`debug`构建类型默认开启调试能力[^2] ### 2. 代码中动态判断模式 通过`BuildConfig.DEBUG`自动识别当前模式: ```java if (BuildConfig.DEBUG) { // 调试模式专用代码 initDebugTools(); enableStetho(); } else { // 正式包行为 disableLogger(); } ``` ### 3. 多进程环境处理 结合进程判断实现精准初始化: ```java public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); String processName = getProcessName(); boolean isMainProcess = processName.equals(getPackageName()); if (BuildConfig.DEBUG && isMainProcess) { // 主进程调试初始化 initDebugMonitor(); } } } ``` 这种模式可避免调试代码泄漏到非目标进程[^3] ### 4. 安全验证配置 通过合并后的清单文件验证: ```xml <!-- 最终生成结果示例 --> <application android:debuggable="true" <!-- debug构建自动注入 --> ...> ``` ### 5. 进阶配置(可选) 使用自定义字段扩展调试能力: ```groovy buildTypes { debug { buildConfigField "boolean", "ENABLE_CRASHLYTICS", "false" } release { buildConfigField "boolean", "ENABLE_CRASHLYTICS", "true" } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值