simcom工作记录

来源:互联网 发布:淘宝上的学历是真的吗 编辑:程序博客网 时间:2024/06/05 04:56

岳阳市教育局
http://www.0730edu.cn/

I201/FADV-BJ/957286/PES/2014 password


ANSIC 和POSIX标准

ANSIC的目标是为各种操作系统上的C程序提供可移植性保证,而不仅仅限于UNIX。该标准不仅定义了C编程语言的语发和语义,而且还定义了一个标准库。这个库可以根据头文件划分为15个部分,其中包括:字符类型()、错误码()、浮点常数()、数学常数()、标准定义()、标准I/O()、工具函数()、字符串操作()、时间和日期()、可变参数表()、信号()、非局部跳转()、本地信息()、程序断言()等等。
    POSIX:该标准最初由IEEE开发的标准族,部分已经被ISO接受为国际标准。该标准的具体内容见1.1.3。POSIX.1和POSIX.2分别定义了POSIX兼容操作系统的C语言系统接口以及shell和工具标准。这两个标准是通常提到的标准。


sendStickyBroadcast 与sendBroadcast区别

ReceiverActivity里是通过代码来注册Recevier而不是在 Manifest里面注册的。所以通过sendBroadcast中发出的intent在ReceverActivity不处于onResume状态是无 法接受到的,即使后面再次使其处于该状态也无法接受到。而sendStickyBroadcast发出的Intent当ReceverActivity重 新处于onResume状态之后就能重新接受到其Intent.这就是the Intent will be held to be re-broadcast to future receivers这句话的表现。就是说sendStickyBroadcast发出的最后一个Intent会被保留,下次当Recevier处于活跃的 时候,又会接受到它。


activity栈

如果一个任务有很多个activity实例例如多个地图浏览器,那么栈会给每一个实例分配单独的入口,栈里的activity实例永远不会重新分配,只会被弹进,弹出。


mmap与Ashmem区别

A、(mmap:是一种共享内存的系统。假如:A进程的内存空间范围0X0000~0XFFFF,B进程的内存空间范围0X0000~0XFFFF,他们两个进程想共同共享一个文件或一段空间时,可以使用mmap(比如都想读取硬盘上的c.txt,txt内容为"123"),首先另外开辟第三个内存空间(3个字节),将硬盘上的c.txt映射到这个内存空间中,使此内存空间有了这个c.txt,再将A、B进程分别映射至这个内存空间,则现在A进程的内核空间范围为0X0000~0XFFFF+4,B进程的内核空间范围为0X0000~0XFFFF+4。那么此时A、B进程都拥有了共同的内存空间,即可以互相共享共同内存空间里的内容了;当然,如果创建mmap时也可以指定是可读还是可写,如果A或B改变了共同内存空间的值,将c.txt内容改为了"234"的话,硬盘上的c.txt内容仍然为123,若想改变,则得调用msync实现硬盘和共享内存区的同步),而Ashmem与mmap稍有不同的是,Ashmem与cache shrinker关联起来,可以在适当时机去回收这些共享内存,这点比较智能,而mmap是做不到的
Ashmem的源代码在mm/ashmem.c中,它通过注册Cache?Shrinker回收内存,通过注册misc设备提供open,mmap等接口,mmap则通过tmpfs创建文件来分配内存,tmpfs将一块内存虚拟为一个文件,这样操作共享内存就相当于操作一个文件
D、用户接口
进程A可通过open打开该文件,用ioctl命令ASHMEM_SET_NAME和ASHMEM_SET_SIZE设置共享内存块的名字和大小,并将得到的handle传给mmap,来获得共享的内存区域,进程B通过将相同的handle传给mmap,获得同一块内存,handle在进程间的传递可通过Binder来实现。
pmem与ashmem都通过mmap实现共享,区别是Pmem的共享区域是一段连续的物理内存,而Ashmem的共享区域在虚拟空间是连续的,物理内存却不一定连续


Android的log代码

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

kenerl
创建设备文件,和内核交互; 
kernel/common/drivers/staging/android/logger.h
kernel/common/drivers/staging/android/logger.c


framework接口;c及java 
frameworks/base/core/java/android/util/Log.java
frameworks/base/core/jni/android_util_Log.cpp 实现JNI方法println_nativ

liblog so库,供其他使用;
system/core/liblog
system/core/include/cutils/logger.h

logcat 以及参数
system/core/logcat

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


制作patch方法

1.      diff -uraN CBSDK_0616 CBSDK_0712 >CBSDK.patch -x exclude

2.      mvCBSDK.patch CBSDK_0616

3.      cdCBSDK_0616

4.      patch -p1< CBSDK.patch

5.      对比下CBSDK_0616 CBSDK_0712文件夹是否一样;

 

下载代码防止掉线的脚本

#!/bin/bash 

echo "======start reposync======" 

repo sync  -j8

while [ $? == 1 ]; do 

echo "======sync failed, re-syncagain======" 

sleep 3 

repo sync  -j8

done


硬件驱动代码,结合老罗hello程序

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

kenerl-driver层
通过ic2与硬件联系,module_init,创建文件描述符,sys/class/


hardware
建立module,module id;与driver层通过文件通讯;


framework-jni
通过module id获取module;module->methods->open打开module device,实现接口;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在hello_init函数中,通过Android 硬件抽象层提供的hw_get_module 方法来加载模块ID为HELLO_HARDWARE_MODULE_ID  
的硬件抽象层模块,其中,HELLO_HARDWARE_MODULE_ID 是在<hardware/hello.h>中定义的。
Android 硬件抽象层会根据  HELLO_HARDWARE_MODULE_ID 的值在Android 系统的/system/lib/hw 目录中找到相应的模块,
然后加载起来,并且返回  hw_module_t 接口给调用者使用。


view的按键处理

return onTouchEvent(event);//若mOnTouchListener.onTouch返回false,调用onToucheEvent


import详解

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

import导入声明可分为两中:
1>单类型导入(single-type-import)

例:importjava.util.ArrayList;
2>按需类型导入(type-import-on-demand)

例:import java.util.*;
使用按需导入声明是否会降低Java代码的执行效率?绝对不会! Java编译器产生的类文件仅包含编译单元实际使用到的类或接口的符号引用.
这是否意味着总是可以使用按需导入声明?是,也不是!在类似Demo的非正式开发中使用按需导入声明显得很有用.然而,有这四个理由让你可以放弃这种声明:
1>  编译速度:在一个很大的项目中,它们会极大的影响编译速度.但在小型项目中使用在编译时间上可以忽略不计.
2>  命名冲突:解决避免命名冲突问题的答案就是使用全名.而按需导入恰恰就是使用导入声明初衷的否定.
3>  说明问题:全名的使用是自说性的.毕竟高级语言的代码是给人看的.
4>  无名包问题:如果在编译单元的顶部没有包声明,Java编译器首选会从无名包中搜索一个类型,然后才是按需类型声明.如果有命名冲突就会产生问题.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


老罗startService流程
调用后,通过binder到ActivityManagerService服务中;
ActiveServices中首先分析intent
创建属性结构体ServiceRecord,保存
mAm.startProcessLocked。Process.start ActivityThread
已经是在上一步创建的新进程里面了,即这里的进程是用来启动服务的,原来的主进程已经完成了它的命令,返回了
ActivityThread.main
attach到ActivityManagerService中,吧之前创建的数据继续处理;
 app.thread.scheduleCreateService
ActivityThread.scheduleCreateService
 queueOrSendMessage(H.CREATE_SERVICE, s);这里回到ActivityThread处理;
 handle中 case CREATE_SERVICE:  
                    handleCreateService((CreateServiceData)msg.obj); 
                    service = (Service) cl.loadClass(data.info.name).newInstance();获取类实例
                      service.onCreate();
                      
                      
 老罗startActivity流程
 ActivityManagerService.startActivity
 mMainStack.startActivityMayWait
 判断是否需要创建一个新的Task来启动这个Activity
 ActivityStack.resumeTopActivityLocked(null);  
  首先要把当处于Resumed状态的Activity推入Paused状态(ApplicationThreadProxy.schedulePauseActivity,它是ActivityThread的内部类),
  通过消息ActivityThread.handlePauseActivity(performPauseActivity调用应用的onpause),ActivityManagerService.activityPaused,ActivityStack.activityPaused
  ActivityStack.completePauseLocked后才可以启动新的Activity(ActivityStack.resumeTopActivityLokced),ActivityManagerService.startProcessLocked(Process.start),
 ActivityThread.main, ActivityManagerService.attachApplicationLocked,ActivityStack.realStartActivityLocked, ApplicationThreadProxy.scheduleLaunchActivity,
 通过消息ActivityThread.handleLaunchActivity

activitymanage.java -> activitymanageproxy->activitymanagenative->service.java
iactivity中定义了proxy和native; proxy和native都在native.java文件中;

AsyncTask要点;
preExecute() and postExecute() offer you access 
onProgressUpdate(Progress...),在publishProgress方法被调用后;publishProgress在doInBackground中执行;实现更新;


ProGuard作用

ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.
ProGuard的使用是为了:
1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.
2.创建的程序和程序库很难使用反向工程.
3.所以它能删除来自源文件中的没有调用的代码
4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件

混淆后的结果,你就会发现,如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢?
这个是靠proguard.cfg文件来进行配置的keep
主要保留了继承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类。因为这些子类,都是可能被外部调用的。
另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类


java语法

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。所以内部类的成员变量/方法名可以和外部类的相同。

普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。(依赖于外部类,不能单独使用,和static定义冲突)而嵌套类不能声明为private,一般声明为public,方便调用。

protected内部类并不关心是否有其他类继承自它的外部类。所有protected访问权限不在此种情况下适用。

留意外部类的方法的形参,当所在的方法的形参需要被内部类里面使用时,该形参必须为final

当所在的方法的形参需要被内部类里面使用时,该形参必须为final;
这是因为,内部类被编译的时候会生成一个单独的内部类的.class文件,这个文件并不与外部类在同一class文件中。好像和内存回收的遍历有关;

Anonymous Inner Class (匿名内部类)

///考虑类public等权限时注意可见性;特别是子类在package外,protect是不可见的,讨论子类权限没意义;
protected内部类并不关心是否有其他类继承自它的外部类。所有protected访问权限不在此种情况下适用。
*内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。这里protect与default相同,给人子类权限的误导;


抽象类和接口
abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface
在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的
abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系
实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 
接口中的方法默认都是 public,abstract 类型的


抽象类的特征是有得有失,得到的功能是抽象类可以拥有抽象方法(当然也可以没有);失去的功能的是抽象类不能创建实例了。至于其他的,抽象类与普通类在语法上大致是一样的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


堆和栈的大小都在创建davilk时定义,堆一般12k,栈16/24M;


eval 有二次展开的优势,可以定义参数名等;还有是$$(); 返回为空,避免放回字符串;


reader和inputstream

java.io.Reader 和 java.io.InputStream 组成了Java 输入类
Reader 用于读入16位字符,也就是Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
Reader支持16位的Unicode字符输出,InputStream支持8位的字符输出。
Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,
InputStream、OutputStream是用来处理8位元的流,
Reader、Writer是用来处理16位元的流。
而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。
值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配和由OutputStream到Writer的适配。


同步

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
实现同步的方式

synchronized 修饰方法时 表示同一个对象在不同的线程中 表现为同步队列

如果实例化不同的对象 那么synchronized就不会出现同步效果了。

wait注意只是使当前线程处于等待,但对同步方法/块的占有却释放了,所以其它线程便可以随后访问这个同步方法/块了

Lock所有对象都自动含有单一的锁 =(static synchronized)
Lock还能tryLock(time);unlock应该在finally中

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ril

UiccController.java register 状态改变消息,当消息改变,发送获取状态消息;
UiccCardApplication.java 收到响应后修改接口中数据状态,
Ril.jave 在收到RILReceiver数据后在对应的处理函数responseIccCardStatus中读取socket中数据;(这里processSolicited)
         收到RILSender发送消息,往socket中写入数据;
qcril_uim_card.c qcril_uim_construct_card_status 往卡状态结构体中填充数据;
ril.cpp sendSimStatusAppInfo 往socket中写入之前填充的数据

com. android.phone(app)-》telephony -ipc》Phone Service-sockets》RIL-》RPC-》SMD(share memeory dirver)-》return《-


shell

[[]]与[]的区别,&&与-a的区别,||与-o的区
[[]] 运算符只是[]运算符的扩充。能够支持<,>(大于号,小于号)符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| && ,不再使用-a -o


/sys/module/lowmemorykiller/parameters/adj
writeFile("/sys/module/lowmemorykiller/parameters/minfree


adb shell showmap 9073


led灯导致互锁

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

"PowerManagerService" prio=5 tid=22 MONITOR
  - waiting to lock <0x418867a8> (a java.lang.Object) held by tid=20 (UEventObserver)

"UEventObserver" prio=5 tid=20 MONITOR
  - waiting to lock <0x417fd0b8> (a java.lang.Object) held by tid=22 (PowerManagerService)

互锁了,具体流程如下:
1.BatteryService收到拔USB事件,收到OnEvent事件,获取BatteryService.mLock;

2.BatteryService给PowerManagerService发送ACTION_BATTERY_CHANGED消息,
PowerManagerService收到消息后,获取了PowerManagerService.mLock锁,并查询BatteryService.isPowered又请求BatteryService.mLock锁,并阻塞;

3.BatteryService继续调用Light.turnOff,并请求释放wakelock,请求PowerManagerService.mLock并阻塞;

整个过程BatteryService都在BatteryService.mLock锁中运行,没有释放,最终阻塞在PowerManagerService.mLock;
PowerManagerService收到消息后获取了PowerManagerService.mLock锁,最终阻塞在BatteryService.mLock锁
所以BatteryService和PowerManagerService互锁了;
对需要锁的服务,尽量发消息;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


CSFB(cs fall back)、VOLTE(Voice over LTE)、SGLTE(simultaneous GSM and LTE)。我看了一些资料,总感觉VOLTE是最佳的,直接在数据环境下实现语音和数据同时进行。而CSFB则在则需要切换,SGLTE则需要GSM和LTE同时待机,肯定终端成本增加以及耗电量增加!


"git add -A" is equivalent to "git add .; git add -u".


*#*#4636#*#* htc


Intent是一个动作的完整描述,包含了动作的产生组件、接 收组件和传递的数据信息  Intent也可称为一个在不同组件之间传递的消息,这个消 息在到达接收组件后,接收组件会执行相关的动作  Intent为Activity、Service和BroadcastReceiver等组件提供 交互能力  Intent的用途
启动Activity和Service  在Android系统上发布广播消息


 广播消息可以是接收到特定数据或消息,也可以是手机 的信号变化或电池的电量过低等信息


骁龙800产品编号
  8074、8274、8674、8974(AA、AB)
  其中产品编号中的“0”代表没有集成基带,“2”代表支持WCDMA3G网络制式,“6”代表支持CDMA网络制式,“9”代表支持4G的LTE网络制式。
    AA指低频率一般是2.2GHz,AB指的是高频率一般是2.3GHz。


data/system/packages.xml scanPackageLI


按键触屏流程
KeyQ processEvent InputDisapath InputDeviceRender EventHub.cpp InterceptKeyTQ判断该按键是否应该送给上层,还是在此层进行截取
qwerty.kl
http://blog.csdn.net/stonecao/article/details/6759189

触摸键不震动,对比机确实OK的,底层raw中带key数据,其实在eventhub中的read中有virtualkey判断;只需要point就可以;


depkg 安装 depkg卸载;


 find 按文件修改时间查找文件
    ---(+n)----------|----------(n)---------    -|----------(-n)---
    (n+1)*24H前|   (n+1)*24H~n*24H间   |n*24H内
    -ctime -n    查找距现在 n*24H 内修改过的文件
    -ctime n    查找距现在 n*24H 前, (n+1)*24H 内修改过的文件
    -ctime +n    查找距现在 (n+1)*24H 前修改过的文件


System.loadLibrary("wifi_ftm_jni");load;
jni中定义JNI_OnLoad 之中registerMethods


vnc 远侧桌面,ubuntu到share中设置;


java数组int[] a; int a[];2种格式;
作为参数和返回都是传递的引用;


git patch

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

git format-patch -m **

git am -3 *.patch
edit
git add
git am --resolved

git reset --hard HEAD

repo forall -p -c  'git am -q -3 *.patch'
repo forall -p -c  'git am -q -3 --resolved'
git am -3 --skip

repo forall -p -c  'git format-patch -m'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


adb shell dd if=/dev/zero of=/dev/block/mmcblk0p9


高通ap调试
在硬件上需要做如下的改动: 
PS_HOLD上拉; 
设置NV 4399=1, 905=0 
如果是VM重启(不仅仅是VM,只要死机后手机不重启,都可以用这种方法),拔掉电池后,两秒钟内再装上电池。这样手机可以QPST抓dump文件。 


FDD与TDD相比优缺点:
  1.FDD必须使用成对的收发频率。在支持以语音为代表的对称业务时能充分利用上下行的频谱,但在进行以IP为代表非对称的数据交换业务时,频谱的利用率则大为降低,约为对称业务时的60%。而TDD则不需要成对的频率,通信网络可根据实际情况灵活地变换信道上下行的切换点,能有效地提高系统传输不对称业务时的频谱利用率。
  2.根据ITU对3G的要求,采用FDD模式的系统的最高移动速度可达500千米/小时,而采用TDD模式的系统的最高移动速度只有12千米/小时。这是因为,目前TDD系统在芯片处理速度和算法上还达不到更高的标准。
  3.采用TDD模式工作的系统,上、下行工作于同一频率,其电波传输的一致性使之适用智能天线技术,可有效减少多径干扰,提高设备的可靠性。而收、发采用一定频段间隔的FDD系统则难以采用。据测算,TDD系统的基站设备成本比FDD系统的基站成本低约20%~50%。
  4.在抗干扰方面,使用FDD可消除邻近蜂窝区基站和本区基站之间的干扰,FDD系统的抗干扰性能在一定程度上好于TDD系统。 
  总结:TD-LTE和FDD LTE在技术上差异较少而共性更多,两者都能为移动用户提供超出以往的移动互联网接人体验。在3G时代,FDD在移动通信领域的绝对优势已成定局,我国的TD-SCDMA国际化发展机会渺茫,而TD-LTE则从标准制定起就和国际其他主流标准同步进行。为保证TD-LTE的技术和标准演进、网络和终端产业发展、网络建设和运营继续保持领先,需要形成与LTE FDD融合、同步发展的全球化产业,缩小市场规模方面的差距。


ArrayList LinkedList Set HashMap介绍 
  在Android开发中我们经常需要对数据进行分类和操作,对于轻量级的数据存储我们可能不需要动用SQLite或效率以及类库不完善的XML,由于SharedPreferences不具备数据枚举方法,如果仅仅是一个String或Int数组可以通过一个标记分割设计外,我们还是主要来看看Android或者说Java提供的基础数据类型辅助类ArrayList LinkedList Set HashMap的介绍,如果你熟悉C++的STL或Boost库可以略过本文。 
   在Java中提供了Collection和Map接口。其中List和Set继承了Collection接口;同时用Vector、ArrayList、LinkedList三个类实现List接口,HashSet、TreeSet实现Set接口。直接有HashTable、HashMap、TreeMap实现Map接口。 
    Vector基于Array的List,性能也就不可能超越Array,并且Vector是“sychronized”的,这个也是Vector和ArrayList的唯一的区别。 
    ArrayList:同Vector一样是一个基于Array的,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些。Android123提示大家适用于顺序性的查找 
    LinkedList:不同于前面两种List,它不是基于Array的,作为链表数据结构方式,所以不受Array性能的限制。当对LinkedList做添加,删除动作的时候只要更改nextNode的相关信息就可以实现了所以它适合于进行频繁进行插入和删除操作。这就是LinkedList的优势,当然对于元素的位置获取等方面就逊色很多。 
    List: 
        1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]; 
        2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]; 
        3. 所有的List中可以有null元素,例如[ tom,null,1 ]; 
        4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。 
虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。 
     HashSet:HashSet的存储方式是把HashMap中的Key作为Set的对应存储项,HashMap的key是不能有重复的。HashSet能快速定位一个元素,但是放到HashSet中的对象需要实现hashCode()方法0。 
    TreeSet:将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的。TreeSet不同于HashSet的根本是TreeSet是有序的。它是通过SortedMap来实现的。 
    Set总结: 1. Set实现的基础是Map(HashMap); 2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象,不能包含两个元素e1、e2(e1.equals(e2))。 
    Map是一种把键对象和值对象进行关联的容器,Map有两种比较常用的实现: HashTable、HashMap和TreeMap。 
    HashMap也用到了哈希码的算法,以便快速查找一个键, 
    TreeMap则是对键按序存放,因此它有一些扩展的方法,比如firstKey(),lastKey()等。 
    HashMap和Hashtable的区别。 HashMap允许空(null)键(key)或值(value),由于非线程安全,效率上可能高于Hashtable。 Hashtable不允许空(null)键(key)或值(value)。 
   有关更多实用的Android开发技巧我们将在后面的文章中着重介绍。
http://www.cnblogs.com/kadinzhu/archive/2011/11/19/2255336.html


root权限用宏控制,开宏时,直接return,不需要判断;安全极了;


for system server reboot when watchdog need del when MP version
sys.watchdog.disabled=1


bitbake @base_conditional;

w.mExiting 正在退出;livawallpaper splash

ro.com.google.clientidbase=android-anydata

/sys/class/leds/lcd-backlight/brightness

RecentTasksLoader.java

adnCache.reset(); ICC_INIT:ICC_RESET telephony/cdma/RuimRecords.java

checksparse.py; unsparse;

android.hardware.touchscreen.multitouch.jazzhand.xml


DefaultContainerService.java DeviceStorageMonitorService.java
10% or less space available内存少,这里修改为20%;才够用;减去当前应用后计算;


DDMS查看内存泄漏方法如下(以浏览器模块为例);

       1.打开DDMS,选中要检测的内存的进程 “com.android.browser”,并点击   按钮(show heap updates)。  
      2.右侧切换到VM Heap,并点击Cause GC,会出现如下数据显示。
    3.反复进行某一个操作,如反复进出某一个选项,反复横竖屏切换等,模拟可能出现内存泄漏的操作。 
     观察Allocated和Uesd选项,如在某一种反复操作后,这两项值一直不停增长,则可以怀疑为内存泄漏。


activity-alias别名;


libdvm.so被修改,导致开不了机;


PMEM Configuration


apt-cache show libxml2 | grep Version


Segmentation fault


mDevicePreferenceMap这个hashmap 内存泄露


CTA 双s,string, 位置, refresh, ril交互延时;resume;


templet root权限,cts问题;


build/core definitions.mk文件中;
$(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx2048M) \
修改为
$(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx1500M) \


git 目录空文件夹不能提交,一般添加empty文件;


bitbake -c clean data  bitbake -c compile data 
dog_keepalive.c   dog_keepalive_sm: Beacon NCK, remainig 100ms slots = 0 


远程安装;
lightdm.conf & custom.conf
[XDMCPServer]
enabled=true


音量键唤醒;
高通gpu使用dyn,不稳定;使用内存多,用ddr_diagnose.cmm or ddr_test.cmm测试memory问题;
tunel feature也不稳定,微信打飞机会死机;
Tunnel Mode 是最近推出的一种新feature,可能还存在一些bug; build.prop tunnel;


setprop service.adb.tcp.port 5555  
stop adbd       
隔5s     
start adbd
然后在电脑上adb connect wifi.ip.address:5555


modem_type 控制dsds宏;


AP CP交互dog时间修改DOG_KEEPALIVE_100MS_NUM_SLOTS建议修改为200 25*00ms=》200*00ms
adb shell cat sys/power/wake_lock  查待机问题;如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠.
setReferenceCounted(boolean value) 来指定,一般默认为计数机制。这两种机制的区别在于,前者无论 acquire() 了多少次,只要通过一次 release()即可解锁。而后者正真解锁是在( --count == 0 )的时候,同样当 (count == 0) 的时候才会去申请加锁,其他情况 isHeld 状态是不会改变的。所以 PowerManager.WakeLock 的计数机制并不是正真意义上的对每次请求进行申请/释放每一把锁,它只是对同一把锁被申请/释放的次数进行了统计再正真意义上的去操作。这个以前C写C++类似;


刚查了一下jiffies相关资料:
http://www.cnblogs.com/simonshi/archive/2010/12/13/1694819.html
mipi出错 wait_for_completion(&dsi_dma_comp);to wait_for_completion_timeout(&dsi_dma-comp);导致power键无法唤醒;一直在等待;


低电流问题,切换老版本中各个img;GPIO 114拉高;


watchdog time system;阻止system中thread重启;sys.watchdog.disabled


http://blog.csdn.net/zyplus/article/details/7433004


修改kenrel启动时,强制修复数据,防止RO问题,但-f强制会在下载版本时,对差异保存下来,导致空间不够;


Andorid是不是有文件描述符1000的限制


dvmHeap 问题;
1) Disable JIT In build.prop: dalvik.vm.execution-mode = int: fast
NOTE: build.prop is auto-generated from buildinfo.sh. So, to make this change, easiest thing will be to pull build.prop from device, change it and push the changed file back
2) Enable extra dalvik GC logs: In build.prop: dalvik.vm.extra-opts "-Xgc:preverify - Xgc:postverify"
3) Collect dalvik heap dumps at the time of crash Change code in the android tree to collect heap dumps.There are 2 ways of doing it:
To do it in JAVA: android.os.Debug.dumpHprofData(String filename) API can be used To do it in CPP: dalvik.vm.hprof.Hprof.hprofDumpHeap(String filename,-1,false) API can be used
4) Enable malloc debug logs
adb shell
#setprop dalvik.vm.checkjni true
#setprop libc.debug.malloc 10
#setprop dalvik.vm.jniopts forcecopy
#stop
#start


java.lang.SecurityException:
META-INF/MANIFEST.MF has invalid digest f
memtest


update-alternatives editor java 选择执行哪个;


Log.d(TAG,Log.getStackTraceString(new Throwable())); 


按键流程
http://www.oschina.net/question/54100_31739
http://blog.csdn.net/peng_cao/article/details/8627369
http://blog.sina.com.cn/s/blog_6695f9eb0101gmwo.html
http://blog.csdn.net/wangjianzhongfj/article/details/7888980


ioctl
控制I/O设备 ,提供了一种获得设备信息和向设备发送控制参数的手段。用于向设备发控制和配置命令 ,有些命令需要控制参数,这些数据是不能用read / write 读写的,称为Out-of-band数据。也就是说,read / write 读写的数据是in-band数据,是I/O操作的主体,而ioctl 命令传送的是控制信息,其中的数据是辅助的数据。


Vold
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d8d8b492c93cf13d9735b361b31a5a660794613d3b37c670aae4e5beef42172415876a09bbe8948dcb0992b259f27432a5ad91f069644ef9d49619c7ec6&p=9d759a46d7c550b517f6c32d021495&newp=8278c54ad5c247b50dbe9b7c495f97231610db2151d0da1f6581&user=baidu&fm=sc&query=vold&qid=&p1=5


socket
http://www.kuqin.com/networkprog/20080512/8361.html
http://www.blogjava.net/wxb_nudt/archive/2007/11/01/157623.html


android恢复出厂设置的流程
在恢复前添加SystemUtil.setTestMode(false);这样工厂只要在出厂前做恢复出厂设置,就可以屏蔽端口了;
在MasterClearConfirm.java中显示恢复出厂提示和对应button,点击button后调用button的
click方法 
1. 如果选中erase sd card, 则startService(ExternalStorageFormatter) 
2. 如果没有则直接发送广播,sendbroadcast(android.intent.action.MASTER_CLEAR), 对应的在
MasterClearReceiver会接受此广播,在onReceive()方法中会调用
RecoverySystem.rebootWipeUserData()方法. 
3. RecoverySystem.rebootWipeUserData()的流程如下: 
 3.1. 广播intent “android.intent.action.MASTER_CLEAR_NOTIFICATION” 通知所有接
收端处理相关行为. 
 3.2. 等待所有接收完成动作. 
 3.3. 写入一个command file于/cache/recovery/command, 内容为” --wipe_data” 
 3.4. 重新开机进入ecovery mode. 
4.进入recovery mode之后,读取/cache/recovery/command, 内容为” --wipe_data” 
5.按照读取的command,进行wipe data操作。 
6.操作成功之后重新开机进去normal mode 

ConditionVariable condition = new ConditionVariable();
 condition.block();
 condition.open();


WAKE: When this key is pressed while the device is asleep, the device will wake up and the key event gets sent to the app.


WAKE_DROPPED: When this key is pressed while the device is asleep, the device will wake up and the key event does not get sent to the app.


底电流问题;
替换modem,boot来确定范围;


nv 905=0 1982=5 1895=255 1962=255 4399=1
QPST DUMP;


adb shell sys_reboot bootloader


如果一段代码很久没更新了,是否可以优化;默认为终极代码;


留了threadright权限后门;
JNIEXPORT void JNICALL Java_com_sim_ap_ATDrive_setPermissionData\r
50 (JNIEnv *env, jobject obj)\r
51 {\r
52     ?       int handledata = open("/dev/threadright0", O_RDWR);\r
53 ?       if(handledata == -1)\r
54 ?       {  ?       \r
55 ?       ?       __android_log_print(4, LOG_TAG, "open(threadright0) failed:fd = %d\n", handledata);\
r
56 \r \r48
57 ?       }\r


$git config --global user.name “yourname” 


sudo passwd root ---设置root密码;默认为动态;
/etc/sudoers中,包含了sudo权限用户,其中admin group中都有;


修改/etc/fstab后用mount -a来测试下;很重要;


git tag -n1 查看版本;
git pull
git checkout tag


sudo apt-get --reinstall install libxml2=2.7.6.dfsg-1ubuntu1


安装vmlinux;
需要安装vm tools;

分析原因:由于编译过程和当前Linux的内核版本有很大关系,Linux内核不同版本之间代码差异较大,时常会出现某个结构多了个成员少了个成员之类的改动,造成vmware-tools在引用这个文件时出现编译错误。
解决方法:根据Linux内核版本的发布日期去下载对应的open-vm-tools(open-vm-tools官方下载地址),比如我的内核版本是linux-2.6.28,我下载的就是open-vm-tools-2009.02.18-148847.tar.gz。然后解开,把open-vm-tools/modules/linux里的vmhgfs目录改名成vmhgfs-only然后压成 vmhgfs.tar, 替换vmware-tools-distrib/lib/modules/source下的同名文件,其他几个.tar文件的替换方法一样。最后重新安装vmware-tools即可。运行命令如下:

tar -xzf open-vm-tools-*.tar.gz
cd open-vm-tools-*
cd modules/linux
for i in *; do mv ${i} ${i}-only; tar -cf ${i}.tar ${i}-only; done
cd ../../../
sudo mv -f open-vm-tools-*/modules/linux

结论:vmlinux 上 vmlinux ubuntu 版本要对应,主要是内核对应,对应主要指open-vm-tools要和linux内核版本对应;


E/memalloc(  144): /dev/pmem_adsp: failed to map pmem fd: Out of memory E/memalloc(  144): virtual int gralloc::PmemAshmemController::allocate(gralloc::alloc_data&, int, int): Failed to allocate ADSP/SMI memory 
E/msm7627a.gralloc(  144): gralloc failed err=Out of memory 
W/GraphicBufferAllocator(  144): alloc(1280, 720, 17, 10002900, ...) failed -12 (Out of memory) 


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VBoxService 项下 ImagePath 值改为system32\VBoxService.exe --disable-timesync
VBoxManage setextradata 虚拟客户机名称 “VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled” “1″
C:\Program Files\Oracle\VirtualBox>VBoxManage setextradata "WindowWindow" "VBoxInternal/TM/TSCTiedToExecution" 1
首先打开网络连接(右键“网上邻居” -》左键“属性”),右键新出现的“本地连接 2” --》左键“属性”出现下图所示界面

python
模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。
Python 中所有加载到内存的模块都放在 sys.modules 。当 import 一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用 import 的模块的 Local 名字空间中。如果没有加载则从 sys.path 目录中按照模块名称查找模块文件,模块可以是py、pyc、pyd,找到后将模块载入内存,并加到 sys.modules 中,并将名称导入到当前的 Local 名字空间。
各个模块的 Local 名字空间是独立的


import pdb; pdb.set_trace()
log到底用的哪个文件;
print ', '.join(['%s:%s' % item for item in env.__dict__.items()])


mpss_build.py call_scons

 scons.build(lg = lg, image_cfg_str = image_cfg_str, args = cmd_args)
ret = lg.log_exec(build_cmd_line, env=setenv_dict)--执行编译;
Executing: E:\project\L2_FC\AMSS\modem_proc\tools\build\scons\SCons\scons.bat -f E:\project\L2_FC\AMSS\modem_proc\tools\build\scons\build\start.scons BUILD_ID=LAAAANAZ BUILD_ASIC=9x25 CHIPSET=mdm9x25 HAL_PLATFORM=9x25 MSM_ID=9x25 PRODUCT_LINE=MPSS.DI.1.0 TARGET_FAMILY=9x25 T_CFLAGS= T_LFLAGS=--gc-sections --hash-size=31 BUILD_VER=00111108.1 mpss mba
logger.Logger 模块.类名;


mpss_build.py---读取配置文件
ret = scons.build(lg = lg, image_cfg_str = image_cfg_str, args = cmd_args)
build.py----设置环境变量;
ret = lg.log_exec(build_cmd_line, env=setenv_dict)
scons.bat

Main.py main SConsOptions 对参数整理;
SConsOptions---分析 --选项;
def _main # Here's where everything really happens

SCons.Script._SConscript._SConscript(fs, script) ---读取文件;

 exec _file_ in call_stack[-1].globals

_build_targets---编译;
targets['mpss', 'mba']

jobs.run(postfunc = jobs_postfunc)--执行编译;

Job.py
def run(self, postfunc=lambda: None):
self.job.start()
def start(self):---判断needs_execute,需要self.tp.put(task)否则task.executed()(不是编译)

class Worker:def run(self):
task.execute()

Taskmaster.py
def execute(self):---执行编译;

多项目应该从ENV下手;

self.tp.put(task)

start.scons
env.Tool


git remote set-url origin

 
合代码如果不是相同分支,改动会比较大;合代码不能用传统方法;


export GREP_OPTIONS="--exclude-dir=\.git --exclude-dir=\.repo --exclude-dir=\out"


 find /apps -path "/apps/bin" -prune -o -print


set fileformat=unix


date -d @135968515


awk文本处理
fname=30032100623172432001A2.7513200048009F9DD0D2214C00000001
  no1=$(echo $fname |  awk -F. '{print $1}')
  no2=$(echo $fname |  awk -F. '{print $2}')
  echo $no1
  echo $no2


cut
    fname=30032100623172432001A2.7513200048009F9DD0D2214C00000001
    no1=`echo $fname|cut -f 1 -d"."`
    no2=`echo $fname|cut -f 2 -d"."`
    echo $no1
    echo $no2


sudo shutdown -P +180


sudo mount -t ext4 -o loop system.img.ext4 tmp/


文件属性只是控制别的程序对他的权限,而不是该文件执行后的权限;


/system/core/include/private/android_filesystem_config.h


fork的子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
  linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。


define inherit-product1
 $(foreach v,$(_product_var_list), \
      $(eval $(v) := $(1) )\
      $(eval $(info $(v) = $($(v)))))
endef 要给一个值的值赋值,不用eval就不行;


find . -name AndroidManifest.xml | xargs grep "android.process.acore"
make 2>&1 > build_log.txt
uname -a


volatile

编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).


pe90开机停在log界面;
  开机流程跑到init,没完成;log提示data/dalvid-cache没创建;
  替换bootimg能成功开机
  分析kernel或ramdisk问题;
  使用perl分拆bootimg,把kernel和ramdisk与正常的交叉生成bootimg;
  确定是ramdisk问题;
  回退代码,生成bootimg,问题依旧;
  
  版本编译时,在本地回退了一个分支,对init照成影响;


总结:
  问题解决办法很多,直接看代码也许事最直接,但也是最复杂的;
  对各种可能性的分析,包括版本编译;


工厂烧版本后,开机QQ等应用异常终止;
  通过log是data/data中,缺少应用的数据文件夹
  更具log,是fs中uid和分配的uid不匹配;
  通过文档,研究uid分配原理,应该在分配后,会记录在package.xml中;
  尝试删除package.xml,问题复现,恢复出厂设置后,再次删除,不复现;
  添加log,发现第一次下载后,读取文件夹的顺序和之后的完全相反,导致uid不同;
  那问题就可能是在创建data/data过程中,断电,此时package.xml还没创建,再次开机uid与data/data中的uid已近不同;


总结:
  通过非规范的方法复现bug是解决这个问题的关键;
  一些不好解的bug要大胆猜测;
  研究后要积极总结;


售后触摸屏失效;
  先发现top中media cpu过高;
  查看bugreport media进程有个thread停留在获取wallpaper缩略图界面;
  查看缩略图,发现图片文件损坏;
  在data/data中找到设置wallpaper的apk;
  问题能复现;对比其他手机,发现有手机事OK的;
  使用该apk,发现该apk设置wallpaper时,耗cpu,手机重启;
  分析,可能是获取缩略图时耗cpu,导致重启;


总结:
  这个问题使用常规推测,看内存,cpu,bugreport;


给extern/libpng添加log;
  添加动态库liblog,这样就可以添加__android_log_write函数;(libcutils也行,因为包含静态liblog)
  include android/log.h,该文件通过-I把system/core/include添加进来,编译时会用-I参数;
  注:这里不添加log.h,直接extern定义,或不用extern直接定义,反正函数缺省状态是extern的;
  libpng作为libskia的静态库,需要重新编译libskia


thread停留在获取缩略图函数;
  基本判断,函数中有死循环;
  通过log找到死循环;
  修改pngread.c中的if判断


总结:
  这不是第一次遇到3/4判断的问题,条件判断时,有2块代码相同,优化人员会忍不住把代码合并,
  合并时要注意,用2*2的表格来思考问题,但遇到3/4判断时,找到1/4取非就可以了;
  if(!(a&&b))


adb root控制;
  更具正常编译,user版本没有adb;
  通过修改main.mk中的adb.enable打开adb;
  由于有时需要root权限,但有不能给用户root权限;
  注销adb.c 和service.c中的debug判断,这样user版本也能root;
  修改adb root命令为重启adb,如果需要root,需要在root前,setprop sevice.adb.mode 1


总结:
  对于属性,分几种,blog中已总结;
  用最简单的办法达到所需功能,不容易产生附带效果;


编dist版本,功能不正常;
  因为其他版本没有该问题,从编译下手;
  通过分析生成apklog,发现异常log中,apk是从thirdparty生成,而不是期望的vendor;
  
总结:
  找到合适切入点,对比是好方法;
  分析问题,不需要全局把握,解决之后,再去分析全局;


问题
  手机system分区不够,想通过减少图片;
分析解决
  配置command.mk中减少hdpi,原因另外总结;
  hdpi中多出的图片需要修改后cp到mdpi中;
  分析修改图片规则:
  getResources().getDrawable
  Resources.java:getDrawable-》loadDrawable-》createFromResourceStream-》drawableFromBitmap-》
  NinePatchDrawable-》setNinePatchState-》computeBitmapSize-》scaleFromDensity-》computeBitmapSize
  调用算法( (size * tdensity) + (sdensity >> 1) ) / sdensity;
总结:
  可以通过该算法批量制图;
  考虑目前项目稳定性,在以后项目中使用该方法;


问题:
  cts印度版本开不了机,
分析解决
  由于前2天,添加锁卡功能,在init.rc中添加了qcnvitem.jar到BOOTCLASSPATH;
  搜索BOOTCLASSPATH,在mk中有replace it with device's BOOTCLASSPATH说明;
  修改DEXPREOPT_BOOT_JARS即可;
  之后分析原因,由于锁卡功能在framework加载前就调用了,所以需要预先启动,dalvik会在init.c
  时,就去加载BOOTCLASSPATH中jar,且该jar必须是boot jar;所以在DEXPREOPT_BOOT_JARS中
  要添加申明;
  添加不用担心重复定义的问题;dexpreopt_boot_jar_module := $(filter $(LOCAL_MODULE),$(DEXPREOPT_BOOT_JARS_MODULES))
  dexpreopt_boot_jar_module控制了boot jar和普通jar的生成方式;
总结:
  这个bug差点忘记了,要买贴贴纸啦?


问题:
  PRODUCT_COPY_FILES中有个文件编不过;
分析解决:
  CopyFile在makefile中拷贝,在copy处添加Log;发现正常;
  根据log;make: *** 没有规则可以创建“frameworks/base/data/etc/android.hardware.sensor.accelerometer.xml”需要的目标“system/etc/permissions/android.hardware.sensor.accelerometer.xml”。 停止。
  目标和依赖相反,且没有out目录;有可能是out/.../system/... 依赖frameworks/... 而frmeworks/...依赖于system/...
  通过添加-d和--debug 查看log证实,该想法;
  限制include Android.mk,故障依旧;
  删除device/qcom/目录其他文件夹,就好了;
  分析目录,发现在给CopyFile赋值时,少写了‘\’
总结:
  对比好与不好的文件;


问题:
  手机休眠后,唤醒马上操作music快进界面,出现ANR;
  手机黑屏后,点屏比较慢;
分析解决:
  对比其他版本没有发现该问题,并且不知道唤醒时的操作,所以用版本对比的方法;
  多个版本对比后,找到正确版本和错误版本,交换boot.img,发现是boot.img问题,交叉编译后,确认事ramdisk问题;
  对比ramdisk,在init.rc有几处不同,分析后确定位置,原因是console启动条件变化了,修改后在user版本上启动;
总结:
  对于这个问题产生的原因仍然不清楚,初步猜测,由于user版本串口被打开,而user版本console没有打开,在唤醒时对console
  有操作,导致串口信息阻塞,还需要添加log确认;
  添加新项目时,提交时要注意,拉分支和提交之间的提交;


//120625


  
  


























































































  
  


0 0
原创粉丝点击