operate

本文介绍了一种通过在Android设备上使用特定命令进行系统调试的方法,包括如何修改文件权限、挂载文件系统及安装调试工具等步骤。对于解决Android设备显示问题如白屏、黑屏、花屏等提供了实用建议。

[1]shell@msm8610:/ $ tigerwolf
tigerwolf
shell@msm8610:/ # ls
ls
acct
cache
charger
config
d
data
default.prop
dev
etc
file_contexts
firmware
fstab.qcom
init
init.qcom.class_core.sh
init.qcom.class_main.sh
init.qcom.early_boot.sh
init.qcom.factory.sh
init.qcom.rc
init.qcom.ril.sh
init.qcom.sh
init.qcom.spec.switch.rc
init.qcom.ssr.sh
init.qcom.syspart_fixup.sh
init.qcom.usb.rc
init.qcom.usb.sh
init.rc
init.target.rc
init.trace.rc
init.usb.rc
mnt
persist
proc
property_contexts
res
root
sbin
sdcard
sdcard1
seapp_contexts
sepolicy
storage
sys
system
tombstones
ueventd.qcom.rc
ueventd.rc
vendor
shell@msm8610:/ # cd system
cd system
shell@msm8610:/system # ls
ls
app
bin
build.prop
cdrom.iso
etc
fonts
framework
lib
lost+found
media
pre-install
tts
usr
vendor
xbin
shell@msm8610:/system # mount
mount
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,size=202828k,nr_inodes=50707,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/secure tmpfs rw,seclabel,relatime,size=202828k,nr_inodes=50707,mode=700 0 0
tmpfs /mnt/asec tmpfs rw,seclabel,relatime,size=202828k,nr_inodes=50707,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,size=202828k,nr_inodes=50707,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,relatime,noauto_da_alloc,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/modem /firmware vfat ro,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437
rtname=lower,errors=remount-ro 0 0
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /storage/emulated/legacy fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0
shell@msm8610:/system # mount -rwo remount /dev/block/platform/msm_sdcc.1/by-name/system /system
ck/platform/msm_sdcc.1/by-name/system /system                                 <
shell@msm8610:/system # chmod 777 system/bin
chmod 777 system/bin
Unable to open system/bin: No such file or directory
10|shell@msm8610:/system # chmod 777 bin
chmod 777 bin
shell@msm8610:/system # ^C
d:\adb\adb2>adb push D:\adb\busybox /system/bin
2447 KB/s (1096224 bytes in 0.437s)

d:\adb\adb2>adb shell
shell@msm8610:/ $ tigerwolf
tigerwolf
shell@msm8610:/ # chmod 777 system/bin/busybox
chmod 777 system/bin/busybox
shell@msm8610:/ # busybox find -name mdss_fb
busybox find -name mdss_fb
./sys/bus/platform/drivers/mdss_fb

 

[2]屏的所有问题不外乎:白屏、黑屏、花屏、闪屏。屏相关的kernel层代码几乎全部在/kernel/driver/video/msm/mdss/目录下,以及相关的dsti文件。可以趁着解决问题的机会先熟悉代码,多打log,跟踪流程。代码熟悉了才更容易分析现象。主板焊线出来才可以打印串口log;
整机无法打印串口log,只好打印adb
dmesg用来跟踪kernel log; ddms和logcat指令用来跟踪user层和framework层log;QXDM打印modom log
各有所用,并非只用一种。

 

[3]adb shell

$tigerwolf

126|shell@c1_c:/ # mount

shell@c1_c:/ # mount -o remount -t auto /dev/block/platform/msm_sdcc.1/by-name/s
ystem /system

shell@c1_c:/ # chmod 777 /system/vendor/lib/

结构体`operate`是在引用[1]中定义的数据结构`Object`里的一个函数指针成员。以下是详细信息: ### 定义 在引用[1]中,`Object`结构体的定义如下: ```cpp typedef struct _Object { struct _Object** ppObject; int number; void (*operate)(struct _Object* pObject); } Object; ``` 其中,`operate`是一个函数指针,它指向一个返回值为`void`,参数为`struct _Object*`类型的函数。这意味着`operate`可以指向任何符合该签名的函数,用于对`Object`类型的对象进行特定操作。 ### 使用方法 #### 定义操作函数 首先需要定义一个符合`operate`函数指针类型的函数。例如,在引用[1]中定义了`operate_of_parent`函数: ```cpp void operate_of_parent(struct _Object* pObject) { int index; assert(NULL != pObject); assert(NULL != pObject->ppObject && 0 != pObject->number); for (index = 0; index < pObject->number; index++) { pObject->ppObject[index]->operate(pObject->ppObject[index]); } } ``` 这个函数用于对父节点进行操作,它会遍历父节点的所有子节点,并调用每个子节点的`operate`函数。 #### 初始化结构体并设置操作函数 在使用`Object`结构体时,需要对其成员进行初始化,并将`operate`指针指向合适的操作函数。示例代码如下: ```cpp #include <stdio.h> #include <assert.h> typedef struct _Object { struct _Object** ppObject; int number; void (*operate)(struct _Object* pObject); } Object; void operate_of_parent(struct _Object* pObject) { int index; assert(NULL != pObject); assert(NULL != pObject->ppObject && 0 != pObject->number); for (index = 0; index < pObject->number; index++) { pObject->ppObject[index]->operate(pObject->ppObject[index]); } } // 假设的子节点操作函数 void operate_of_child(struct _Object* pObject) { printf("Child object is being operated.\n"); } int main() { // 假设创建两个子节点 Object child1, child2; child1.operate = operate_of_child; child2.operate = operate_of_child; Object* children[] = {&child1, &child2}; // 创建父节点 Object parent; parent.ppObject = children; parent.number = 2; parent.operate = operate_of_parent; // 调用父节点的操作函数 parent.operate(&parent); return 0; } ``` 在上述代码中,首先定义了`operate_of_parent`和`operate_of_child`两个操作函数。然后创建了两个子节点`child1`和`child2`,并将它们的`operate`指针指向`operate_of_child`函数。接着创建了父节点`parent`,将其子节点数组和数量进行初始化,并将`operate`指针指向`operate_of_parent`函数。最后调用父节点的`operate`函数,触发对所有子节点的操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值