每天干的事情,遇到的问题,解决的方法


2013年12月18日

今天晚上喝了杯咖啡,趁着兴奋的劲,一不小心找出了困扰好长时间的Bug


阶段1、两个进程通过位于共享内存中的互斥量来实现进程控制,但主进程从共享区获取了pthread_mutex_t后,准备用pthread_mutex_lock加锁的时候,程序卡住。


调试:使用gdb运行程序,当程序卡住后 --->执行  print  pMutex->__data.__lock 返回 97xxxxxx,反正很大的一个数 ---> __lock 的值应该不是1就是0 表示是否被加锁两种状态,而且从返回的值来看一般是指针错误的引用了内存某块区域  -->  所以回到代码中查看最开始分配并返回  pthread_mutex_t 的地方,发现果然是返回的时候pthread_mutex_t 的起始地址让我计算错了(这里我搞了个共享内存池,所以要自己计算变量的起始地址) 

这个问题算是解决了,下面是pthread_mutex_t 的结构

typedef union{ 

   struct __pthread_mutex_s { 

             int __lock; 

             unsigned int __count;

            /**此处省略好几个字**/ 

  } __data; 

  char __size[__SIZEOF_PTHREAD_MUTEX_T]; 

  long int __align;

} pthread_mutex_t;


2013年12月19日

实验室最近正在做一个基于嵌入式android系统的视频会议项目,我跟师兄负责视频采集一块,用的是v4l2+ffmpeg做视频采集和处理。

ubuntu下程序的测试运行,以及后来的编译、移植都搞定了,跑到我们的硬件box上,出现问题。打了Log后发现程序执行到  avio_open函数时报错。


1、开始,我们一直认为是编译和移植的问题,在这上面着实费了很大一阵功夫。


2、昨天晚上,师兄突然问我会不会是android 的权限问题,我们的avio_open最后是要在设备上创建文件的,这需不需要获取什么权限???或者说我们创建文件的区域位于非法区域????

开始测试: 使用gdb跟进代码 

 avio_open  --->  ffur_open  ---> ffurl_connect  --->  uc->prot->urlopen(urlopen是个函数指针,运行时被赋值成了file_open,当然如果你用的是网络流那就不是了)  ----> open  (这是linux的基本API)

3、好了就是说avio_open 走到底层实际上就是要调用open函数在android设备上创建文件了。现在考虑两个问题:(1)创建文件需要什么权限?(2)我们创建文件的目录是否安全

问题1、权限问题:

 <!--往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
 <!--在sdcard中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

问题2、创建文件的目录是否安全:

我们给avio_open()传入的文件路径是 “./hell.flv”,就是在当前目录,后来经过调试发现这里的当前目录其实是系统的根目录就是 “ / ”,显然这个目录不是我们能随便修改的,正确安全的目录应该是 ” /mnt/sdcard/“ ,


OK,其实整个问题就在于上面的 问题1、2 , 以后在android设备上创建文件一定要注意这两个问题


2013年12月25日

以前用的ffmpeg一直是0.x几的版本,今天老板让我用NDK重新编译下最新版本2.11的ffmpeg到android上,平台移植这过程没有错误怎么能体现它的牛X性,本人编译过程主要遇到了下面几个错误:


ffmpeg 2.0 + x264 0.14(2013-10月份新出的版本) 已经用NDK编译完成并成功移植到android平台。具体间我的博文:


2013年12月26

背景:

大师(boss绰号)要求修改android Settings apk,让我隐藏掉Backup & reset 下的 PERSONAL DATA 一项


如图,进入 sdkxxx --> packages --> apps --> Settings --> res -->xml 目录,编辑 privacy_settings.xml 文件夹,注释掉 

<!--    <PreferenceCategory
                android:title="@string/personal_data_section_title"/> -->
         <!-- Factory reset -->
         <!-- 
         <PreferenceScreen
               android:title="@string/master_clear_title"
               android:summary="@string/master_clear_summary"
               android:fragment="com.android.settings.MasterClear" />

-->

这几项就好了。


修改完了,现在得说我怎么知道该修改 这个目录下的这个文件?????

方法:

1、settings.apk 中所有出现的字符都可以在 Settings --> res --> valuesxxx --> strings.xml 的文件中找到,大师让我隐藏掉PERSONAL DATA ,我就 ctrf + f 找PERSONAL DATA ,结果没有!!!! 我X, 没办法,只能看看还能找什么其他关键字,发现PERSONAL DATA 下还有个子选项 Factory data rest ,好了我再搜,OK 找到了

<string name="master_clear_title">Factory data reset</string>

Factory data reset 只是表示的字符,anroid 真正使用该字符时是用他的 name 值作为变量名来使用的,所以这个mster_clear_title 就是我们要找的东西了!!!

2、好了回到Settings根目录,执行命令  grep -r "master_clear_title" . (不要忘记后面的. 表示当前目录的意思),查找都有哪些文件的哪些行(grep 是按行来查找文件的)引用了该变量



说过 strings.xml 只是一个资源文件,需要别人引用他,所以我们忽略所有的strings.xml ,就找到这里的 xml/privacy_settings.xml 文件了.....


3、最后一部就是回到Settings 根目录执行 mm 单独编译这个 Settings.apk ,然后安装到android设备上就好了

PS.

mm后生成的apk 位于目录: /home/bianyi/sdk5.9B-07.26.1/out/target/product/AskeyBox/system/app



2013.12.30

用NDK编译源代码,并想在源代码中打印log的方法

#include <android/log.h>

#define LOG_TAG "TEST"

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值