2012/01/19

mm busybox on android tree

寫過一篇 cross compile busybox for android,因為剛剛看到一篇mm busybox on android tree,覺得不錯就貼上來。(註:編譯出來的檔案會小很多)

基本上相當簡單,照底下的做就行了....


  • cd $ANDROID/external/
  • git clone https://github.com/CyanogenMod/android_external_busybox.git --branch ics
  • cd android_external_busybox
  • mm
希望您能一切順利。這邊要提醒的是,這個 android_external_busybox 因為跟 android bionic 有很大的相關性,因此您得切換到與您的 android 版本相關的分支才行

若比對 gingerbread 與 ics 的差異...

  • Android.mk: BIONIC_ICS := false --> BIONIC_ICS := true
  • networking/nslookup.c: # define _res _nres  --> # define _res (*__res_get_state())
    這個變動若您在 android 需要寫程式對 dns 有需求的話,可能會遇到問題,請見這篇
  • util-linux/dmesg.c: 加了底下這些,不影響大局:
    diff -ruN busybox-gingerbread//util-linux/dmesg.c busybox-ics/util-linux/dmesg.c
    --- busybox-gingerbread//util-linux/dmesg.c     2012-01-19 17:23:20.415785436 +0800
    +++ busybox-ics/util-linux/dmesg.c      2012-01-19 17:10:43.165785088 +0800
    @@ -10,16 +10,24 @@
      */
    
     //usage:#define dmesg_trivial_usage
    -//usage:       "[-c] [-n LEVEL] [-s SIZE]"
    +//usage:       "[-c] [-n LEVEL] [-r] [-s SIZE] [-C]"
     //usage:#define dmesg_full_usage "\n\n"
     //usage:       "Print or control the kernel ring buffer\n"
     //usage:     "\n       -c              Clear ring buffer after printing"
     //usage:     "\n       -n LEVEL        Set console logging level"
    +//usage:     "\n       -r              Show level prefix"
     //usage:     "\n       -s SIZE         Buffer size"
    +//usage:     "\n       -C              Colored output"
    
     #include 
     #include "libbb.h"
    
    +#define COLOR_DEFAULT 0
    +#define COLOR_WHITE   231
    +#define COLOR_YELLOW  226
    +#define COLOR_ORANGE  166
    +#define COLOR_RED     196
    +
     int dmesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     int dmesg_main(int argc UNUSED_PARAM, char **argv)
     {
    @@ -29,11 +37,13 @@
            enum { 
                    OPT_c = 1 << 0,
                    OPT_s = 1 << 1,
    -               OPT_n = 1 << 2
    +               OPT_n = 1 << 2,
    +               OPT_r = 1 << 3,
    +               OPT_C = 1 << 4
            };
    
            opt_complementary = "s+:n+"; /* numeric */
    -       opts = getopt32(argv, "cs:n:", &len, &level);
    +       opts = getopt32(argv, "cs:n:rC", &len, &level);
            if (opts & OPT_n) {
                    if (klogctl(8, NULL, (long) level))
                            bb_perror_msg_and_die("klogctl");
    @@ -55,13 +65,37 @@
                    return EXIT_SUCCESS;
    
    
    -       if (ENABLE_FEATURE_DMESG_PRETTY) {
    +       if ((ENABLE_FEATURE_DMESG_PRETTY || (opts & OPT_C)) && !(opts & OPT_r)) {
                    int last = '\n';
    -               int in = 0;
    +               int in = 0, l, color;
    +               char pfx[16], *lvl;
    
                    /* Skip <#> at the start of lines */
                    while (1) {
                            if (last == '\n' && buf[in] == '<') {
    +                               if (opts & OPT_C) {
    +                                       lvl = buf + in + 1;
    +                                       sscanf(lvl, "%d", &level);
    +
    +                                       switch (level) {
    +                                       case 1:
    +                                       case 2:
    +                                       case 3: color = COLOR_RED;    break;
    +                                       case 4: color = COLOR_ORANGE; break;
    +                                       case 5: color = COLOR_YELLOW; break;
    +                                       case 7: color = COLOR_WHITE;  break;
    +                                       case 6: // common dmesg info
    +                                       default: color = COLOR_DEFAULT;
    +                                       }
    +
    +                                       if (color != COLOR_DEFAULT)
    +                                               l = sprintf(pfx, "%c[%d;%d;%dm",
    +                                                       0x1B, 38, 5, color);
    +                                       else
    +                                               l = sprintf(pfx, "%c[%dm", 0x1B, 0);
    +
    +                                       full_write(STDOUT_FILENO, pfx, l);
    +                               }
                                    in += 3;
                                    if (in >= len)
                                            break;
    @@ -72,9 +106,17 @@
                            if (in >= len)
                                    break;
                    }
    +
    +               if (opts & OPT_C) {
    +                       /* Reset default terminal color */
    +                       l = sprintf(pfx, "%c[%dm", 0x1B, 0);
    +                       full_write(STDOUT_FILENO, pfx, l);
    +               }
    +
                    /* Make sure we end with a newline */
                    if (last != '\n')
                            bb_putchar('\n');
    +
            } else {
                    full_write(STDOUT_FILENO, buf, len);
                    if (buf[len-1] != '\n')
    

0 意見: