2011年3月9日 星期三

[Android] Basic tips for Android protection

Vince筆記
  • Afirewall- aFirewall is the free version of Android Firewall which blocks incoming calls from numbers you specify. If you don’t wants to receive a particular call from a person then install this superb application. This application works fantastically and is a must have for anyone who wants to block incoming calls from telemarketers, bill collectors or your run of the mill harassing calls.
    • 延伸閱讀
      • Reference 1
  • Droidhunter- it is a security service for Android with inbuilt anti-virus, interruption detection, online managing service and incoming alerts. This app is similar to the traditional desktop security software except that it looks for Android specific threats. Android phone scans as “Very Clean” but user reviews report the interception of suspicious apps as well as other Android security threats. This program comes in a free version as well as a paid version which can be used to locate a lost or stolen phone.
    • 延伸閱讀
      • Reference 1
  • App protector- it is an application which allows you to lock your choice of applications on your Android phone. You can set a password, and when you try to enter a protected app, you will be asked to enter the password. Useful if your phone is stolen or if you store information on your phone you’d rather not have accessed by people you let look at your Android phone. Protect as many or as few applications as you like and remove the password lock on applications at anytime. One thing to keep in mind is you will want to protect your uninstaller application, so a person can’t simply uninstall this program to remove the password locks and then access your sensitive information. This program comes in a free time-limited trial (7 days). You can remove the password anytime, but a person can’t simply remove the password locks by uninstalling the application.
    • 延伸閱讀
      • Reference 1

相關連結





      2011年3月8日 星期二

      [Android] Logcat in Java

      在Eclipse中叫出LogCat的小視窗
      Window -> Show View -> Other,找Android -> LogCat

      Log基本用法
      Log.v(TAG, Message): 詳細訊息(Verbose)
      Log.d(TAG, Message): 除錯訊息(Debug)
      Log.i(TAG, Message): 資訊訊息(INFO)
      Log.w(TAG, Message): 警告訊息(Warning)
      Log.e(TAG, Message): 錯誤訊息(Error)
      
      第一個欄位是TAG,第二個欄位是Message,TAG可以方便做filter
      Ex: Log.i("Tag", "This log.i for logcat");
      

      如何filter
      1. 在Eclipse中叫出LogCat的小視窗
      2. 按下綠色加號產生filter






      3. 設定filter

      [Android] Android Service

      什麼是Android Service
      • A service can run in the background to perform work even while the user is in a different application.
      • A service can allow other components to bind to it, in order to interact with it and perform interprocess communication.
      • A service runs in the main thread of the application that hosts it, by default.

      來個例子

      在AndroidManifest.xml中增加一個Service,其中ExampleService為你Service class的名稱
      <manifest ... >
        ...  
        <application ... >      
        <service android:name=".ExampleService" />
        ...  
       </application>
      </manifest>

      建立myService.java,參考自Android學習筆記 - 背景執行服務(Service)
      package com.cyberlink.dtcpip; 
      import android.app.Service; 
      import android.content.Intent; 
      import android.os.Handler; 
      import android.os.IBinder; 
      import android.util.Log; 
      import java.util.Date; 
      
      //繼承android.app.Service 
      public class myService extends Service { 
          private Handler handler = new Handler(); 
        
          @Override
          public IBinder onBind(Intent intent) { 
              return null; 
          } 
        
          @Override
          // The old onStart method that will be called on the pre-2.0
          // platform. On 2.0 or later we override onStartCommand().
          public int onStartCommand(Intent intent, int flags, int startId) { 
          // We want this service to continue running until it is explicitly
          // stopped, so return sticky.
              handler.postDelayed(showTime, 1000); 
              super.onStartCommand(intent, flags, startId);
              return START_STICKY;
          } 
        
          @Override
          public void onDestroy() { 
              handler.removeCallbacks(showTime); 
              super.onDestroy(); 
          } 
            
          private Runnable showTime = new Runnable() { 
              public void run() { 
                  //log目前時間 
                  Log.i("[MyService]", "Time = " + new Date().toString()); 
                  handler.postDelayed(this, 1000); 
              } 
          }; 
      }
      

      By returning the START_STICKY constant when your Service is started, you tell Android that if it has to kill the Service to free up valuable resources, then you’d like it to restart the Service when resource become available again.

      啟動Service
      Intent intent = new Intent(this, myService.class); 
      startService(intent); 
      

      關閉Service
      Intent intent = new Intent(this, myService.class); 
      stopService(intent); 
      

      相關連結

      2011年3月7日 星期一

      [MultiMedia] FLV format

      The FLV header
      All FLV files begin with the following header:
      • Signature(UI8): Signature byte always 'F' (0x46)
      • Signature(UI8): Signature byte always 'L' (0x4C)
      • Signature(UI8): Signature byte always 'V' (0x56)
      • Version(UI8): File version (for example, 0x01 for FLV version 1)
      • TypeFlagsReserved(UB[5]): Must be 0
      • TypeFlagsAudio(UB[1]): Audio tags are present
      • TypeFlagsReserved(UB[1]): Must be 0
      • TypeFlagsVideo(UB[1]): Video tags are present
      • DataOffset(UI32): Offset in bytes from start of file to start of body (that is, size of header)
      The DataOffset field usually has a value of 9 for FLV version 1. This field is present to
      accommodate larger headers in future versions.

      Example:
      0x46 0x4C 0x56 0x01 0x05 0x00 0x00 0x00 0x09
      means
      TypeFlagsAudio = 1
      TypeFlagsVideo = 1
      DataOffset = 0x00 0x00 0x00 0x09
      

      The FLV file body
      After the FLV header, the remainder of an FLV file consists of alternating back-pointers and tags. They interleave as shown in the following table:
      • PreviousTagSize0(UI32): Always 0
      • Tag1(FLVTAG): First tag
      • PreviousTagSize1(UI32): Size of previous tag, including its header. For FLV version 1, this value is 11 plus the DataSize of the previous tag.
      • Tag2(FLVTAG): Second tag
      • ...
      • PreviousTagSizeN-1(UI32): Size of second-to-last tag
      • TagN(FLVTAG): Last tag
      • PreviousTagSizeN(UI32): Size of last tag
      FLV tags
      FLV tags have the following format:
      • TagType(UI8): Type of this tag. Values are: 0x8: audio, 0x9: video, 0x12: script data and all others: reserved.
      • DataSize(UI24): Length of the data in the Data field
      • Timestamp(UI24): Time in milliseconds at which the data in this tag applies. This value is relative to the first tag in the FLV file, which always has a timestamp of 0.
      • TimestampExtended(UI8): Extension of the Timestamp field to form a SI32 value. This field represents the upper 8 bits, while the previous Timestamp field represents the lower 24 bits of the time in milliseconds.
      • StreamID(UI24): Always 0.
      • Data: If TagType == 0x08 for AUDIODATA; If TagType == 0x09 for VIDEODATA; If TagType == 0x12 for SCRIPTDATAOBJECT

      Example:
      0x12 0x00 0x03 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      means
      Tagype = 0x12
      DataSize = 0x00 0x03 0x15
      TimeStamp = 0x00 0x00 0x00
      TimeStampExtend = 0x00
      StreamID = 0x00 0x00 0x00

      [Java] JLint 文斯不負責報導

      今天要介紹的是這套JLint(http://artho.com/jlint/)的工具

      簡單來說,JLint是一個可以幫你分析你寫的Java程式碼的工具,包括語法(syntax)及語義(semantic)檢查,不一致性及同步問題等。其中AntiC.exe是負責語法檢查,JLint.exe是負責語義檢查。

      快速入門(如果你只想知道如何用
      • 下載:到JLint官方網站下載(http://artho.com/jlint/download.shtml),我是下載Windows版 jlint-2.3.zip
      • 解壓縮:將jlint-2.3.zip解壓縮。如果你只是要使用JLint來檢查Java程式碼,你需要用到 jlint-2.3\jlintwin32\中的兩個執行檔(antic.exe和jlint.exe)就可以了。
      • 語法檢查:antic.exe src\*.java(ex: src為放java檔的folder),執行完antic.exe就可以看到結果輸出。
      • 語義檢查:jlint.exe src\*.java(ex: src為放java檔的folder),執行完jlint.exe就可以看到結果輸出。
      細部講解(如果你想知道更詳細功能
      • AntiC能檢查的是
        • 字裡行間的蟲蟲戰爭(Bugs in tokens)
          • 跳離符號後數字必須是八進位數字。
          • 跳離符號後數字個數必須小於三個字元。
          • Unicode的跳離符號\u後接的是十六進位數字。
          • 跳離符號接了錯誤的字元(非八進位字元或Unicode)。
          •  少用Trigraph sequence(以??為前置字元的三字元序列)為妙。
          • 多字元的字元定義(char ch = 'ab';)是不一定可移植的。
          • 長整數定義時後置字元最好是大寫的L,小寫l會跟數字1混淆。
        • 運算子間的恩怨情仇(Operator priorities)
          • 運算子運算時最好有括號表示優先順序。
          • AND運算子優先權比OR運算子高。
          • 位元位移運算子優先權較低。
          • 邏輯中的等於是==而不是=。 
          • 指定運算子=具較低優先權。
          • 位元運算子具較低優先權。
        • 程式主體的誰是誰非(Statement body)
          • 迴圈中的程式碼最好用括號定義範圍。 
          • 邏輯IF的程式碼最好用括號定義範圍。
          • 邏輯ELSE的程式碼最好用括號定義範圍。
          • 條件邏輯SWITCH的程式碼最好用括號定義範圍。
          • 條件邏輯中的CASE或DEFAULT的程式碼最好用括號定義範圍。
          • 條件邏輯中的CASE或DEFAULT的程式碼不要忘了BREAK。

      • JLint能檢查的是
        • 同步(synchronization)
          • 死結(deadlock)
          • 競賽情況(Race Condition)
        • 繼承(inheritance)
          • 派生類別的方法名稱沒有正確覆蓋有相同名稱的基本類別的方法名稱
          • 派生類別中的元件名稱與基本類別元件名稱相同
          • 區域變數名稱與元件中全域變數名稱相同
          • 方法的finalize()未能Call到super.finalize()
        • 資料流程(data flow)
          • method的參數傳遞可能有null的情形
          • 變數的使用可能會有null的情形
          • 運算元可能會有null的情形,會有method的使用問題
          • 零個運算元的運算
          • 運算結果都為零
          • 位元位移計算超過位數(例如:int y >>= 32, 最最最最多只能shift 31位)
          • 位元位移計算超過範圍(例如:int x >>= 32 - (y & 31); // range of count is [1,32])
          • 變數值的轉換超出範圍(例如:int x = 100000; short s = x;)
          • 變數值的轉換會導致資料遺失(例如:數值範圍較大的變數轉換到數值範圍較小的變數)
          • 變數運算後的型態轉換會導致資料遺失(例如:兩個整數相乘)
          • 邏輯判斷恆為真(True)或假(False)
          • 只有當比較的運算元都為0時,邏輯判斷才會成立邏輯判斷邏輯判斷恆為真 邏輯判斷恆為真邏輯判斷恆為真 邏輯判斷恆為真邏輯判斷恆為真邏輯判斷恆為真邏輯判斷恆為真 最最最邏
          • 餘數運算恆等於第一個運算元
          • char與short比較
          • 字串比對誤用物件比對
          • 不等式的比較可以用等式的比較 替代
          • Switch中Case的值超出範圍




    • 更詳細地說明請看http://artho.com/jlint/manual.html
    • 2011年3月4日 星期五

      [Android] Android Debug Bridge (ADB)

      http://developer.android.com/guide/developing/tools/adb.html

      You can find the adb tool in <sdk>/platform-tools/.

      Installing an Application
      adb install 
      

      Copying Files to or from an Emulator/Device Instance
      To copy a file or directory (recursively) from the emulator or device, use
      adb pull <remote>> <local>

      To copy a file or directory (recursively) from the emulator or device, use
      adb push <local> <remote>

      2011年3月3日 星期四

      [Android] undefined reference to in ndk-build

      在ndk-build時, 需要的static library都有定義到

      LOCAL_STATIC_LIBRARIES := libABC \
      LOCAL_STATIC_LIBRARIES += libCDE \
      

      但卻還是發生undefined reference to `xxxxxx' 時

      這時候可能是 static library 的順序不對, 改一下順序再試看看吧
      LOCAL_STATIC_LIBRARIES := libCDE \
      LOCAL_STATIC_LIBRARIES += libABC \
      

      [HTTP] what is Chunk?

      http://developers.sun.com/mobility/midp/questions/chunking/

      The problem surfaces when a server tries to read a chunked request it isn't prepared for. In the body of a chunked message, each chunk of data begins with the size of the chunk and an extra CR/LF:

      C\r\n
      Some data...
      11\r\n
      Some more data...
      0\r\n
      

      [Android] System process cannot write file to the /sdcard

      http://groups.google.com/group/android-platform/browse_thread/thread/065bc037e44af858

      The system process is explicitly forbidden to open files on SD because those devices are frequently removable during runtime.

      If a process holds open file descriptors when the file system is unmounted, that process will be killed by the kernel.

      In the case of the system process, that would bring down the whole Android runtime; hence the restriction.

      Applications resident on SD complicate this a bit, but that's the basic problem in a nutshell, and is the reason for the explicit policy that you're seeing in action.

      For your test suite, you might consider using a two-process architecture in which the system-process test code communicates via the Binder or other IPC mechanism with another process whose job is mostly to handle the file I/O.

      Note that system process can write file to the /data.

      [Android] logcat in JNI

      http://blog.xuite.net/xoanonlin/LoveFor/39052853

      1. 加入header檔

      #include <android log.h>
      

      2. 加入需要的定義
      #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG  , "liblog",__VA_ARGS__) 
      
      #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "liblog",__VA_ARGS__)
      
      #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, "liblog",__VA_ARGS__)
      
      #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, "liblog",__VA_ARGS__)
      
      #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "liblog",__VA_ARGS__)
      

      3. 用法
      LOGD("Debug Message is from JNI");
      

      4. 加入LOCAL_LDLIBS在Android.mk, 這行要在include $(BUILD_SHARED_LIBRARY)之前, 否則會有undefined reference的錯誤
      LOCAL_LDLIBS :=  -L$(SYSROOT)/usr/lib -llog
      

      2011年3月2日 星期三

      [Android] wildcard usage in Android.mk

      For example, you can use wildcard to enumerate *.c in the folder.

      MY_NativeC_FILES += $(wildcard $(LOCAL_PATH)/*.c)
      

      [Android] Preprocessor definition in NDK

      http://stackoverflow.com/questions/4022180/how-to-add-a-custom-macro-when-using-ndk

      If you would like to add a special definition when compiling your NDK code (jni) add the following into your Android.mk:

      LOCAL_CFLAGS:=-DMYDEFINE
      

      This will define the Macro MYDEFINE in your c/c++ code. Here an example

      #ifdef MYDEFINE
      // We build the project with this special macro
      #else
      // We build without setting the macro in the LOCAL_CFLAGS
      #endif
      

      [Android] Android.mk Documentation

      http://hashspeaks.wordpress.com/2010/01/27/android-mk-documentation/

      Android.mk file syntax specification
      
      Introduction:
      -------------
      
      This document describes the syntax of Android.mk build file
      written to describe your C and C++ source files to the Android
      NDK. To understand what follows, it is assumed that you have
      read the docs/OVERVIEW.TXT file that explains their role and
      usage.
      
      Overview:
      ---------
      
      An Android.mk file is written to describe your sources to the
      build system. More specifically:
      
      - The file is really a tiny GNU Makefile fragment that will be
        parsed one or more times by the build system. As such, you
        should try to minimize the variables you declare there and
        do not assume that anything is not defined during parsing.
      
      - The file syntax is designed to allow you to group your
        sources into 'modules'. A module is one of the following:
      
          - a static library
          - a shared library
      
        Only shared libraries will be installed/copied to your
        application package. Static libraries can be used to generate
        shared libraries though.
      
        You can define one or more modules in each Android.mk file,
        and you can use the same source file in several modules.
      
      - The build system handles many details for you. For example, you
        don't need to list header files or explicit dependencies between
        generated files in your Android.mk. The NDK build system will
        compute these automatically for you.
      
        This also means that, when updating to newer releases of the NDK,
        you should be able to benefit from new toolchain/platform support
        without having to touch your Android.mk files.
      
      Note that the syntax is *very* close to the one used in Android.mk files
      distributed with the full open-source Android platform sources. While
      the build system implementation that uses them is different, this is
      an intentional design decision made to allow reuse of 'external' libraries'
      source code easier for application developers.
      
      Simple example:
      ---------------
      
      Before describing the syntax in details, let's consider the simple
      "hello JNI" example, i.e. the files under:
      
          apps/hello-jni/project
      
      Here, we can see:
      
        - The 'src' directory containing the Java sources for the
          sample Android project.
      
        - The 'jni' directory containing the native source for
          the sample, i.e. 'jni/hello-jni.c'
      
          This source file implements a simple shared library that
          implements a native method that returns a string to the
          VM application.
      
        - The 'jni/Android.mk' file that describes the shared library
          to the NDK build system. Its content is:
      
         ---------- cut here ------------------
         LOCAL_PATH := $(call my-dir)
      
         include $(CLEAR_VARS)
      
         LOCAL_MODULE    := hello-jni
         LOCAL_SRC_FILES := hello-jni.c
      
         include $(BUILD_SHARED_LIBRARY)
         ---------- cut here ------------------
      
      Now, let's explain these lines:
      
        LOCAL_PATH := $(call my-dir)
      
      An Android.mk file must begin with the definition of the LOCAL_PATH variable.
      It is used to locate source files in the development tree. In this example,
      the macro function 'my-dir', provided by the build system, is used to return
      the path of the current directory (i.e. the directory containing the
      Android.mk file itself).
      
        include $(CLEAR_VARS)
      
      The CLEAR_VARS variable is provided by the build system and points to a
      special GNU Makefile that will clear many LOCAL_XXX variables for you
      (e.g. LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, etc...),
      with the exception of LOCAL_PATH. This is needed because all build
      control files are parsed in a single GNU Make execution context where
      all variables are global.
      
        LOCAL_MODULE := hello-jni
      
      The LOCAL_MODULE variable must be defined to identify each module you
      describe in your Android.mk. The name must be *unique* and not contain
      any spaces. Note that the build system will automatically add proper
      prefix and suffix to the corresponding generated file. In other words,
      a shared library module named 'foo' will generate 'libfoo.so'.
      
      IMPORTANT NOTE:
      If you name your module 'libfoo', the build system will not
      add another 'lib' prefix and will generate libfoo.so as well.
      This is to support Android.mk files that originate from the
      Android platform sources, would you need to use these.
      
        LOCAL_SRC_FILES := hello-jni.c
      
      The LOCAL_SRC_FILES variables must contain a list of C and/or C++ source
      files that will be built and assembled into a module. Note that you should
      not list header and included files here, because the build system will
      compute dependencies automatically for you; just list the source files
      that will be passed directly to a compiler, and you should be good.
      
      Note that the default extension for C++ source files is '.cpp'. It is
      however possible to specify a different one by defining the variable
      LOCAL_DEFAULT_CPP_EXTENSION. Don't forget the initial dot (i.e. '.cxx'
      will work, but not 'cxx').
      
        include $(BUILD_SHARED_LIBRARY)
      
      The BUILD_SHARED_LIBRARY is a variable provided by the build system that
      points to a GNU Makefile script that is in charge of collecting all the
      information you defined in LOCAL_XXX variables since the latest
      'include $(CLEAR_VARS)' and determine what to build, and how to do it
      exactly. There is also BUILD_STATIC_LIBRARY to generate a static library.
      
      There are more complex examples under apps/, with commented
      Android.mk files that you can look at.
      
      Reference:
      ----------
      
      This is the list of variables you should either rely on or define in
      an Android.mk. You can define other variables for your own usage, but
      the NDK build system reserves the following variable names:
      
      - names that begin with LOCAL_  (e.g. LOCAL_MODULE)
      - names that begin with PRIVATE_, NDK_ or APP_  (used internally)
      - lower-case names (used internally, e.g. 'my-dir')
      
      If you need to define your own convenience variables in an Android.mk
      file, we recommend using the MY_ prefix, for a trivial example:
      
         ---------- cut here ------------------
          MY_SOURCES := foo.c
          ifneq ($(MY_CONFIG_BAR),)
            MY_SOURCES += bar.c
          endif
      
          LOCAL_SRC_FILES += $(MY_SOURCES)
         ---------- cut here ------------------
      
      So, here we go:
      
      NDK-provided variables:
      - - - - - - - - - - - -
      
      These GNU Make variables are defined by the build system before
      your Android.mk file is parsed. Note that under certain circumstances
      the NDK might parse your Android.mk several times, each with different
      definition for some of these variables.
      
      CLEAR_VARS
          Points to a build script that undefines nearly all LOCAL_XXX variables
          listed in the "Module-description" section below. You must include
          the script before starting a new module, e.g.:
      
            include $(CLEAR_VARS)
      
      BUILD_SHARED_LIBRARY
          Points to a build script that collects all the information about the
          module you provided in LOCAL_XXX variables and determines how to build
          a target shared library from the sources you listed. Note that you
          must have LOCAL_MODULE and LOCAL_SRC_FILES defined, at a minimum before
          including this file. Example usage:
      
            include $(BUILD_SHARED_LIBRARY)
      
          note that this will generate a file named lib$(LOCAL_MODULE).so
      
      BUILD_STATIC_LIBRARY
          A variant of BUILD_SHARED_LIBRARY that is used to build a target static
          library instead. Static libraries are not copied into your
          project/packages but can be used to build shared libraries (see
          LOCAL_STATIC_LIBRARIES and LOCAL_STATIC_WHOLE_LIBRARIES described below).
          Example usage:
      
            include $(BUILD_STATIC_LIBRARY)
      
          Note that this will generate a file named lib$(LOCAL_MODULE).a
      
      TARGET_ARCH
          Name of the target CPU architecture as it is specified by the
          full Android open-source build. This is 'arm' for any ARM-compatible
          build, independent of the CPU architecture revision.
      
      TARGET_PLATFORM
          Name of the target Android platform when this Android.mk is parsed.
          For now, only 'android-3' is supported, which corresponds to the
          Android 1.5 platform.
      
      TARGET_ARCH_ABI
          Name of the target CPU+ABI when this Android.mk is parsed.
          For now, only 'arm' is supported, which really means the following:
      
             ARMv5TE or higher CPU, with 'softfloat' floating point support
      
          Other target ABIs will be introduced in future releases of the NDK
          and will have a different name. Note that all ARM-based ABIs will
          have 'TARGET_ARCH' defined to 'arm', but may have different
          'TARGET_ARCH_ABI'
      
      TARGET_ABI
          The concatenation of target platform and abi, it really is defined
          as $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) and is useful when you want
          to test against a specific target system image for a real device.
      
          By default, this will be 'android-3-arm'
      
      NDK-provided function macros:
      - - - - - - - - - - - - - - -
      
      The following are GNU Make 'function' macros, and must be evaluated
      by using '$(call <function>)'. They return textual information.
      
      my-dir
          Returns the path of the current Android.mk's directory, relative
          to the top of the NDK build system. This is useful to define
          LOCAL_PATH at the start of your Android.mk as with:
      
              LOCAL_PATH := $(call my-dir)
      
      all-subdir-makefiles
          Returns a list of Android.mk located in all sub-directories of
          the current 'my-dir' path. For example, consider the following
          hierarchy:
      
              sources/foo/Android.mk
              sources/foo/lib1/Android.mk
              sources/foo/lib2/Android.mk
      
          If sources/foo/Android.mk contains the single line:
      
              include $(call all-subdir-makefiles)
      
          Then it will include automatically sources/foo/lib1/Android.mk and
          sources/foo/lib2/Android.mk
      
          This function can be used to provide deep-nested source directory
          hierarchies to the build system. Note that by default, the NDK
          will only look for files in sources/*/Android.mk
      
      this-makefile
          Returns the path of the current Makefile (i.e. where the function
          is called).
      
      parent-makefile
          Returns the path of the parent Makefile in the inclusion tree,
          i.e. the path of the Makefile that included the current one.
      
      grand-parent-makefile
          Guess what...
      
      Module-description variables:
      - - - - - - - - - - - - - - -
      
      The following variables are used to describe your module to the build
      system. You should define some of them between an 'include $(CLEAR_VARS)'
      and an 'include $(BUILD_XXXXX)'. As written previously, $(CLEAR_VARS) is
      a script that will undefine/clear all of these variables, unless explicitely
      noted in their description.
      
      LOCAL_PATH
          This variable is used to give the path of the current file.
          You MUST define it at the start of your Android.mk, which can
          be done with:
      
            LOCAL_PATH := $(call my-dir)
      
          This variable is *not* cleared by $(CLEAR_VARS) so only one
          definition per Android.mk is needed (in case you define several
          modules in a single file).
      
      LOCAL_MODULE
          This is the name of your module. It must be unique among all
          module names, and shall not contain any space. You MUST define
          it before including any $(BUILD_XXXX) script.
      
          The module name determines the name of generated files, e.g.
          lib<foo>.so for a shared library module named <foo>. However
          you should only refer to other modules with their 'normal'
          name (e.g. <foo>) in your NDK build files (either Android.mk
          or Application.mk)
      
      LOCAL_SRC_FILES
          This is a list of source files that will be built for your module.
          Only list the files that will be passed to a compiler, since the
          build system automatically computes dependencies for you.
      
          Note that source files names are all relative to LOCAL_PATH and
          you can use path components, e.g.:
      
            LOCAL_SRC_FILES := foo.c \
                               toto/bar.c
      
          NOTE: Always use Unix-style forward slashes (/) in build files.
                Windows-style back-slashes will not be handled properly.
      
      LOCAL_CPP_EXTENSION
          This is an optional variable that can be defined to indicate
          the file extension of C++ source files. The default is '.cpp'
          but you can change it. For example:
      
              LOCAL_CPP_EXTENSION := .cxx
      
      LOCAL_C_INCLUDES
          An optional list of paths, relative to the NDK *root* directory,
          which will be appended to the include search path when compiling
          all sources (C, C++ and Assembly). For example:
      
              LOCAL_C_INCLUDES := sources/foo
      
          Or even:
      
              LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
      
          These are placed before any corresponding inclusion flag in
          LOCAL_CFLAGS / LOCAL_CPPFLAGS
      
      LOCAL_CFLAGS
          An optional set of compiler flags that will be passed when building
          C *and* C++ source files.
      
          This can be useful to specify additionnal macro definitions or
          compile options.
      
          IMPORTANT: Try not to change the optimization/debugging level in
                     your Android.mk, this can be handled automatically for
                     you by specifying the appropriate information in
                     your Application.mk, and will let the NDK generate
                     useful data files used during debugging.
      
          NOTE: In android-ndk-1.5_r1, the corresponding flags only applied
                to C source files, not C++ ones. This has been corrected to
                match the full Android build system behaviour. (You can use
                LOCAL_CPPFLAGS to specify flags for C++ sources only now).
      
      LOCAL_CXXFLAGS
          An alias for LOCAL_CPPFLAGS. Note that use of this flag is obsolete
          as it may disappear in future releases of the NDK.
      
      LOCAL_CPPFLAGS
          An optional set of compiler flags that will be passed when building
          C++ source files *only*. They will appear after the LOCAL_CFLAGS
          on the compiler's command-line.
      
          NOTE: In android-ndk-1.5_r1, the corresponding flags applied to
                both C and C++ sources. This has been corrected to match the
                full Android build system. (You can use LOCAL_CFLAGS to specify
                flags for both C and C++ sources now).
      
      LOCAL_STATIC_LIBRARIES
          The list of static libraries modules (built with BUILD_STATIC_LIBRARY)
          that should be linked to this module. This only makes sense in
          shared library modules. 
      
      LOCAL_SHARED_LIBRARIES
          The list of shared libraries *modules* this module depends on at runtime.
          This is necessary at link time and to embed the corresponding information
          in the generated file.
      
          Note that this does not append the listed modules to the build graph,
          i.e. you should still add them to your application's required modules
          in your Application.mk
      
      LOCAL_LDLIBS
          The list of additional linker flags to be used when building your
          module. This is useful to pass the name of specific system libraries
          with the "-l" prefix. For example, the following will tell the linker
          to generate a module that links to /system/lib/libz.so at load time:
      
            LOCAL_LDLIBS := -lz
      
          See docs/STABLE-APIS.TXT for the list of exposed system libraries you
          can linked against with this NDK release.
      
      LOCAL_ALLOW_UNDEFINED_SYMBOLS
          By default, any undefined reference encountered when trying to build
          a shared library will result in an "undefined symbol" error. This is a
          great help to catch bugs in your source code.
      
          However, if for some reason you need to disable this check, set this
          variable to 'true'. Note that the corresponding shared library may fail
          to load at runtime.
      
      LOCAL_ARM_MODE
          By default, ARM target binaries will be generated in 'thumb' mode, where
          each instruction are 16-bit wide. You can define this variable to 'arm'
          if you want to force the generation of the module's object files in
          'arm' (32-bit instructions) mode. E.g.:
      
            LOCAL_ARM_MODE := arm
      
          Note that you can also instruct the build system to only build specific
          sources in arm mode by appending an '.arm' suffix to its source file
          name. For example, with:
      
             LOCAL_SRC_FILES := foo.c bar.c.arm
      
          Tells the build system to always compile 'bar.c' in arm mode, and to
          build foo.c according to the value of LOCAL_ARM_MODE.
      
          NOTE: Setting APP_OPTIM to 'debug' in your Application.mk will also force
                the generation of ARM binaries as well. This is due to bugs in the
                toolchain debugger that don't deal too well with thumb code.

      [Android] LOCAL_LDFLAGS in Android.mk

      可以用LOCAL_LDFLAGS讀入static library

      LOCAL_LDFLAGS += \
      libABC.a \
      libDEF.a