Android编译选项eng、user、userdebug的区别

本文详细解释了Android编译选项eng、user和userdebug的区别,包括它们对应的编译配置及安装模块的不同。eng版本适用于平台级调试,user版本用于最终发布,而userdebug则介于两者之间,适合有限的调试使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要了解Android编译选项eng、user和userdebug的区别,需先了解下LOCAL_MODULE_TAGS这一Android.mk文件里的配置项,一般配置形式为LOCAL_MODULE_TAGS := user eng optional test这个样子。
    那么LOCAL_MODULE_TAGS设置为不同值有何作用呢?下面是对应不同值编译的结果:
    1、user:只有在user版本时该模块才被编译进去;
    2、eng:只有在eng版本时该模块才被编译进去
    3、test:只有在tests版本时该模块才被编译进去
    4、optional:在所有版本中都编译该模块进去。
    其中的值可设置为1个或多个,分别对应编译选项的同一个或多个。那么eng、user、userdebug的区别是什么呢?接下来一一揭开:
    1、当make eng时,也即相当于make。此时BuildType为eng,那么其编译进去的内容包括:
      · Intended for platform-level debugging
      · Installs modules tagged with: eng, debug, user, and/or development
      · Installs non-APK modules that have no tags specified
      · Installs APKs according to the product definition files, in addition to tagged APKs
      · Sets ro.secure=1
      · Sets ro.debuggable=0
      · Sets ro.kernel.android.checkjni=1
      · adbd is enabled by default
    2、当make user时,此时BuildType为user,那么其编译进去的内容包括:
      · Intended to be the final release
      · Installs modules tagged as user
      · Installs non-APK modules that have no tags specified
      · Installs APKs according to the product definition files (tags are ignored for APK modules)
      · Sets ro.secure=1
      · Sets ro.debuggable=0
      · adbd is disabled by default
    3、当make userdebug时,此时BuildType为userdebug,那么其编译进去的内容包括:
       the same as user, except:
      · Intended for limited debugging
      · Installs modules tagged with debug
      · Sets ro.debuggable=1
      · adbd is enabled by default 
    参考网址:http://hi.baidu.com/aokikyon/item/194b9bd9a6188ef593a9740e
              http://www.rosoo.net/a/201108/14878.html
              http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359.html
<think>我们要解决的问题:如何在Android13中设置工程模式(通常指开发人员选项)在userdebug版本上默认关闭。根据Android的构建系统,不同的构建类型(user,userdebug,eng)有不同的默认配置。在userdebug构建中,默认会开启开发人员选项(包括USB调试等),而用户希望默认关闭。思路:1.开发人员选项的开启状态由系统设置中的一个数据库值控制。具体来说,是Settings.Global.DEVELOPMENT_SETTINGS_ENABLED(值为"development_settings_enabled")。2.在userdebug构建中,默认这个值会被设置为1(开启)。我们需要修改这个默认值,使其为0(关闭)。3.我们可以在系统源码中寻找设置该默认值的地方,然后修改构建类型为userdebug时的默认值。具体步骤:在Android源码中,开发人员选项的默认值可能在frameworks/base/packages/SettingsProvider/res/values/defaults.xml中定义,但具体控制构建类型的默认值通常是通过构建系统区分资源来实现的。然而,我们注意到开发人员选项的默认值在不同的构建类型下是不同的。在AOSP中,这个默认值是通过条件编译设置的。我们可以修改SettingsProvider模块中的资源文件,使得在userdebug构建中,默认关闭开发人员选项。实际代码位置:在frameworks/base/packages/SettingsProvider路径下,有多个defaults.xml文件,分别对应不同的构建类型:-res/values/defaults.xml(通用)-res/values-userdebug/defaults.xml(针对userdebug构建)-res/values-eng/defaults.xml(针对eng构建)通常,在userdebug构建中,会使用res/values-userdebug/defaults.xml来覆盖默认值。因此,我们需要修改res/values-userdebug/defaults.xml文件,将development_settings_enabled的值设为false(即0)。具体修改:在res/values-userdebug/defaults.xml中,添加或修改:<boolname="def_development_settings_enabled">false</bool>注意:如果已经存在这个条目,直接将其值改为false;如果不存在,则添加。但是,我们还必须确认SettingsProvider在实际初始化数据库时使用的是这个默认值。这个默认值会被SettingsProvider加载到Settings.Global表。另外,还有一种可能是在代码中直接根据构建类型设置默认值。我们需要检查SettingsProvider的代码。在SettingsProvider中,有一个类叫做DefaultSettingsState,它负责设置默认值。我们查看frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java,但实际上默认值是从资源文件读取的。所以,修改资源文件是最直接的方式。但是,请注意:在userdebug构建中,还有一些其他的默认开启的调试选项,我们也需要一并考虑。但用户只要求关闭开发人员选项(即菜单入口),所以上述修改即可。此外,由于我们修改的是默认值,所以只对首次启动或恢复出厂设置后生效。如果用户已经升级,并且之前已经开启了开发人员选项,则这个修改不会改变已有的设置(因为数据库已经存在该值,不会重新设置默认值)。因此,这个修改主要影响新设备或者恢复出厂设置的设备。步骤总结:1.修改文件:frameworks/base/packages/SettingsProvider/res/values-userdebug/defaults.xml2.在<resources>标签内添加或修改:<boolname="def_development_settings_enabled">false</bool>3.编译userdebug版本并烧写测试。如果上述方法不起作用,我们可能需要检查在SettingsProvider中是否还有其他的地方控制了开发人员选项的默认状态。另外,还有一种方法是修改构建系统变量,但上述方法更为直接。注意:由于Android系统版本差异,如果Android13中已经改变了这个机制,那么需要根据实际情况调整。但是根据经验,上述方法在Android11/12上有效,因此13上应该类似。如果没有values-userdebug目录,那么可能只有通用的defaults.xml,这时我们可以通过构建系统来区分。但是,在AOSP中,通常已经存在这个目录。此外,我们也可以考虑在系统属性中设置,然后由SettingsProvider根据系统属性来设置默认值。但这需要修改SettingsProvider的代码,不如修改资源文件简单。最后,需要说明的是,这种修改可能会影响CTS测试,因为CTS要求userdebug构建开启某些调试功能。但只是关闭开发人员选项入口,可能不会影响底层的调试能力(如adb)。因此,需要具体测试。然而,用户问题中提到的工程模式(通常指在设置中的“开发人员选项”)被关闭了,但adb调试功能可能还是开启的(因为userdebug构建中adb默认开启)。所以,如果用户希望同时关闭adb调试,我们还需要另外设置。但用户的问题只要求关闭工程模式(即开发人员选项入口),所以我们只处理这个默认开关。如果按照上面的步骤修改后,开发人员选项在设置菜单中应该不会出现(默认关闭)。用户可以通过多次点击版本号来再次开启。另外,我们还可以从用户提供的引用中得到一点线索:用户之前提到了USB连接模式(MTP)和WiFi静态IP的设置,这些设置可能也受到开发人员选项的影响。不过,本修改只针对开发人员选项的开关,不涉及其具体功能。现在,我们来整理一下设置步骤。设置步骤:1.在AOSP源码中,进入目录:frameworks/base/packages/SettingsProvider/res/values-userdebug2.编辑defaults.xml文件(如果不存在,则创建)3.确保包含以下内容:<?xmlversion="1.0"encoding="utf-8"?><resources>...其他内容...<boolname="def_development_settings_enabled">false</bool></resources>4.保存文件,重新编译userdebug版本。验证:烧录新编译的系统,首次启动后,进入设置->关于手机->版本号,连续点击多次,会显示“您已处于开发者模式”(或类似提示),然后返回到设置主界面,应该可以看到“开发人员选项”出现(这是手动开启的方法)。如果之前没有出现,则说明修改成功。注意:由于是默认关闭,所以首次启动后“开发人员选项”不会出现在设置菜单中,除非用户手动开启。但是,我们需要知道,开发人员选项的入口不仅仅受development_settings_enabled影响,还受其他策略限制(如设备管理策略)。我们的修改只针对默认设置。如果在userdebug版本中,我们期望其他调试功能(如adb)仍然存在,那么只修改这个入口开关即可,不影响实际调试功能的使用。最后,注意在Android13中,资源文件的路径和结构可能发生变化,但基本原理相同。如果找不到对应目录,可以搜索def_development_settings_enabled在源码中的位置,然后找到对应的资源文件进行修改。另外,如果用户需要关闭其他默认开启的调试功能(如adb),则还需要修改其他设置,例如:在defaults.xml中设置:def_debug_view_attributes->falsedef_debug_app->nulldef_wait_for_debugger->falsedef_force_rtl->falsedef_adb_enabled->false(关闭adb)等等但本问题只要求关闭开发人员选项(即入口),所以只修改development_settings_enabled即可。总结:通过修改SettingsProvider的资源文件,可以实现在userdebug版本中默认关闭开发人员选项。</think> ### Android 13 设置工程模式 userdebug 默认关闭的方法 在Android 13中,要将userdebug构建类型的"开发人员选项"(工程模式)默认关闭,需要通过修改系统配置实现。以下是具体步骤: --- ### **1. 修改`SettingsProvider`资源文件** **文件路径**: `frameworks/base/packages/SettingsProvider/res/values/config.xml` **修改内容**: 定位到控制开发选项的布尔值配置项,添加: ```xml <bool name="config_development_settings_enabled">false</bool> ``` --- ### **2. 针对不同构建类型配置** **userdebug专属配置路径**: `frameworks/base/packages/SettingsProvider/res/values-userdebug/` **操作**: 在该目录下的`bools.xml`中添加: ```xml <resources> <bool name="def_development_settings_enabled">false</bool> </resources> ``` > **原理**: > 系统通过构建类型区分资源加载。当设备以userdebug模式构建时,系统优先加载`values-userdebug/`目录下的配置值,覆盖默认设置。 --- ### **3. 更新系统服务逻辑** 在系统初始化过程中,需确保服务不主动开启开发选项: ```java // 在SystemServer或相关服务初始化代码中 if (Build.IS_DEBUGGABLE) { // userdebug/eng构建时条件为真 Settings.Global.putInt(getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0); // 0表示关闭 } ``` > **验证点**: > `DevelopmentSettingsDashboardFragment.java`中会检查`SETTING_GLOBAL.DEVELOPMENT_SETTINGS_ENABLED`值 --- ### **4. 编译与验证** 1. 修改后执行完整构建: ```bash source build/envsetup.sh lunch aosp_<device>-userdebug m -j ``` 2. 刷机后检查: - 首次开机进入**设置 > 系统 > 开发者选项** - 默认状态应为关闭,且无法从设置中直接访问 - 需通过**设置 > 关于手机 > 多次点击版本号**重新激活入口 --- ### **关键机制说明** 1. **构建类型标志**: `Build.IS_DEBUGGABLE`在userdebug/eng模式下自动设为`true`[^1] 2. **开发选项持久化**: 状态存储在`Settings.Global`数据库,键名`development_settings_enabled`[^2] 3. **入口控制逻辑**: 在`DevelopmentSettings.java`中通过`showDeveloperOptions()`方法检查开关状态和系统属性 --- ### **注意事项** - 此修改**不影响adb调试功能**(userdebug默认adb开启) - 设备恢复出厂设置后会自动回归修改后的默认状态 - 需结合**设备管理策略**(如`DevicePolicyManager`)增强企业级控制 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值