Android编译版本eng、user和userdebug的区别

Android编译版本eng、user和userdebug的区别:

一、Android官网的解释

eng This is the default flavor. A plain make is the same as make eng.

*       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.
*       ro.secure=0
*       ro.debuggable=1
*       ro.kernel.android.checkjni=1
*       adb is enabled by default.
*       Setupwizard is optional
user make user
This is the flavor intended to be the final release bits.
*       Installs modules tagged with user.
*       Installs non-APK modules that have no tags specified.
*       Installs APKs according to the product definition files; tags are ignored for APK modules.
*       ro.secure=1
*       ro.debuggable=0
*       adb is disabled by default.
*       Enable dex pre-optimization for all TARGET projects in default to speed up device first boot-up
userdebug make userdebug
The same as user, except:
*       Also installs modules tagged with debug.
*       ro.debuggable=1

*       adb is enabled by default.

 

二、对编译版本MTK的补充说明

 

MTK 补充说明差异:(
(1) Debug/LOG 方面,原则上user 版本只能抓到有限的资讯,eng 可以抓到更多的资讯,Debug 能力更强,推崇使用eng 版本开发测试
*       因user/eng 版本设置ro.secure不同,导致user 版本adb 只拥有shell 权限,而eng 版本具有root 权限
*       MTK System LOG 在ICS 以后,在user 版本默认关闭全部LOG, 在eng 版本中默认打开,以便抓到完整的资讯
*       在eng 版本上,LOG 量 >= user 版本的log 量,一些地方会直接check eng/user 版本来确认是否打印LOG
*       user 版本默认关闭uart, eng 版本默认开启uart
*       在eng 版本上,开启ANR 的predump, 会抓取ftrace,可以得到更多ANR的资讯
*       在eng 版本上,可用rtt 抓取backtrace,可开启kdb 进行kernel debug, 可用ftrace 抓取cpu 执行场景
*       MTK aee 在ENG 版本抓取更多的异常资讯,比如native exception 会抓取core dump 信息

 

(2) 性能方面,原则上进行性能测试请使用user 版本测试
*       user 版本为提高第一次开机速度,使用了DVM 的预优化,将dex 文件分解成可直接load 运行的odex 文件,ENG 版本不会开启这项优化
*       更少的LOG 打印,uart 的关闭,原则上user 版本的性能要优于eng 版本

 

(3) 如何确认user/eng 版本
*       Java 层,check android.os.Build 类中的TYPE 值
*       native 层,property_get("ro.build.type", char* value, "eng"); 然后check value 值
*       Debug 时, adb shell getprop ro.build.type 返回值如果是user 即user 版本,eng 即eng 版本
*       Log 确认,  mobile log/Aplog_xxxxx/versions 中查看ro.build.type 属性

 

(4) 如何编译user/eng 版本
*       默认编译是eng 版本,如果需要编译user 版本,请加入参数 -o=TARGET_BUILD_VARIANT=user 如:
        ./mk -o=TARGET_BUILD_VARIANT=user mt6577_phone new

default.prop和/system/build.prop

 

 

三、编译版本与ADB、root的控制关系

1. root权限:adb.c中与属性ro.kernel.qemu(是否是模拟器)、ro.secure、ro.debuggable、service.adb.root几个相关联。

    service.adb.root : services.c -> restart_root_service()中设置

    build/core/main.mk的如下地方决定了了ro.secure和ro.debuggable的值

user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
enable_target_debugging := true
tags_to_install :=
ifneq (,$(user_variant))
  # Target is secure in user builds.
  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
...
else # !user_variant
  # Turn on checkjni for non-user builds.
  ADDITIONAL_BUILD_PROPERTIES += ro.kernel.android.checkjni=1
  # Set device insecure for non-user builds.
  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0
  # Allow mock locations by default for non user builds
  ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1
endif # !user_variant

ifeq (true,$(strip $(enable_target_debugging)))
  # Target is more debuggable and adbd is on by default
  ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1
  # Include the debugging/testing OTA keys in this build.
  INCLUDE_TEST_OTA_KEYS := true
else # !enable_target_debugging
  # Target is less debuggable and adbd is off by default
  ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=0
endif # !enable_target_debugging
## eng ##
...
endif

2. 是否开启adbd服务:UsbDeviceManager.java中与属性persist.sys.usb.config、sys.usb.config、persist.service.adb.enable几个相关联

    persist.sys.usb.config:/build/tools/post_process_props.py中根据ro.debuggable来设置persist.sys.usb.config的初始值

    sys.usb.config:UsbDeviceManager.java ->  setUsbConfig

文件init.clippers.usb.rc中监听了sys.usb.config属性变化时的动作

on property:sys.usb.config=adb
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 1b20
    write /sys/class/android_usb/android0/idProduct 0c81
    write /sys/class/android_usb/android0/functions ffs
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state ${sys.usb.config}

    persist.service.adb.enable : 对旧版android系统的adb的

 

根据如上的叙述,如果理解了原理,很容易就知道如何控制开关root权限和控制开关adbd服务。

 

原文链接:https://blog.csdn.net/ysh149216447/article/details/53396670

<think>嗯,用户想知道如何在Android设备上检测当前运行的版本是否为userdebug。我需要根据他们提供的引用资料来整理答案。首先,引用1提到通过TARGET_BUILD_VARIANT来判断编译版本,如果是userdebugeng的话,ALLOW_ADBD_NO_AUTH为1。这可能是在编译时的属性,但用户可能想知道在运行时如何检测。然后引用3提到了adb shell命令来查看版本,比如通过getprop或者检查ro.build.type属性。 用户的问题分两个部分:检测当前运行的build类型是否为userdebug,以及如何在代码中进行判断。根据引用3,使用adb shell getprop ro.build.type可以返回useruserdebugeng。这应该是一个直接的方法。另外,在代码中,可以通过Build.TYPE来获取这个属性,比如Build.TYPE.equals("userdebug")。需要确认这个字段是否可靠,但根据常见的Android API,Build类确实包含这些信息。 另外,引用1提到的TARGET_BUILD_VARIANT可能是在编译时的变量,而用户可能需要的是运行时检测。所以答案应该集中在运行时的方法,比如使用系统属性或者Build类的字段。另外,用户可能没有root权限,所以方法应该不需要root。adb方法适合通过命令行检查,而代码中的方法适合在应用内部判断。 还要注意用户可能是在开发过程中需要这个判断,比如根据不同的版本启用不同的功能或日志。需要确保提供的方法准确,并且考虑到不同的设备可能有不同的设置,比如自定义ROM可能修改这些属性,但一般情况下,ro.build.type是标准的。</think>在Android中检测当前设备是否为userdebug版本,可以通过以下方法实现: ### 方法一:通过系统属性获取 1. 使用`adb shell`执行命令: ```bash adb shell getprop ro.build.type ``` 若输出结果为$userdebug$,则表明当前为调试版本。其他可能结果包括$user$(正式版)$eng$(工程机)[^3]。 2. 在Java代码中判断: ```java if (Build.TYPE.equals("userdebug")) { // 当前为userdebug版本 } ``` 通过`Build.TYPE`字段直接获取编译类型[^2]。 ### 方法二:检查adb root权限 在userdebug版本中可通过以下命令验证: ```bash adb root adb remount ``` 若成功获取root权限且可重新挂载系统分区,则表明是调试版本(注意:需要设备已开启USB调试授权)[^1]。 ### 方法三:查看系统文件 检查`/system/build.prop`文件中的属性: ```bash adb shell grep "ro.build.type" /system/build.prop ``` 该文件包含完整的构建属性信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值