android 4.0 编译模式 eng -- > user 时遇到的问题

转载地址:http://blog.csdn.net/xubin341719/article/details/7706867

关键词:android  4.0  user  eng  camera  nand  串口

平台信息:

内核:linux3.0

系统:android4.0.3

平台:S5PV310(samsung exynos 4210)

 

问题描述:android4.0编译模式由eng变成user后出现如下问题:

1、设置中wifi开关选项没有了(打开、关闭选项);

2、不能安装应用程序apk;

3camera提示插入sd卡(实际sd卡、nand正常挂载);

4、串口终端有信息输出,但是不能操作(只能看到内核输出信息,敲键盘没反应)。

一、Android 编译选项eng、user、userdebug我们先看一下几种模式的不同吧

    eng: 为了开发而包含了很多工具;
 user:出厂时候面向用户的 ;
 userdebug:打开了一些debug选项 ;

三种模式的解释:
http://www.kandroid.org/online-pdk/guide/build_system.html#androidBuildVariants
1、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.
2、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  //关闭串口调试,我们所说的第4个问题,串口不能操作,就是这个地方的控制的
  adb is disabled by default.
3、userdebug  用户调试模式
  make userdebug
  The same as user, except:
  Also installs modules tagged with debug.
  ro.debuggable=1   //打开串口调试
  adb is enabled by default.

二、更改编译脚本build_android.sh

找到下面脚本,改为user模式:

  1. eng模式为:  
  2.   echo make -j$CPU_JOB_NUM PRODUCT-full_$SEC_PRODUCT-eng  
  3.   echo   
  4.   make -j$CPU_JOB_NUM PRODUCT-full_$SEC_PRODUCT-eng  
  5. user模式为:  
  6.   echo make -j$CPU_JOB_NUM PRODUCT-full_$SEC_PRODUCT-user   
  7.   echo   
  8.   make -j$CPU_JOB_NUM PRODUCT-full_$SEC_PRODUCT-user  

三、问题分析、解决

1、对2、3两个问题分析

不能安装应用程序apk; camera提示插入sd卡(实际sd卡、nand正常挂载);

感觉是nand、sd卡的权限不,查看权限:

  1. shell@android:/mnt $ la -la  
  2. drwxr-xr-x root system 2000-01-01 14:38 asec  
  3. drwxr-xr-x root system 2000-01-01 14:38 obb  
  4. d---rwxr-x system sdcard_rw 1970-01-01 00:00 sdcard //sd卡权限  
  5. d---rwxr-x system sdcard_rw 1970-01-01 00:00 sdcard2//nand权限  
  6. drwx------ root root 2000-01-01 14:38 secure  
  7. d--------- system system 2000-01-01 14:38 usb  

2、对比编译生成的system,发现问题

发现有system/etc/permissions在两种模式下有所不同,编译成user时4.0.3_r1/out/target/product/smdkv310/system/etc/permissions/少了一些xml文件,

如:android.hardware.camera.xml、android.hardware.wifi.xml、platform.xml等

我们知道out目录下生成的文件,是在其它地方copy过来的,找到这些xml文件在源头在:4.0.3_r1/frameworks/base/data/etc中,查看4.0.3_r1/frameworks/base/data/etc/ndrAoid.mk编译选项,发现一些问题:

  1. ########################  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE :platform.xml  
  4. LOCAL_MODULE_TAGS :eng  
  5. LOCAL_MODULE_CLASS :ETC  
  6. # This will install the file in /system/etc/permissions  
  7. #  
  8. LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions  
  9. LOCAL_SRC_FILES := $(LOCAL_MODULE)  
  10. include $(BUILD_PREBUILT)  

LOCAL_MODULE_TAGS := eng这个值为eng,所以在user模式下编译时,对应的文件不做copy,LOCAL_MODULE_TAGS:= user时编译时出错。编译脚本太深入的话,我也看不懂里面的东西,所以想了一种比较简单的方法,编译时不判断模式,直接copy文件:

3、在device.mk中加入copy操作,解决问题

我们在4.0.3_r1/device/samsung/smdkv310/deivce.mk中加入copy命令,如下:

  1. PRODUCT_COPY_FILES += \  
  2. frameworks/base/data/etc/android.hardware.camera.xml:system/etc/permissions/android.hardware.camera.xml\  
  3. frameworks/base/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml\  
  4. frameworks/base/data/etc/android.hardware.touchscreen.multitouch.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.xml\  
  5. frameworks/base/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml\  
  6. frameworks/base/data/etc/platform.xml:system/etc/permissions/platform.xml\  
  7. frameworks/base/data/etc/tablet_core_hardware.xml:system/etc/permissions/tablet_core_hardware.xml  

编译完成后要检查一下4.0.3_r1/out/target/product/smdkv310/system/etc/permissions/这个目录下,是否把frameworks/base/data/etc/目录下的xml文件复制过来。

注意:烧录时,清除userdata\cache两个分区,这里面会记忆一些系统信息,不清除的话,还是会出现错误现象。

前三个问题解决,我们再看下第四个问题:

4、串口的操作选择(debugable使能)

问题:串口终端有信息输出,但是不能操作(只能看到内核输出信息,敲键盘没反应)。

这个问题也是无意间发现的,其实在user模式下,串口本来就不能操作的,也就是说这是正常的现象,但是我们考虑到在试产过程中总会出现一些问题,要用到串口跟踪信息,所以还是想找到原因:

(1)default.prop

我们对比下default.prop在两种模式编译下的差异:

  1. user模式下,串口不可用:  
  2. shell@android:/ $ cat default.prop   
  3. #  
  4. # ADDITIONAL_DEFAULT_PROPERTIES  
  5. #  
  6. ro.secure=1  
  7. ro.allow.mock.location=0  
  8. ro.debuggable=0       //这个值为0也就是说不能用debug,所以串口就不能使用  
  9. persist.sys.usb.config=mass_storage  
  10. shell@android:/ $   
  11. user模式下,串口可用:  
  12. shell@android:/ # cat default.prop   
  13. #  
  14. # ADDITIONAL_DEFAULT_PROPERTIES  
  15. #  
  16. ro.secure=0  
  17. ro.allow.mock.location=1  
  18. ro.debuggable=1    //这个值为1,所以串口可以操作使用  
  19. persist.sys.usb.config=mass_storage,adb  

(2)、全局搜索,找到对这个值设定的位置4.0.3_r1/build/core/main.mk
更改:4.0.3_r1/build/core/main.mk

  1. ifeq (true,$(strip $(enable_target_debugging)))  
  2.   # Target is more debuggable and adbd is on by default  
  3.   ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1//eng模式下  
  4.   # Include the debugging/testing OTA keys in this build.  
  5.   INCLUDE_TEST_OTA_KEYS :true  
  6. else # !enable_target_debugging  
  7.   # Target is less debuggable and adbd is off by default  
  8. ADDITIONAL_DEFAULT_PROPERTIES +=ro.debuggable=1//user模式下,原来为0,现在改为1  
  9. endif # !enable_target_debugging  

关于user、eng这两种模式,BSP中应该都支持,也许我们拿到的BSP不全,这里面的问题只是针对user、eng编译里的个别问题。我不能详细的分析,一方面我做驱动方面的工作,对系统方面了解有限,另一方面BSP编译规则一般是由芯片厂去做这部分工作。希望对遇到相同问题的“同学”有所帮助,自己也做一点备忘记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值