kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

使用usb进行调试

一 下载

下载 platform-tools 或 adt-bundle-linux-x86_64-XXX.zip(这个很大)

二 连接

adb start-server 打开服务
如果一切正常的话
输入
adb devices
就能显示出当前连接到电脑的android设备 ^_^
试试这个命令
adb shell
就能在Ubuntu上的终端执行android的shell命令了
su
切换到root

或者

adb root

adb shell
不过这种不一定成功

三 fastboot 模式

有些手机有自己的刷机软件,这种的fastboot连不上–大品牌
没有自己的刷机软件的,一般都可以用fastboot连接–杂牌、国产。。。

查看设备, 注意fastboot要加-i,其他网上搜到的对我试的三种机子都无效。 http://bbs.nubia.cn/thread-167619-1-1.html

1
2
3
4
5
lsusb
Bus 002 Device 001: ID 19d2:2286 xxxx机型


fastboot -i 0x19D2 devices

四 不能执行的sdcard分区如下

$ mount

1
/dev/block/vold/93:80 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0

我用的平台,默认加载sdcard分区是noexec,所以无法执行该分区下的文件。

重新加载该分区mount -o rw,remount /mnt/sdcard /sdcard

然后一切正常,自己的执行程序现在工作正常了。

编译Android的kernel

一 下载

  1. 下载arm编译器
    https://launchpad.net/gcc-arm-embedded/+download

  2. 进入到你的android源代码目录,敲入下面命令:
    git clone http://android.googlesource.com/kernel/goldfish.git kernel

  3. cd kernel 进入我们刚才创建的kernel文件夹

  4. git branch -avv 查看远程的git 库
    我们选择remotes/origin/android-goldfish-2.6.29分支来下载

  5. git checkout -b android-goldfish-2.6.29 remotes/origin/android-goldfish-2.6.29

二 编译kernel代码

  1. 设置环境变量
    export PATH=$PATH:~/andr-perf/gcc-arm-none-eabi-4_8-2014q3/bin

  2. 修改kernel下面的makefile文件,修改
    ARCH ?= $(SUBARCH)
    CROSS_COMPILE ?=
    这两个字段成如下内容:
    ARCH ?= arm
    CROSS_COMPILE ?= arm-none-eabi-
    // 但是对于make goldfish_armv7_defconfig这样编译的内核模拟器好像启动不了,应该是默认编译成v5的,需要改成v7。或者可以改成ndk的编译器
    // CROSS_COMPILE ?= /home/kk/andr-perf/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-

  3. 开始编译,敲入如下命令
    make goldfish_defconfig
    或者看arch/arm/configs/目录下有什么,就挑一个make XXX

  4. 正式编译,敲入如下命令
    make

正式编译成功之后,我们会看到如下文字:
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready

三 利用新编译的kernel来启动模拟器

  1. 在启动模拟器之前,先设置模拟器的目录到环境变量$PATH中去:
    USER-NAME@MACHINE-NAME:~/Android$ export PATH=$PATH:~/android_prj/out/host/linux-x86/bin

  2. 设置ANDROID_PRODUCT_OUT环境变量:
    USER-NAME@MACHINE-NAME:~/Android$ export ANDROID_PRODUCT_OUT=~/android_prj/out/target/product/generic
    同样,如果你的源代码目录不是android_prj,请注意修改下。另外,如果你已经配置了环境变量。则不必如此。建议最好写到配置文件 ~/.bash_rc配置文件里面去。 免得每次都要配置

  3. 启动模拟器
    一、 cd ~/android_prj 回到源代码目录
    sandy@ubuntu:~/android_prj$ emulator -kernel ./kernel/arch/arm/boot/zImage 利用刚才我们编译的kernel内核启动模拟器
    二、 emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImage
    -avd后面的参数 myavd即为模拟器的名字,-kernel后面的参数就找到刚才编译出的内核的路径。
    若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间,3分钟到15分钟不等。

  4. 验证结果
    待模拟器启动完毕之后,我们敲入adb shell
    第一次会说device offline,不管它,再敲入一遍,就会进入adb 调试
    然后cd proc 进入proc目录,cat version

部分GCC选项

-Werror 和 -I 很有用
命令描述
-l library-llibrary 进行链接时搜索名为library的库。例子: $ gcc test.c -lm -o test
-Idir dir加入到搜索头文件的路径列表中。例子: $ gcc test.c -I../inc -o test
-Ldir dir加入到搜索库文件的路径列表中。例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test
-Dname 预定义一个名为name的宏,值为1。例子: $ gcc -DTEST_CONFIG test.c -o test
-Dname=definition 预定义名为name,值为definition的宏。
-ggdb -ggdblevel 为调试器 gdb 生成调试信息。level可以为1,2,3,默认值为2。
-g -glevel 生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level取值同上。
-s 去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。
-M 告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个 源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 #include引用的所有文件。生成的规则可 以是单行,但如果太长,就用`/'-换行符续成多行。规则 显示在标准输出,不产生预处理过的C程序。
-C 告诉预处理器不要丢弃注释。配合`-E'选项使用。
-P 告诉预处理器不要产生`#line'命令。配合`-E'选项使用。
-static 在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上 无效。
-nostdlib 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。
Warnings
-Wall 会打开一些很有用的警告选项,建议编译时加此选项。
-W -Wextra 打印一些额外的警告信息。
-w 禁止显示所有警告信息。
-Wshadow 当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。很有用的选项,建议打开。 -Wall 并不会打开此项。
-Wpointer-arith 对函数指针或者void *类型的指针进行算术操作时给出警告。也很有用。 -Wall 并不会打开此项。
-Wcast-qual 当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项。
-Waggregate-return 如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。
-Winline 无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告。如果你的代码含有很多 inline 函数的话,这是很有用的选项。
-Werror 把警告当作错误。出现任何警告就放弃编译。
-Wunreachable-code 如果编译器探测到永远不会执行到的代码,就给出警告。也是比较有用的选项。
-Wcast-align 一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告。
-Wundef 当一个没有定义的符号出现在 #if 中时,给出警告。
-Wredundant-decls 如果在同一个可见域内某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别。