工作笔记二

http://source.android.com/source/initializing.html
sync code:
repo sync -j4


全志编译complier:
lunch --> 19
make -j4 -l8
pack -d;-d参数表示有串口输出,否则输出到sdcard.具体看 device/softwinner/crane-byd7/package.sh脚本,他会执行vendor/softwinner/tools/pack/pack脚本

Infotmic编译:
. ./build/envstup.sh
选择,然后make -j8 -l8即可

choosecombo
选择,然后make -j8 -l8即可
project :
/device/softwinner/crane-byd7


kernel and uboot:
/vendor/softwinner/

编译kernel,uboot:
 make -j4 bootimage

ttyUSB0
同步:
repo sync -j4

烧写ramdisk和kernel:
进入out/target/product/crane-byd7目录下:
sudo fastboot flash boot boot.img
uboot:
fastboot flash bootloader bootloader.fex


SPR引导代码路径:
vendor/softwinner/tools/pack/chips/sun4i


更改GPIO等的配置:
在vendor/softwinner/tools/pack/chips/sun4i/configs/crane/byd7中的两个文件,第一个是一些重要的参数,如分区,MEMERY等,第二个是GPIO配置,
更改完成后,make, pack,然后进入
vendor/softwinner/tools/pack/out中,用fastboot烧写其中的 bootloader.fex 即可


git恢复修改或则新增的文件:
进入所在的目录如frameworks/base,然后git status . 可以察看修改和新增的文件,git checkout ./ 即可回复修改的,新增的要手动删除


git-server addr:
git clone [email protected]:teamwork



framework中boot.img文件的生成脚本:

文件的合并
在linux-3.0/scripts/build_sun4i.sh中有:
 79     mkbootimg --kernel output/bImage \
 80             --ramdisk output/sun4i_rootfs.cpio.gz \
 81             --board 'sun4i' \
 82             --base 0x40000000 \
 83             -o output/boot.img
作用就是把kernel和ramdisk打包成boot.img,内容格式为:bootimage_head + pagesize(default 2K) + kernel + pagesize + ramdisk + pagesize

boot.img的生成:
build/core/Makefile中,主要是调用out/host/linux-x86/bin/mkbootimg工具生成的,如
    --kernel     out/target/product/tcc8800/kernel
    --ramdisk   out/target/product/tcc8800/ramdisk.img
    --cmdline   console=ttyTCC,115200n8
    --base 0x40000000  --pagesize 8192
可见boot.img是由kernel,ramdisk并且传入命令行参数组成的,mkbootimg工具的代码在system/core/mkbootimg/中
我们的工程中,没有用到在linux-3.0/scripts/build_sun4i.sh中的(已经删除了该语句),而是用build/core/Makefile中的

ubuntu12.04下make menuconfig 时候出错的问题:
sudo  apt-get install  libncurses5-dev就可以啦
回复回去则:
sudo apt-get install  libncurses5-dev:i386

查找一个项目中的指定文件并删除他们的命令:
find . -iname .git |xargs rm -rf

ljw服务器
git clone ssh://[email protected]/home/ljw/allwinner_ics
 passwd:ljw123


git的一些命令:
git branch             查看当前分支
git branch -r          查看所有分支
git pull origin wfliao  更新当前分支
git checkout wfliao   切换分支

git创建一个新分支并提交:
git commit -a -m "..."
git branch jb-infotm-nd6
git checkout jb-infotm-nd6
git push orgin HEAD:jb-infotm-nd6
git删除本地分支:
git branch -d 分支名字


boot.img的生成:
build/core/Makefile中,主要是调用out/host/linux-x86/bin/mkbootimg工具生成的,如
    --kernel     out/target/product/tcc8800/kernel
    --ramdisk   out/target/product/tcc8800/ramdisk.img
    --cmdline   console=ttyTCC,115200n8
    --base 0x40000000  --pagesize 8192
可见boot.img是由kernel,ramdisk并且传入命令行参数组成的,mkbootimg工具的代码在system/core/mkbootimg/中



git提交的步骤:
git add 修改过的文件名
git commit -m "........"
git push
删除了一个文件如base/core/java/com/broadcom/bt/service/framework/PowerManagementService.java,重新更新则用
git checkout -- base/core/java/com/broadcom/bt/service/framework/PowerManagementService.java


察看文件夹内容大小的命令:
du -h --max-depth=1



制作system.img的方法,进入out/target/product/crane-jbs/目录下运行:
make_ext4fs -s -l 512M -a system system.img system 即可
解压make_ext4fs打的包:
simg2img system.img ZNKG5.img
mkdir ZNKG5
sudo mount -o loop ZNKG5.img ZNKG5
打包就按照上面的方法,或则运行mkuserimg.sh -s ZNKG5 ZNKG5-new.img ext4  512M

android的开机动画代码在frameworks/base/cmds/bootanimation/BootAnimation.cpp中,
看了里面的路径定义USER_BOOTANIMATION_FILE就知道BootAnimation.zip包应该放在那个位置了

//USI WIFI
Android.mk中LOCAL_CFLAGS的用法:
如在device/softwinner/crane-jbs7/BoardConfig.mk 中有:SW_BOARD_USR_WIFI := usibm01a
这样在hardware/libhardware_legacy/wifi/Android.mk中:
ifeq ($(SW_BOARD_USR_WIFI), usibm01a)
LOCAL_CFLAGS += -DUSI_BM01A_SDIO_WIFI_USED
endif
这样就相当于定义了USI_BM01A_SDIO_WIFI_USED这个宏,在wifi.c中就可以用了:
#elif defined USI_BM01A_SDIO_WIFI_USED
  93
  94     #ifndef WIFI_DRIVER_MODULE_PATH
  95     #define WIFI_DRIVER_MODULE_PATH         "/system/vendor/modules/usi4329_dhd.ko"
  96     #endif
  97     #ifndef WIFI_DRIVER_MODULE_NAME
  98     #define WIFI_DRIVER_MODULE_NAME         "dhd"
  99     #endif
 100     #ifndef WIFI_DRIVER_MODULE_ARG
 101     #define WIFI_DRIVER_MODULE_ARG         "firmware_path=/system/vendor/modules/usi4329_fw.bin nvram_path=/system/vendor/modules/usi4329_nvram.txt"
 102     #endif





gps移植过程:
在scripts/build_sun4i_crane.sh中有cp modules/gps/gps.ko_ $LICHEE_MOD_DIR/gps.ko
在framework中替换device/softwinner/common/hardware/libhardware/gps/haiweixun/gps.exDroid.so,
gps模拟器路径development/tools/emulator/system/gps/Android.mk,会生成gps.goldfish.so库

jbs-server:
repo init -u ssh://jbs-server/home/git/android/platform/manifests.git
初始化repo的新地址:
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo" >~/bin/repo  
chmod a+x ~/bin/repo
有时候这句运行提示远程错误,就要把~/bin/repo中的 REPO_URL='https://code.google.com/p/git-repo/'更改为 REPO_URL='http://code.google.com/p/git-repo/'
RK3066: repo init -u ssh://venus/home/git/android/sawfish/platform/manifests.git -m ics-rk3066.xml
repo sync
///
cd .repo/
 rm manifest.xml
ln -s manifests/ics-cwhl.xml manifest.xml
修改或者提交文件只能在各自的git目录下进行,
修改文件,察看当前分支, git branch,如果不是ics-jbs
git checkout -b ics-jbs
git commit -a -m "..........."
git push origin ics-jbs:ics-jbs
然后进入:
 cd .repo/manifests
 vi manifest.xml ,比如如果修改了/system/bluetooth,则增加 remote="origin" revision="ics-jbs"
cd manifests;git commit -a -m ".............";git push

如果git commit之后,想回复该commit 之前,则:
git rebase origin/jb-infotm-x15

将工程全部切换到某个分支下:
repo start --all jb-infotm-75d

在一个分支 jb-infotm-75d提交后,git checkout jb-infotm-x15切换分支,也想提交到该分支上,则
git cherry-pick 0b995f883e485f973cb77636bd97a9fd258d13d3(log为jb-infotm-75d分支下提交的LOG)
git push orgin HEAD:jb-infotm-x15
///



ctags -R
drivers/misc/inv_mpu$



GPIO配置脚本的使用:
Port:端口+组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态>
1.函数原型: int Script_parser_fetch(char *main_name, char *sub_name, int value[], int count);
                       主键名称,    子键名称    存放用户获取的数据   传进的数据空间的最大word个数
成功返回0,失败返回-1
这个函数可以获取配置里面的一个值或者一组GPIO或者一组字符窜的配置。
获取一个值:
如有配置
[fm_para]
fm_pattern = 0
则:
    {
        int  fm_pattern;
        int  ret;

        ret = script_parser_fetch(“fm_para”, “fm_pattern”, &fm_pattern, 1);
    if(ret >= 0)
        return fm_pattern;
    else
        return ret;
    }
获取一组GPIO配置:
如有配置
[twi_para]
twi_scl   = port:PH12<1>
则:
    {
        user_gpio_set_t  gpio_info[1];
        int  ret;

        ret = script_parser_fetch(“twi_para”, “twi_scl”, gpio_info, sizeof(user_gpio_set_t)/sizeof(int));
        if(ret < 0)
        printf(“fetch script gpio infomation fail\n”);
    else
        printf(“fetch script gpio infomation ok \n”);

    return ret;
    }
获取字符窜:
如有配置
[string_test]
string_demo = string:abcdefghijklmn
则:
    {
        char  string_info[128];
        int  ret;

        memset(string_info, 0, 128);
        ret = script_parser_fetch(“string_test”, “string_demo”, string_info, 128/sizeof(int));
        if(ret < 0)
        printf(“fetch script string infomation fail\n”);
    else
        printf(“fetch script string infomation ok \n”);

    return ret;
    }

2.更改某个GPIO的输出电平:
如有配置
[audio_para]
audio_earphone_ctrl   = port:PH12<1>
则:
int gpio_earphone_switch = gpio_request_ex("audio_para", "audio_earphone_ctrl"); //用这一句可以直接取得控制句柄
gpio_write_one_pin_value(gpio_earphone_switch, 0, "audio_earphone_ctrl");//设置输出低电平

3.读取某个GPIO的输入电平:
int gpio_earphone_switch = gpio_request_ex("audio_para", "audio_earphone_ctrl"); //取得控制句柄
Int Gpio_read_one_pin_value (__hdle devpin, const char *gpio_name);
返回值:  高电平返回1
          低电平返回0
      非输入状态返回-1

4.设置句柄下单个GPIO配置:


函数原型:__hdle  Gpio_request (user_gpio_set_t *gpio_list,      
unsigned group_count_max);
参数:gpio_list          数据地址,保存GPIO属性,来自于配置脚本或者是用户自定义
      group_count_max   用户保存GPIO数据的结构体的最大个数
      返回值:   成功返回非空指针
                 失败返回空指针



5.解析AXP209中GPIO的配置:
    [lcd0_para]
    lcd_bl_en     = port:power1<1><0><1>
    这是表示用到AXP中GPIO1作为输出,默认输出为高电平,它的解析写法如下:
    user_gpio_set_t  gpio_info[1];
     ret = OSAL_Script_FetchParser_Data("lcd0_para","lcd_bl_en", (int *)gpio_info, sizeof(user_gpio_set_t)/sizeof(int));
    if(ret < 0)
    {
        DE_INF("%s.lcd_pwm not exist\n", primary_key);
    }

    hdl = OSAL_GPIO_Request(gpio_info, 1);
    //if_release_to_default_status:
    //如果是0或者1,表示释放后的GPIO处于输入状态,输入状状态不会导致外部电平的错误。
    //如果是2,表示释放后的GPIO状态不变,即释放的时候不管理当前GPIO的硬件寄存器。
    OSAL_GPIO_Release(hdl, 2);
    而OSAL_GPIO_Request最终是调用
    axp_gpio_set_io(gpio_list->port_num, gpio_list->mul_sel);
    axp_gpio_set_value(gpio_list->port_num, gpio_list->data);
    等去操作AXP的。
    最后调用:
    OSAL_GPIO_DevWRITE_ONEPIN_DATA(gdisp.screen[sel].gpio_hdl[io_index], data, gpio_name);//写GPIO的输出是0还是1
    具体操作函数在vendor/softwinner/linux-3.0/drivers/video/sun5i/disp/OSAL中

camera所在的路径:
drivers/media/video/sun4i_csi/device

FM发射芯片radio-qn8027:
drivers/media/radio/radio-qn8027.c


马达驱动路径:
drivers/misc/sun4i-vibrator.c


cat /proc/kmsg


ctrl+shift+"+"三个键 可以放大终端字体

*#06#


repo sync
进入修改目录:
git commit -a -m "............."
git fetch origin
git rebase origin/ics-jbs
git remote show origin
git push
git push origin HEAD:ics-jbs(以后用这个保险一点)

git checkout -b  ics-jbs;git push origin HEAD:ics-jbs
GIT恢复到指定版本:
git reset --hard d756f627fe568f4d8bcf1852ba60557eeab477a5 (版本号)

git revert HEAD                  撤销前一次 commit
git revert HEAD^               撤销前前一次 commit
git push

修改服务器端口号:
sudo vi /etc/ssh/sshd_config
修改port 22 为 port 端口号
sudo /etc/init.d/ssh restart
重启ssh
附 ssh连接方法
ssh IP -p 端口号

代码中新增加一个代码目录,并加入到git中的方法:
ssh venus;
su git;密码是git
cd;
比如75d项目,进入/home/git/android/shark/platform中,要在代码根目录中增加InfotmDocs文件夹,运行new_project.sh InfotmDocs.git
回到本地机器,在75d目录运行git clone ssh://jbs@venus/home/git/android/shark/platform/InfotmDocs.git
然后将要增加的代码拷贝到InfotmDocs,git add .;git commit -m "......";git push origin HEAD:jb-infotm-75d;这样就可以啦

MU509 AT命令用法:调试3G
    1:请查看模块的版本。方法为 进入ADB
                                         1:stop ril-daemon
                                         2:cat /dev/ttyUSB2
                                         3:在另外shell 打开。
                                         4:执行   echo -e "ati\r\n" > /dev/ttyUSB2
                                         这时cat 后台将会打印命令返回信息. 若是11.813.01.04.00请升级为11.813.01.05.00,11.813.01.05.00开机会快点。
        升级文件见“android下MU509(版本11.813.01.05.00)一键升级工具及说明 ”









base/services/camera/libcameraservice/CameraService.cpp






vim保存上次访问的位置,在.vimrc中输入
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif
但还要修改文件 ~/.viminfo 的权限,否则要sudo vim 才能起作用




//打开ADB权限
adb shell时候提示权限不足,要用sudo adb shell(fastboot也一样)的问题,是由于/etc/udev/rules.d/51-android.rules的权限问题引起的,修改该文件如下的即可:SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0666", OWNER="lsc",主要是OWNER,MODE两项




删除触控屏驱动sudo modprobe -r psmouse


adb shell logcat -b radio -v time

Ubuntu 12.04 开机自动设置亮度的方法:
打开软件中心,安装laptop-mode包;
打开文件:/etc/laptop-mode/laptop-mode.conf
将以下标志修改为1:
ENABLE_LAPTOP_MODE_ON_AC=1
保存文件;
打开文件:/etc/laptop-mode/conf.d/lcd-brightness.conf
修改如下行:  www.2cto.com  
CONTROL_BRIGHTNESS=1
 
BATT_BRIGHTNESS_COMMAND="echo 3"
LM_AC_BRIGHTNESS_COMMAND="echo 3"
NOLM_AC_BRIGHTNESS_COMMAND="echo 3"
#BRIGHTNESS_OUTPUT="/proc/acpi/video/VID/LCD/brightness"
BRIGHTNESS_OUTPUT="/sys/class/backlight/acpi_video0/brightness"
保存文件;
执行命令  sudo update-grub;
重启机器即可。


sudo 查找命令:
sudo apt-cache search mkimage



android APK签名方法:
./host/linux-x86/framework/signapk.jar
build/target/product/security
 java -jar signapk.jar platform.x509.pem platform.pk8






ubuntu更换短密码:
sudo passwd username







ubuntu12.04下安装eclipse打开有错误的解决方法:
cp /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64

ctrl + ]提示找到1个或多个是,输入 :tselect




ubuntu下安装内核源代码
apt-cache search linux-source
apt-get install linux-source-3.0.0(这个要修改对应的内核版本)
具体看http://blog.csdn.net/haokaihaohe110/article/details/7426447


apk安装位置的设定:
   android:installLocation="auto" >
此行是配置让Android系统自行决定应用的安装位置。
adb shell中还有如下命令:
pm set-install-location: changes the default install location.
  NOTE: this is only intended for debugging; using this can cause
  applications to break and other undersireable behavior.
    0 [auto]: Let system decide the best location
    1 [internal]: Install on internal device storage
    2 [external]: Install on external media




android中添加一个新device方法:
1.新建/device/softwinner/crane-lsc目录
2.新建vendorsetup.sh文件,我们运行lunch时候会出现的选项,内容如下
     add_lunch_combo crane_lsc-eng
     add_lunch_combo crane_lsc-userdebug
     add_lunch_combo crane_lsc-user
3.新建crane_lsc.mk、BoardConfig.mk文件,新建AndroidProducts.mk,这是必须要有的,否则出错,它就是调用crane_pla.mk,内容如下:
    PRODUCT_MAKEFILES := $(LOCAL_DIR)/crane_pla.mk
4.新建AndroidBoard.mk,这是必须要有的,否则出错,它就是调用编译kernel和uboot等,内容如下:
    LOCAL_PATH := $(call my-dir)                           
    include vendor/softwinner/build/kernel.mk

5.所以我们看看vendor/softwinner/build/kernel.mk,有40多行,看重点的两句就行了:
     32 $(BUILT_KERNEL_TARGET): FORCE
     33     cd $(TOP)/vendor/softwinner/buildroot/scripts && cp -rf top_build.sh  ../../build.sh
     34     cd $(TOP)/vendor/softwinner/ && ./build.sh -p sun4i_crane -k 3.0
进入vendor/softwinner/build.sh只有一句:
    buildroot/scripts/common.sh,所以进入common.sh看看,有200多行:
    这个文件的主要工作就是查找解压设置编译工具的位置,环境变量等,然后复制kernel的模块到out目录下
    还有编译uboot等
如重要的两句:
    225     cd ${KERN_DIR} && ./build.sh -p ${PLATFORM}
    对应就是编译内核 ./build.sh -p sun4i_crane
    还有编译u-boot: cd ${U_BOOT_DIR} && ./build.sh -p sun4i

6.而最后的打包命令pack是如何生成的呢?
在device/softwinner/common/vendorsetup.sh中有一函数:
     12 function pack()
     13 {
     14     T=$(gettop)
     15     export CRANE_IMAGE_OUT=$OUT
     16     export PACKAGE=$T/vendor/softwinner/tools/pack
     17     sh $T/device/softwinner/$(get_build_var TARGET_DEVICE)/package.sh $1
     18 }
这就是我们运行pack时候执行的函数,所以会进入自己的TARGET_DEVICE中执行package.sh脚本,内容如下:
    1 cd $PACKAGE                                                                                                                                  
    2 if [ "$1" = "-d" ]; then
    3     echo "--------debug version, have uart printf-------------"
    4     ./pack -c sun4i -p crane -b game -d card0
    5 else
    6     echo "--------release version, donnot have uart printf-------------"
    7     ./pack -c sun4i -p crane -b game -d uart0
    8 fi
    9 cd -
所以就进入vendor/softwinner/tools/pack执行pack脚本了,他有400多行:
    最终就是调用里面的121 do_pack_crane()函数,



vim 增加鼠标复制功能
set mouse=v








C++运行时候多态(动态联翩)的理解:
    比如定义了一个形状的基类:
    class Shape//形状********************************************
    {
    public:
        virtual void DrawSelf()//绘制自己
        {
           cout << "我是一个什么也绘不出的图形" << endl;
        }
    };
    多边形和圆分别继承它并覆盖父类的方法:
    class Polygo:public Shape//多边形****************************
    {
    public:
        void DrawSelf()   //绘制自己
        {
           cout << "连接各顶点" << endl;
        }
    };

    class Circ:public Shape//圆*********************************
    {
    public:
        void DrawSelf()   //绘制自己
        {
           cout << "以圆心和半径为依据画弧" << endl;
        }
    };
    并且有一个调用方法:
    void OutputShape( Shape arg)//专门负责调用形状的绘制自己的函数******************
    {
        arg.DrawSelf();
    }
    那么我们调用:
        Polygon shape1;
        Circ shape2;
        OutputShape(shape1);
        OutputShape(shape2);
    发现输出的是父类的方法,而不是各自的子类方法,但如果把调用方法改为如下,则可实现调用的是各自的子类方法:
    void OutputShape( Shape& arg)//专门负责调用形状的绘制自己的函数*****************
    {
        arg.DrawSelf();
    }
    原因是:C++编译器在编译的时候会悄悄地在含有虚函数的基类前面加一个指针vptr和创建一个VTable(表在别的位置),用这个指针来指向该表,这个表格会包含每一个
        虚函数的索引,子类会继承这张表,而且表的索引顺序和基类一样(当然,如果覆盖了虚函数的方法,那么对应的索引将是子类的新方法地址了),当用基类的指针调用对象的
        方法时,通过调用对象本身的vptr找到表,表中有很多方法,到底该使用那个呢?原来编译器在创建VTable时,已经为每个virtual函数安排好了座次,而且悄悄的将函数的名字
    用索引号来替换,用这个索引来找出相应的虚函,这时候,我们通过这个索引号就可以在VTable中得到一个函数地址,此外,如果是纯虚函数,由于它没有函数体,表中相应位置
    放的就不是该函数的地址,而是一个出错处理的函数入口地址
    对于上面的例子,C++会悄悄的做三个表,Shape一个,Polygon一个,Circ一个,分别记录DrawSelf函数的入口地址,然后根据传进来的的对象地址,查表找到
    对应的DrawSelf函数的入口地址,当然这些功能都是C++编译的时候自己额外增加来实现,但是这个查找过程,其实也就是这些额外代码的运行过程是在运行时候完成的,就调用
    函数OutputShape本身而言,它是不知道那个对象调用了它的,所以才被叫运行时的多态。如下例子说明:
    程序中通过基类指针或引用对虚函数的调用语句都会被编译器改写成如下的形式:(即:利用基类的指针指向派生类对象,调用派生类对象的函数--->实现多态性。)
        (*(p -> _vptr[slotNum]))(p, arg-list);
        其中:p是基类型指针,_vptr是p指向的对象的隐含指针,而slotNum就是你调用的虚函数在vtable中的编号,这个数组元素的索引号在编译时就确定了下来。



C++中静态成员和非静态成员的理解:
    1. 非静态数据成员被放在每一个对象体内作为对象专有的数据成员
    2. 静态数据成员被提取出来放在程序的静态数据区内为该类所有对象共享,一次仅存一份
    3. 静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类的所有对象共享,因此每一个成员函数也只存在一份代码实体
       因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针
    4. 类的静态数据成员可以在class的定义中直接初始化,但这只是声明并给它提供一个初值而已,还必须在某一个源文件中把它定义一次(即分配内存)
    5. this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址,如下例子说明:
       某一类Point中有构造函数:Point(int a, int b) { x=a; y=b;}和成员函数:Void MovePoint( int a, int b){ x+=a; y+=b;}
       但C++编译器处理后成员函数的原型变成 void MovePoint( Point *this, int a, int b),默认加入了this指针
    


C++虚函数和纯虚函数用法:
    1. 虚函数和纯虚函数可以定义在同一个类,含有纯虚函数的类被称为抽象类,而只含有虚函数的类不能被称为抽象类
    2. 虚函数可以被直接使用,也可以被子类重载以后以多态的形式调用,而纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类只有声明而没
    有定义
    3. 虚函数和纯虚函数都可以在子类中被重载,以多态的形式被调用
    4. 虚函数的定义形式:virtual {method body} ;纯虚函数的定义形式:virtual { } = 0; 在虚函数和纯虚函数的定义中不能有static标识符,原因很简
    单,被static修饰
       的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样
    5. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类是不能被直接调用的。必须被子类继承重载以
    后,根据要求
       调用其子类的方法
    6. 带纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。这样的类也叫抽象类



析构函数不会被继承,构造函数也不能是虚函数,要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时
候,必然会由于试图调用构造函数、析构函数而导致编译错误


strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
    答:为了实现链式表达式。 // 2分
    例如int length = strlen( strcpy( strDest, "hello world") );


深入分析Linux内核源码: http://oss.org.cn/kernel-book/





class ClassName
{
public:
   int Fun() const;
  .....
};
有了const,这样,在调用函数Fun时就不能修改类里面的数据


android防止反编译
让proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了








判断手机当前上网用的是sim卡还是wifi
private boolean checkWifi() {  
    boolean isWifiConnect = true;  
    ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] networkInfos = cm.getAllNetworkInfo();  

    for (int i = 0; i         if (networkInfos[i].getState() == NetworkInfo.State.CONNECTED) {  
           if(networkInfos[i].getType() == cm.TYPE_MOBILE) {  
           isWifiConnect = false;  
           }  
           if(networkInfos[i].getType() == cm.TYPE_WIFI) {  
           isWifiConnect = true;  
           }  
        }  
    }

        return isWifiConnect;
}  


判断当前的手机屏幕是否开启了旋转屏幕这个选项
 systemGravity = Settings.System.getInt(this  
.getContentResolver(),  
Settings.System.ACCELEROMETER_ROTATION);//1 is open;0 is close;


launcher布局:
可以实现把自己的apk放到主屏幕上哦,不过是烧写玩后第一次开机的时候就解析xml文件了,所以以后的lanucher更改必须要烧写或者恢复出厂设置才生效的
http://blog.csdn.net/wdaming1986/article/details/6978814




android的notificaiton的声音sound也是申请的AudioManager机制来播放声音的。恢复出厂设置后,手机刚启动,接受短信没有声音,如果恢复出厂设置后,等一会
儿,过个2分钟再接受短信,就有铃声了。下面我把我分析代码的方法写下来,给自己和读者一些启发
framework/base/services/java/com/android/server/NotificationManagerService.java类中
在871行有这句代码:uri = notification.sound;在886行有这句代码:mSound.play(mContext, uri, looping, audioStreamType)
在467行有这段代码:
if (0 == Settings.Secure.getInt(mContext.getContentResolver(),  
                 Settings.Secure.DEVICE_PROVISIONED, 0)) {  
         mDisabledNotifications = StatusBarManager.DISABLE_NOTIFICATION_ALERTS;  
     }  
研究以上的注释,发现原来google故意这么设置的,至于google为什么要这么设置,我没有深究,暂时没有想明白,但是这个这个初始化的时候必须要tsetup
wizard (设置向导)运行一次,所以导致了值不对,所以这个notification就不响了。




Android.mk常用的一些语法:
include $(call first-makefiles-under,$(LOCAL_PATH))
include $(call all-makefiles-under,$(LOCAL_PATH))




如何降低GCC版本
查看/usr/bin/下所有的GCC版本,找到你想要的
ln -sf /usr/bin/gcc-4.4 /usr/bin/gcc




如何解决面板显示不了网络状态的问题
sudo apt-get install nm-applet
sudo apt-get install network-manager-gnome
nm-applet
sudo vim /etc/NetworkManager/NetworkManager.conf
更改为如下,然后重启即可:
  8 [ifupdown]
  9 managed=true
声音图标则在面板 -> 指示器小程序

gnome 无法使用alt+tab切换窗口解决方法:
安装cpmpiz配置管理程序:sudo apt-get install compizconfig-settings-manager





imapx15制作ramdisk:
out/host/linux-x86/bin/mkimage -A arm -O linux -T ramdisk -C none -a 0x41000000 -n "hRamdisk" -d  ramdisk.img.ori ramdisk.img





开机自动挂载分区命令:
查看UUID:
sudo blkid

vim /etc/fstab,增加如下:
/dev/disk/by-uuid/6b90dc40-85bf-40d1-b80c-68d9adce3d38 /home/lsc/disk auto nosuid,nodev,nofail 0 0








virtualbox打开提示错误的办法:
http://sfchipan.me/ubuntu-12-1-use-virtualbox-to-install-win7/
今天来上班 我的虚拟机 就提示这样的错误。 我检测了下系统日志,原来是系统升级了。没更新 kernel-headers 的问题。

打开终端: 执行下面的步骤

sudo apt-get update
然后
sudo apt-get upgrade
这将确保你有最新的所有文件。
然后做
sudo apt-get install linux-headers-$(uname -r)
然后做
VBoxManage startvm ubuntu
如果你自己执行了 sudo /etc/init.d/vboxdrv setup
请执行下 sudo /etc/init.d/vboxdrv setup 然后在执行VBoxManage命令!




编译kernel时候提示找不到gcc编译工具,有可能是SVN版本的问题,卸载即可:
sudo apt-get install subversion,原因是由于用git管理代码但又下载了svnversion引起的,



platform_driver_probe与platform_driver_register的区别:
唯一的区别是platform_driver_probe;不能被以后其他的device probe了,也就是说这个driver只能和一个device绑定
所有的设备通过bus_id挂在总线上,多个device可以共用一个driver,但是一个device不可以对应多个driver,因为driver会申请device中的资源,如果之前有别的driver已经申请了这些资源,后来的driver当然也就不会注册成功了





创建一个loop device的步骤:
1. dd if=/dev/zero of=FS_on_file bs=1k count=10000 //注意这里不能是/dev/null哦,否则创建不成功
2. 使用losetup命令创建一个loop device:losetup /dev/loop0 FS_on_file
3. 创建一个文件系统:mkfs -t ext3 /dev/loop0
4. 挂载这个文件系统: mount /dev/loop0 /mnt/FS_file0
最后:如果要删除刚才创建的这些对象,依次执行如下步骤:
$ umount /dev/loop0
$ losetup -d /dev/loop0
$ rm FS_on_file



eclipse运行出错的Can't load library: /home/lsc/.swt/lib/linux/x86_64/libswt-gtk-3740.so
Can't load library: /home/lsc/.swt/lib/linux/x86_64/libswt-gtk.so     解决方法:
cp /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64








git diff 没有颜色的解决方法:
$ git config --global color.status auto    
$ git config --global color.diff auto    
$ git config --global color.branch auto    
$ git config --global color.interactive auto  


如何编译模块的时候提示类似如下信息:
ERROR: "imapx_pad_get_indat" [drivers/input/touchscreen/gslX680.ko] undefined!
ERROR: "imapx_pad_irq_clear" [drivers/input/touchscreen/gslX680.ko] undefined!
ERROR: "imapx_pad_irq_pending" [drivers/input/touchscreen/gslX680.ko] undefined!
ERROR: "imapx_pad_irq_number" [drivers/input/touchscreen/gslX680.ko] undefined!
则是因为这些函数没有EXPORT_SYMBOL的原因,export出来即可






修改android默认语言在device的mk文件中 persist.sys.language=zh \ persist.sys.country=CN \
参考build/target/product/languages_full.mk中的缩写即可。
各国语言缩写-各国语言简称
en 英文
en_US 英文 (美国)
ar 阿拉伯文
ar_AE 阿拉伯文 (阿拉伯联合酋长国)
ar_BH 阿拉伯文 (巴林)
ar_DZ 阿拉伯文 (阿尔及利亚)
ar_EG 阿拉伯文 (埃及)
ar_IQ 阿拉伯文 (伊拉克)
ar_JO 阿拉伯文 (约旦)
ar_KW 阿拉伯文 (科威特)
ar_LB 阿拉伯文 (黎巴嫩)
ar_LY 阿拉伯文 (利比亚)
ar_MA 阿拉伯文 (摩洛哥)
ar_OM 阿拉伯文 (阿曼)
ar_QA 阿拉伯文 (卡塔尔)
ar_SA 阿拉伯文 (沙特阿拉伯)
ar_SD 阿拉伯文 (苏丹)
ar_SY 阿拉伯文 (叙利亚)
ar_TN 阿拉伯文 (突尼斯)
ar_YE 阿拉伯文 (也门)
be 白俄罗斯文
be_BY 白俄罗斯文 (白俄罗斯)
bg 保加利亚文
bg_BG 保加利亚文 (保加利亚)
ca 加泰罗尼亚文
ca_ES 加泰罗尼亚文 (西班牙)
ca_ES_EURO 加泰罗尼亚文 (西班牙,Euro)
cs 捷克文
cs_CZ 捷克文 (捷克共和国)
da 丹麦文
da_DK 丹麦文 (丹麦)
de 德文
de_AT 德文 (奥地利)
de_AT_EURO 德文 (奥地利,Euro)
de_CH 德文 (瑞士)
de_DE 德文 (德国)
de_DE_EURO 德文 (德国,Euro)
de_LU 德文 (卢森堡)
de_LU_EURO 德文 (卢森堡,Euro)
el 希腊文
el_GR 希腊文 (希腊)
en_AU 英文 (澳大利亚)
en_CA 英文 (加拿大)
en_GB 英文 (英国)
en_IE 英文 (爱尔兰)
en_IE_EURO 英文 (爱尔兰,Euro)
en_NZ 英文 (新西兰)
en_ZA 英文 (南非)
es 西班牙文
es_BO 西班牙文 (玻利维亚)
es_AR 西班牙文 (阿根廷)
es_CL 西班牙文 (智利)
es_CO 西班牙文 (哥伦比亚)
es_CR 西班牙文 (哥斯达黎加)
es_DO 西班牙文 (多米尼加共和国)
es_EC 西班牙文 (厄瓜多尔)
es_ES 西班牙文 (西班牙)
es_ES_EURO 西班牙文 (西班牙,Euro)
es_GT 西班牙文 (危地马拉)
es_HN 西班牙文 (洪都拉斯)
es_MX 西班牙文 (墨西哥)
es_NI 西班牙文 (尼加拉瓜)
et 爱沙尼亚文
es_PA 西班牙文 (巴拿马)
es_PE 西班牙文 (秘鲁)
es_PR 西班牙文 (波多黎哥)
es_PY 西班牙文 (巴拉圭)
es_SV 西班牙文 (萨尔瓦多)
es_UY 西班牙文 (乌拉圭)
es_VE 西班牙文 (委内瑞拉)
et_EE 爱沙尼亚文 (爱沙尼亚)
fi 芬兰文
fi_FI 芬兰文 (芬兰)
fi_FI_EURO 芬兰文 (芬兰,Euro)
fr 法文
fr_BE 法文 (比利时)
fr_BE_EURO 法文 (比利时,Euro)
fr_CA 法文 (加拿大)
fr_CH 法文 (瑞士)
fr_FR 法文 (法国)
fr_FR_EURO 法文 (法国,Euro)
fr_LU 法文 (卢森堡)
fr_LU_EURO 法文 (卢森堡,Euro)
hr 克罗地亚文
hr_HR 克罗地亚文 (克罗地亚)
hu 匈牙利文
hu_HU 匈牙利文 (匈牙利)
is 冰岛文
is_IS 冰岛文 (冰岛)
it 意大利文
it_CH 意大利文 (瑞士)
it_IT 意大利文 (意大利)
it_IT_EURO 意大利文 (意大利,Euro)
iw 希伯来文
iw_IL 希伯来文 (以色列)
ja 日文
ja_JP 日文 (日本)
ko 朝鲜文
ko_KR 朝鲜文 (南朝鲜)
lt 立陶宛文
lt_LT 立陶宛文 (立陶宛)
lv 拉托维亚文(列托)
lv_LV 拉托维亚文(列托) (拉脱维亚)
mk 马其顿文
mk_MK 马其顿文 (马其顿王国)
nl 荷兰文
nl_BE 荷兰文 (比利时)
nl_BE_EURO 荷兰文 (比利时,Euro)
nl_NL 荷兰文 (荷兰)
nl_NL_EURO 荷兰文 (荷兰,Euro)
no 挪威文
no_NO 挪威文 (挪威)
no_NO_NY 挪威文 (挪威,Nynorsk)
pl 波兰文
pl_PL 波兰文 (波兰)
pt 葡萄牙文
pt_BR 葡萄牙文 (巴西)
pt_PT 葡萄牙文 (葡萄牙)
pt_PT_EURO 葡萄牙文 (葡萄牙,Euro)
ro 罗马尼亚文
ro_RO 罗马尼亚文 (罗马尼亚)
ru 俄文
ru_RU 俄文 (俄罗斯)
sh 塞波尼斯-克罗地亚文
sh_YU 塞波尼斯-克罗地亚文 (南斯拉夫)
sk 斯洛伐克文
sk_SK 斯洛伐克文 (斯洛伐克)
sl 斯洛文尼亚文
sl_SI 斯洛文尼亚文 (斯洛文尼亚)
sq 阿尔巴尼亚文
sq_AL 阿尔巴尼亚文 (阿尔巴尼亚)
sr 塞尔维亚文
sr_YU 塞尔维亚文 (南斯拉夫)
sv 瑞典文
sv_SE 瑞典文 (瑞典)
th 泰文
th_TH 泰文 (泰国)
tr 土耳其文
tr_TR 土耳其文 (土耳其)
uk 乌克兰文
uk_UA 乌克兰文 (乌克兰)
zh 中文
zh_CN 中文 (中国)
zh_HK 中文 (香港)
zh_TW 中文 (台湾)

 

补充:

fa 波斯文

fa_IR 波斯文(伊朗)

fa_AF 波斯文(阿富汗)

he 希伯来文

he_IL 希伯来文 (以色列)





android各个文件夹的权限配置:
system/core/include/private/android_filesystem_config.h



Activity 以 Dialog 形式存在:
只要在AndroidManifest.xml中设置该Activity属性为:
android:theme="@android:style/Theme.Dialog"  
?android:theme="@android:style/Theme.Dialog"   将一个Activity显示为对话框模式
?android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏
?android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏
?android:theme="Theme.Light"  背景为白色
?android:theme="Theme.Light.NoTitleBar"  白色背景并无标题栏
?android:theme="Theme.Light.NoTitleBar.Fullscreen"  白色背景,无标题栏,全屏
?android:theme="Theme.Black"  背景黑色
?android:theme="Theme.Black.NoTitleBar"  黑色背景并无标题栏
?android:theme="Theme.Black.NoTitleBar.Fullscreen"    黑色背景,无标题栏,全屏
?android:theme="Theme.Wallpaper"  用系统桌面为应用程序背景
?android:theme="Theme.Wallpaper.NoTitleBar"  用系统桌面为应用程序背景,且无标题栏
?android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"  用系统桌面为应用程序背景,无标题栏,全屏
?android:theme="Translucent"
?android:theme="Theme.Translucent.NoTitleBar"
?android:theme="Theme.Translucent.NoTitleBar.Fullscreen"
?android:theme="Theme.Panel"
?android:theme="Theme.Light.Panel"


串口中remount system:
mount -o remount rw /system


android定制默认输入法,比如拼音输入法:
在frameworks/base/packages/SettingsProvider/res/values/defaults.xml增加一个配置:
com.android.inputmethod.pinyin/.PinyinIME
方法一:
在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java中增加:
loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS, R.string.config_default_input_method);
方法二:
在frameworks/base/services/java/com/android/server/InputMethodManagerService.java的buildInputMethodListLocked()方法中增加:
    String defaultIme = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
    if ( defaultIme == null )
    {
        final Resources res = mContext.getResources();
        try
        {
        String myIME = res.getString( com.android.internal.R.string.config_default_input_method );
        if ( myIME != null && myIME.length() > 0 )
        {
            Settings.Secure.putString( mContext.getContentResolver(),
                    Settings.Secure.DEFAULT_INPUT_METHOD,
                    myIME );
        }
        }
        catch ( Exception e )
        {
        }
    }






CWHL关于关机播放音乐的问题,ND6如有需要复制该代码即可:
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中对powerkey进行处理:
case KeyEvent.KEYCODE_POWER: -> interceptPowerKeyDown(在PhoneWindowManager.java中):
     713     private void interceptPowerKeyDown(boolean handled) {                     
     714         mPowerKeyHandled = handled;
     715         if (!handled) {
     716             mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout());
     717         }
     718     }

frameworks/base/core/java/com/android/internal/app/ShutdownThread.java中有
180         MediaPlayer mediaplayer =new MediaPlayer();
181         try
182         {
183             mediaplayer.setDataSource("/system/media/shutdown.mp3");
184             mediaplayer.prepare();
185             mediaplayer.start();
186         }catch (IOException e)
187         {
188
189         }




java延时函数:
try {
        Thread.sleep(5000);//括号里面的5000代表5000毫秒,也就是5秒,可以该成你需要的时间
} catch (InterruptedException e) {
        e.printStackTrace();
}



android时区设置可以查看external/icu4c/data/misc/timezoneTypes.txt的时区表







android新增API然后打包android.jar的方法:
1、在frameworks/base/下新建目录如av
2、在frameworks/base/Android.mk的packages_to_document后面增加如android/av
3、在build/core/pathmap.mk的FRAMEWORKS_BASE_SUBDIRS增加tv
4、执行make clean;make update-api;make -j4 -l8;make sdk即可生成android.jar

禁止视频音频播放的方法:

在MediaPlayerService.cpp中static sp createPlayer()函数中把相应的类型去掉即可,注意要保留CEDARX_PLAYER:类型,否则无法打开摄像机


imapx15制作ramdisk:
out/host/linux-x86/bin/mkimage -A arm -O linux -T ramdisk -C none -a 0x41000000 -n "hRamdisk" -d  ramdisk.img.ori ramdisk.img
infotmic压缩system.img的方法:
./build/tools/mktarball.sh out/host/linux-x86/bin/fs_get_stats out/target/product/m75y2l system out/target/product/m75y2l/system.tar out/target/product/m75y2l/system.img
解压的方法:
tar xvf system.img

你可能感兴趣的:(学习)