Android/Porting2011. 5. 25. 14:28

MP3 encoder가 필요해서 작업중이엇는데 누가 아주 잘 설명을 해두었네요.
필요하신 분들을 step by step으로 따라하심 됩니다.

http://blog.libertadtech.com/2011/02/porting-lame-encoder-to-android-arm.html
 

porting compiling lame encoder to Android ARM arch using Android NDK

I was looking for a mp3 encoding application in Android Market, and found very few, the reason I think Android doesn't support mp3 encoding is because mp3 is patented technology. Another reason is I guess people prefer Java programming and Android SDK rather than Android native development kit.

Nevertheless compiling libmp3lame library for Android using Android NDK is very easy actually.
1. download Android NDK(also you need Android SDK and Eclipse with ADT plugin) and create simple project.
2. create directory called "jni" in your project's directory.
3. download lame sources, extract, copy all sources from directory libmp3lame to jni directory. Also copy lame.h which is located in include directory of lame sources.
4. create jni/Android.mk file. it should look like this:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := mp3lame
LOCAL_SRC_FILES := bitstream.c fft.c id3tag.c mpglib_interface.c presets.c  quantize.c   reservoir.c tables.c  util.c  VbrTag.c encoder.c  gain_analysis.c lame.c  newmdct.c   psymodel.c quantize_pvt.c set_get.c  takehiro.c vbrquantize.c version.c
include $(BUILD_SHARED_LIBRARY)
5. clean lame sources, remove what's left from GNU autotools, Makefile.am Makefile.in libmp3lame_vc8.vcproj logoe.ico depcomp, folders i386 vector.
6. edit file jni/utils.h, and replace definition extern ieee754_float32_t fast_log2(ieee754_float32_t x);
with this extern float fast_log2(float x);
7. go to the root directory of your Android project and run $pathtoandroidndk/ndk-build and you're done, you'll have limp3lame.so compiled. 
Posted by 삼스
Android/App개발2011. 5. 8. 18:03

MIME-Type Description File Extension
application/acad AutoCAD drawing files dwg
application/clariscad ClarisCAD files ccad
application/dxf DXF (AutoCAD) dxf
application/msaccess Microsoft Access file mdb
application/msword Microsoft Word file doc
application/octet-stream Uninterpreted binary bin
application/pdf PDF (Adobe Acrobat) pdf
application/postscript Postscript, encapsulated Postscript, ai, ps, eps
Adobe Illustrator
application/rtf Rich Text Format file rtf rtf
application/vnd.ms-excel Microsoft Excel file xls
application/vnd.ms-powerpoint Microsoft PowerPoint file ppt
application/x-cdf Channel Definition Format file cdf
application/x-csh C-shell script csh csh
application/x-dvi TeX dvi dvi dvi
application/x-javascript Javascript source file js
application/x-latex LaTeX source file latex
application/x-mif FrameMaker MIF format mif
application/x-msexcel Microsoft Excel file xls
application/x-mspowerpoint Microsoft PowerPoint file ppt
application/x-tcl TCL script tcl
application/x-tex TeX source file tex
application/x-texinfo Texinfo (emacs) texinfo, texi
application/x-troff troff file t, tr, roff t, tr, roff
application/x-troff-man troff with MAN macros man
application/x-troff-me troff with ME macros me
application/x-troff-ms troff with MS macros ms
application/x-wais-source WAIS source file src
application/zip ZIP archive zip
audio/basic Basic audio (usually m-law) au, snd
audio/x-aiff AIFF audio aif, aiff, aifc
audio/x-wav Windows WAVE audio wav
image/gif GIF image gif
image/ief Image Exchange Format file ief
image/jpeg JPEG image jpeg, jpg jpe
image/tiff TIFF image tiff, tif
image/x-cmu-raster CMU Raster image ras
image/x-portable-anymap PBM Anymap image format pnm
image/x-portable-bitmap PBM Bitmap image format pbm
image/x-portable-graymap PBM Graymap image format pgm
image/x-portable-pixmap PBM Pixmap image format ppm
image/x-rgb RGB image format rgb
image/x-xbitmap X Bitmap image xbm
image/x-xpixmap X Pixmap image xpm
image/x-xwindowdump X Windows Dump (xwd) xwd
multipart/x-gzip GNU ZIP archive gzip
multipart/x-zip PKZIP archive zip
text/css Cascading style sheet css
text/html HTML file html, htm
text/plain Plain text txt
text/richtext MIME Rich Text rtx
text/tab-separated- values Text with tab-separated values tsv
text/xml XML document xml
text/x-setext Struct-Enhanced text etx
text/xsl XSL style sheet xsl
video/mpeg MPEG video mpeg, mpg, mpe
video/quicktime QuickTime video qt, mov
video/x-msvideo Microsoft Windows video avi
video/x-sgi-movie SGI movie player format movie


MIME 확장명

파일 확장명 

 application/x-silverlight-app  .xap
 application/manifest  .manifest 
 application/x-ms-application  .application 
 application/x-ms-xbap  .xbap
 application/octet-stream  .deploy
 application/vnd.ms-xpsdocument  .xps 
 application/xaml+xml  .xaml
 application/vnd.ms-cab-compressed  .cab
 application/vnd.openxmlformats-officedocument.wordprocessingml.document  .docx
 application/vnd.openxmlformats-officedocument.wordprocessingml.document  .docm
 application/vnd.openxmlformats-officedocument.presentationml.presentation  .pptx
 application/vnd.openxmlformats-officedocument.presentationml.presentation  .pptm
 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  .xlsx
 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  .xlsm
 application/msaccess  .accdb
 application/x-mspublisher  .pub
 image/svg+xml  .svg
 application/xhtml+xml  .xht
 application/xhtml+xml  .xhtml

Posted by 삼스
Android2011. 4. 22. 12:21

개요
안드로이드 애플리케이션은 빌드가 되면 apk파일로 압축된 바이너리파일로 만들어진다.
apk는 Dalvic byte code로 변환된 자바클래스파일인 dex file들, 바이너리버전의 AndroidManifest.xml, 컴파일된 리소스파일들(resources.arsc)와 컴파일되지 않는 리소스파일들로 구성된다.
 
이클립스에서 개발한다면 ADT 플러그인이 자동으로 관리한다.
이클립스가 아닌 개발환경에서는 프로젝트 디렉토리상의 build.xml을 이용하여 Ant로 빌드할 수 있다.

에뮬레이터나 디바이스에서 동작시키려면 애플리케이션을 반드시 signing해야 한다. 이클립스와 앤트를 이용하여 이 과정도 쉽게 할 수 있다.

다음 그림은 빌드와 실행까지의 과정을 보여준다.
 
빌드프로세스의 상세

빌드프로세스에는 많은 툴들과 프로세스들이 apk파일을 만들기 위해 임시파일들을 생성하게 된다. 이클립스를 사용중이라면 모든 빌드프로세스가 코드를 저장하는 순간 이 과정이 자동으로 이루어진다. 다른 IDE를 사용한다면 이 과정들이 ANT build script가 수행되는 순간 이루어진다. 




일반적인 빌드 프로세스는 아래의 순서로 이루어진다.

1. Android Asset Packaging Tool(aapt)가 애플리케이션의 리소스파일들(AndroidManifest.xml, other XML files)들을 수집하여 컴파일하여 R.java파일을 만들어낸다. 이 파일은 자바코드로 추가되어 컴파일하는데 레퍼런스로 사용된다.
2. aidl tool은 .aidl파일들을 찾아서 모두 java파일로 변환 생성한다.
3. 모든 자바코드, R.java, .aidl파일들이 자바컴파일러에 의해 컴파일되어 .class파일들을 만들어낸다.
4. dex tool이 class파일들을  .dex파일로 변환한다. 3rd party library와 프로젝트에 포함된 모든 .class파일들도 함께 .dex로 변환된다.
5. 모든 컴파일되지 않는 리소스들(이미지등..), 컴파일된 리소스들 그리고 .dex 파일들이 apkbuilder tool에 의해 .apk파일로 패키징된다.
6. .apk파일이 한번 빌드되면, 디버그나 릴리즈 키스토어로 반드시 사인되어야 한다. 그래야 디바이스에 설치가 된다.
7. 최종적으로 릴리즈모드로 사인되었다면 zipalign으로 align을 해야 한다. aligning은 애플리케이션이 디바이스에서 동작할 때
메모리 사용량을 최소한으로 줄여준다.

Posted by 삼스
Android/App개발2011. 3. 31. 18:55

JNI function을 테스트하기 위해 ndk-gdb를 사용하려고 하는데 에뮬레이터가 아닌 상용단말에서 안되는 경우가 있다.
내 경우 HTC Desire에서 동작하지 않았다.

이유를 찾아보니 shell 명령중에 run-as가 정상동작하지 않도록 해놓았단다.

이런 젝일...
갤럭시S도 그렇다는데 되는 디바이스가 있을지 모르겠다.. 
넥서스시리즈는 될까???

혹시 이글 읽고 다른 디바이스에서 되는 분 있으면 댓글 좀...

원문 출처: http://groups.google.com/group/android-ndk/tree/browse_frm/month/2011-03/1ce4f2052e3378db?rnum=41&_done=%2Fgroup%2Fandroid-ndk%2Fbrowse_frm%2Fmonth%2F2011-03%3F

It's a known Samsung-specific issue: native debugging doesn't work because 
they made platform customizations without updating the run-as source 
appropriately. The problem is that "run-as" is looking for for 
/data/system/packages.list, which doesn't exist on the Samsung builds, 
because they use /dbdata instead of /data 

One solution is to root your system, then create a symlink from 
/data/system/ to /dbdata/system/. There is a previous post on the 
android-ndk forum about this. 

The same issue happens on Galaxy S builds, btw. 

 
Posted by 삼스
Android/App개발2011. 2. 22. 21:42


open_src/system/core/adb가 윈도우용으로 빌드될 때 아래의 소스들이 컴파일된다.
 usb_windows.c
 get_my_path_windows.c
 adb.c 
 console.c 
 transport.c 
 transport_local.c 
 transport_usb.c 
 commandline.c 
 adb_client.c 
 sockets.c 
 services.c 
 file_sync_client.c 
 shlist.c 
 utils.c 
 usb_vendors.c

아래 위치의 헤더파일들이 참조된다.
development/host/windows/usb/api/

프로그램의 시작지점은 아래와 같다.

int main(int argc, char **argv)
{
    adb_trace_init();
#if ADB_HOST
    adb_sysdeps_init();
    return adb_commandline(argc - 1, argv + 1);
#else
    if((argc > 1) && (!strcmp(argv[1],"recovery"))) {
        adb_device_banner = "recovery";
        recovery_mode = 1;
    }

    start_device_log();
    return adb_main(0);
#endif
}

commandline.c의 아래 함수에 커맨드라인 명령어의 처리 코드를 찾아볼 수 있다.

int adb_commandline(int argc, char **argv)
{
...
}

Posted by 삼스
Android/App개발2011. 2. 22. 21:15


adb윈도우용은 AdbWinApi.dll과 AdbWinUsbApi.dll과 함께 연동된다.
주요 API는 AdbWinApi.dll에 정의되어 있으며 AdbWinUsbApi.dll은 실제 Usb device와 연동부분을 책임진다.

오픈소스상의 아래 위치에 소스가 위치한다.

open_src/system/core/adb -> adb server, adb demon, adb client based on command-line의 소스가 OS별(linux, window, OSX)로 구현되어 있다.
open_src/developments/hosts/windows/usb -> 윈도우용 AdbWinApi.dll과 AdbWinUsbApi.dll의 소스와 드라이버등이 있다.

developments/hosts/windows/usb폴더구조는 다음과 같다.
 adb_winapi_test : test app
 api                   : AdbWinApi의 소스, adb.exe가 직접적으로 사용한다.
 legacy              : 드라이버
 winusb             : AdbWinUsbApi의 소스, Usb 연동부분에 대한 소스로 AdbWinApi가 로드하여 사용한다.

adb와 유사한 클라이언트 앱을 만들고자 한다면 AdbWinApi.dll이 노출하는 API들에 대한 스펙을 숙지하는것이 중요하다.
아래에 몇가지 API들을 소개한다.

adb_api.h
ADBWIN_API ADBAPIHANDLE __cdecl AdbEnumInterfaces(GUID class_id,
                                          bool exclude_not_present,
                                          bool exclude_removed,
                                          bool active_only);

ADBWIN_API bool __cdecl AdbNextInterface(ADBAPIHANDLE adb_handle,
                                 AdbInterfaceInfo* info,
                                 unsigned long* size);

ADBWIN_API bool __cdecl AdbResetInterfaceEnum(ADBAPIHANDLE adb_handle);

ADBWIN_API ADBAPIHANDLE __cdecl AdbCreateInterfaceByName(const wchar_t* interface_name);

ADBWIN_API ADBAPIHANDLE __cdecl AdbCreateInterface(GUID class_id,
                                           unsigned short vendor_id,
                                           unsigned short product_id,
                                           unsigned char interface_id);

ADBWIN_API bool __cdecl AdbGetInterfaceName(ADBAPIHANDLE adb_interface,
                                    void* buffer,
                                    unsigned long* buffer_char_size,
                                    bool ansi);

ADBWIN_API bool __cdecl AdbGetSerialNumber(ADBAPIHANDLE adb_interface,
                                   void* buffer,
                                   unsigned long* buffer_char_size,
                                   bool ansi);

ADBWIN_API bool __cdecl AdbGetUsbDeviceDescriptor(ADBAPIHANDLE adb_interface,
                                          USB_DEVICE_DESCRIPTOR* desc);

ADBWIN_API bool __cdecl AdbGetUsbConfigurationDescriptor(
                    ADBAPIHANDLE adb_interface,
                    USB_CONFIGURATION_DESCRIPTOR* desc);

ADBWIN_API bool __cdecl AdbGetUsbInterfaceDescriptor(ADBAPIHANDLE adb_interface,
                                             USB_INTERFACE_DESCRIPTOR* desc);

ADBWIN_API bool __cdecl AdbGetEndpointInformation(ADBAPIHANDLE adb_interface,
                                          unsigned char endpoint_index,
                                          AdbEndpointInformation* info);

ADBWIN_API bool __cdecl AdbGetDefaultBulkReadEndpointInformation(
                    ADBAPIHANDLE adb_interface,
                    AdbEndpointInformation* info);

ADBWIN_API bool __cdecl AdbGetDefaultBulkWriteEndpointInformation(
                    ADBAPIHANDLE adb_interface,
                    AdbEndpointInformation* info);

ADBWIN_API ADBAPIHANDLE __cdecl AdbOpenEndpoint(ADBAPIHANDLE adb_interface,
                                        unsigned char endpoint_index,
                                        AdbOpenAccessType access_type,
                                        AdbOpenSharingMode sharing_mode);

ADBWIN_API ADBAPIHANDLE __cdecl AdbOpenDefaultBulkReadEndpoint(
                            ADBAPIHANDLE adb_interface,
                            AdbOpenAccessType access_type,
                            AdbOpenSharingMode sharing_mode);

ADBWIN_API ADBAPIHANDLE __cdecl AdbOpenDefaultBulkWriteEndpoint(
                            ADBAPIHANDLE adb_interface,
                            AdbOpenAccessType access_type,
                            AdbOpenSharingMode sharing_mode);

ADBWIN_API ADBAPIHANDLE __cdecl AdbGetEndpointInterface(ADBAPIHANDLE adb_endpoint);

ADBWIN_API bool __cdecl AdbQueryInformationEndpoint(ADBAPIHANDLE adb_endpoint,
                                            AdbEndpointInformation* info);

ADBWIN_API ADBAPIHANDLE __cdecl AdbReadEndpointAsync(ADBAPIHANDLE adb_endpoint,
                                             void* buffer,
                                             unsigned long bytes_to_read,
                                             unsigned long* bytes_read,
                                             unsigned long time_out,
                                             HANDLE event_handle);

ADBWIN_API ADBAPIHANDLE __cdecl AdbWriteEndpointAsync(ADBAPIHANDLE adb_endpoint,
                                              void* buffer,
                                              unsigned long bytes_to_write,
                                              unsigned long* bytes_written,
                                              unsigned long time_out,
                                              HANDLE event_handle);

ADBWIN_API bool __cdecl AdbReadEndpointSync(ADBAPIHANDLE adb_endpoint,
                                    void* buffer,
                                    unsigned long bytes_to_read,
                                    unsigned long* bytes_read,
                                    unsigned long time_out);

ADBWIN_API bool __cdecl AdbWriteEndpointSync(ADBAPIHANDLE adb_endpoint,
                                     void* buffer,
                                     unsigned long bytes_to_write,
                                     unsigned long* bytes_written,
                                     unsigned long time_out);

ADBWIN_API bool __cdecl AdbGetOvelappedIoResult(ADBAPIHANDLE adb_io_completion,
                                        LPOVERLAPPED overlapped,
                                        unsigned long* bytes_transferred,
                                        bool wait);

ADBWIN_API bool __cdecl AdbHasOvelappedIoComplated(ADBAPIHANDLE adb_io_completion);


ADBWIN_API bool __cdecl AdbCloseHandle(ADBAPIHANDLE adb_handle);

Posted by 삼스
Android/App개발2010. 12. 9. 19:04


간혹 암호화가 필요할 때가 있다. 이 경우 사용가능한 대칭키 암호화에 사용되는 자바 유틸이다.

javax패키지를 사용하며 안드로이드에서 그대로 사용이 가능하다.

Base64는 안드로이드 오픈소스에서 가져다가 사용하였다.


import java.io.UnsupportedEncodingException;


import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.SecretKey;


public class CryptoUtil {

Cipher ecipher;

    Cipher dcipher;


    public CryptoUtil(SecretKey key, String algorithm) {

        try {

            ecipher = Cipher.getInstance(algorithm);

            dcipher = Cipher.getInstance(algorithm);

            ecipher.init(Cipher.ENCRYPT_MODE, key);

            dcipher.init(Cipher.DECRYPT_MODE, key);


        } catch (javax.crypto.NoSuchPaddingException e) {

        } catch (java.security.NoSuchAlgorithmException e) {

        } catch (java.security.InvalidKeyException e) {

        }

    }


public String encrypt(String str) {

try {

// Encode the string into bytes using utf-8

byte[] utf8 = str.getBytes("UTF8");

// Encrypt

byte[] enc = ecipher.doFinal(utf8);

// Encode bytes to base64 to get a string

return Base64.encodeToString(enc, Base64.URL_SAFE|Base64.NO_WRAP);

//return String.valueOf(enc);

} catch (javax.crypto.BadPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (java.io.IOException e) {

e.printStackTrace();

}

return null;

}


public String decrypt(String str) {

try {

    // Decode base64 to get bytes

byte[] dec = Base64.decode(str, Base64.URL_SAFE|Base64.NO_WRAP);

// Decrypt

byte[] utf8 = dcipher.doFinal(dec);

// Decode using utf-8

return new String(utf8, "UTF8");

} catch (javax.crypto.BadPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (java.io.IOException e) {

e.printStackTrace();

}

return null;

}

    public static void main(String[] args) throws Exception {

        // Generate a temporary key. In practice, you would save this key.

        SecretKey key = KeyGenerator.getInstance("DES").generateKey();

        

        // Create encrypter/decrypter class

        CryptoUtil c = new CryptoUtil(key, "DES");

        

        // Encrypt

        String encrypted = c.encrypt("안녕하세요 이요삼입니다...");

        System.out.println(encrypted);

       

        // Decrypt

        String decrypted = c.decrypt(encrypted);

        System.out.println(decrypted);       

    }


}

Posted by 삼스
Android2010. 12. 2. 15:59
Faster and native event dispatching and processing
    Native event dispatching pipeline.
    Faster event dispatching using shared memory.
    WindowManager optimizations to take advantage of native event paths

Dalvik VM and Core library improvements
    Concurrent Garbage Collector (target sub-3msec pauses)
    Additional JIT code generation optimizations
    Improved code verification
    SSL and general networking overhaul
    Expanded I18N support (full worldwide encodings, more locales)
Audio and Graphics improvements
OpenSL ES implementation (audio API)
Low latency audio rendering
OpenAL support
Graphics stack refactoring
GPU resource management improvements
RTSP, webm, VP8 support in StageFright
Authoring support for StageFright
SIP stack
  Basic SIP stack as an optional platform add-on (build time config)
Linux : 2.6.35 Linux kernel
Bluetooth : BlueZ 4.69

* StageFright는 OpenCore의 대체입니다. OpenCore가 OHA에 기여하면서 실제 단말사들에게 지나치게 많은 라이선스를 요구하면서 구글하고 사이가 안좋아졌다고 하네요. 그래서 다른 멀티미디어프레임워크를 올린것입니다. 이것도 OpenMax IL을 이용한 프레임웍입니다.
** SIP stack이 들어간것에 대해서 말이 많죠. 기존의 SIP stack사업을 하던 업체들에겐 청천벽력일거구요. 어쨌든 구글이 나중에는 음성통화부분까지 잡아먹을것 같다는 ... 그 기반을 조성하고 있다는 느낌을 지울수 없습니다. 구글토크가 지금은 많이 이용되고 있진 않지만 구글 토크의 기술은 안드로이드의 근간으로 자리잡고 있거든요.
*** 터치입력같은 입력장치의 처리 프로세스를 개선하고 VM을 더 개선하여 속도를 더 향상시키고 그 외 Audio기술이나 멀티미디어, SIP등에 대한 개선된 내용들이 GingerBread에서 우리가 느낄수 있는 변화라고 생각됩니다. 에초에 루머로 돌았던  UI의 개선과 홈스크린의 획기적이 변경등은 없다고 하는군요.

Posted by 삼스
Android/App개발2010. 11. 29. 17:49

Package의 Add와 Remove시를 알고 싶다면 아래와 같이 한다.

1. Manifest에 receiver등록

<receiver android:name=".IntentReceiver">

<intent-filter>

<action android:name="android.intent.action.PACKAGE_ADDED" />

<action android:name="android.intent.action.PACKAGE_REMOVED" />

<data android:scheme="package" />

</intent-filter>

</receiver>


2. Receiver class구현


public class IntentReceiver extends BroadcastReceiver {


@Override

public void onReceive(Context context, Intent intent) {

Log.d("_PACKAGE_OBSERVER_", "intent : ");

Log.d("_PACKAGE_OBSERVER_", "  action = " + intent.getAction());

Log.d("_PACKAGE_OBSERVER_", "  data = " + intent.getData());

}


}


위와 같이 하면 data에 package명을 확인하여 어떤 패키지가 추가되거나 삭제되었는지 알 수 있다.




Posted by 삼스
기타/BONDI2010. 11. 2. 17:04



BONDI Feature Access


Features의 인식과 구성에 관한것과 웹애플리케이션에서 그 정보에 어떻게 억세스하는지에 대한 요구사항에 대해 설명한다.


요구사항 요약과 원리

BONDI Web app의 의존성은 하나 이상의 features의 구성에 의해 결정된다.

하나의 Feature는 웹런타임에서 제공하는 연관된 기능에 대응된다. 이는 자바스크립트 인터페이스와 웹런타임의 동작에 대한 집합으로 정의된다.

하나의 feature는 유일한 IRI로 구분되며 BONDI web app에 의해서 의존성을 표현하는 하나의 유닛이다.

BONDI는 하나의 feature를 정의하거나 몇개의 feature를 정의하기도 한다. 각각은 인터페이스를 정의한다. BONDI framework에서 JavaScript API를 확장하고 싶다면 대응되는 feature를 반드시 정의해야 한다. JavaScript API와 feature를 추가하였다면 feature-set도 또한 정의해야 한다. IRI로 구분이 되며 feature들의 집합이다. 


framework과 연관된 요구사항들은 아래의 원칙들로 규합된다.

1. Feature 추가 : JavaScript API의 집합은 고정되어 있지 않다. 그리고 나중에 확장되기를 기대하고 있다. 

2. Feature 혁신 : 각 JavaScript API들은 스스로 시간이 지남에 따라 진화한다. 새로운 디바이스의 능력을 반영하기도 하고 새로운 유스케이스 또는 에러 수정, 이전 버전의 JavaScript의 결점을 보완하는것등을 통해서 진화한다. 

3. feature 정의의 분산 : feature의 정의는 어느 집단에 의해 제한되지 않는다. 누구나 정의가능하다(다만 다른디바이스와 호환은 포기).  feature의 정의는 단말생산자, 네트워운영자, 특별히 관심있는자, 각 서비스제공자나 퍼블리셔들에 의해 정의가능하다. 

프레임웍은 또한 동적으로 feature를 제공하기 위한 방안을 고려하여 설계 되었다.

4. 동적 feature 제공 : 확장메커니즘을 통해서 필드에 존재하는 디바이스에 새로운 feature를 추가할 수 있는 기능. 이 기능은 일반적으로 디바이스 플래싱을 다시하는 방법이 아니다. 확장메커니즘은 OS에서 제공가능한 방법이 되며 ActiveX나 브라우져의 플러그인등이 그방법이 될수 있다. 하지만 이 메커니즘은 반드시 제공되어야 하는 것은 아니며 feature 제공을 위해 표준화가 완전히 이루어진것도 아니다.

이런 원리가 의미하는것은 아래에 설명된다.

5. Feature들(interface와 구현을 포함하는)는 IRI로 구분이 가능하다.

6. 모든 Web App(website or widget)은 feature를 사용하기 위해 반드시 feature를 정의해야 한다.  이 정보는 Widget Recource의 Widget Configuration Document에 선언되어 있거나 또는 BONDI-defined API를 이용하여 프로그램으로 선언한수도 있다.

이 선언은 다음을 허용한다.

  - 웹런타임이 그 feature를 제공하는지 확인한다.

  - feature의 동적 제공을 허용한다.

  - 웹어플리케이션이 그 feature를 사용할 수 있는지 확인하는 억세스컨트롤을 허용한다.

  - 웹런타임이 어떤 feature를 로드하고 바인드해야 하는지 결정하는데 필요.

  - Widget User Agent가 위젯을 설치하기 전에 웹런타임에서 동작가능한 위젯인지 결정하는데 필요.


BONDI는 자체적으로 두종류의 feature를 정의한다.

1. BONDI JavaScript APIs : 이 feature는  BONDI-defined API와 직접적으로 연관된다. http://bondi.omtp.org/api/로부터 정의되어진다.

2. BONDI processing assertions : metadata와 assertions그리고 웹어플리케이션을 처리하기 위해 관련된 다른 directive들로 구성된다. http://bondi.omtp.org/meta/로부터 정의되어 진다.


위젯을 위해서 BONDI는 Widget Configuration Document에서 <feature> 태그로 위젯의 feature의존성을 기술할 수 있다.


의존성의 표현

BONDI는 다음 4가지를 정의한다.

1. Device Capability

2. JavaScript API

3. Feature

4. Feature Set


WebApplicaiton은 feature 의존성을 반드시 명시적으로 기술해야 한다. 웹런타임은 해당 feature가 명시적으로 요구되지 않은 상태에서는 유효한 feature가 없고 Security Policy에 의해 허용되면 접근가능지는 것을 보장해야 한다.

활성화된 접근성은 허용된 Web Application에 대해서만 유효하다.


요구사항

AS-0351 : 웹런타임은 반드시 명시적으로 연관된 feature를 기술하고 그 권한을 획득한 경우에만 JavaScript API를 사용할수 있게 해주어야 한다.

AS-0552 : 이미 유효한 feature가 있는지 결정할 수 있어야 함.


의존성의 정적 선언

Widget Configuration Document에 <widget> tag의 <feature> tag에 name과 required 속성으로 기술한다.

ex)

<widget xmlns="http://www.w3.org/ns/widgets" version="5602:5719M"id="http://tests.bondi.omtp.org/widgets/appconfig.wgt" width="640" height="480">

<name>BONDI appconfig compliance</name>

<author email="hendry@aplix.co.jp">Kai Hendry</author>

<feature name="http://bondi.omtp.org/api/bondi.requestfeature" />

</widget>

존성의 프로그래밍 표현

BONDI-defined APIrequestFeature를 통해서 표현 가능하다.

PendingOperation requestFeature(

      in RequestFeatureSuccessCallback successCallback,

      in ErrorCallback   errorCallback,

      in DOMString       name);


이 함수는 명명된 feature를 비동기로 요청을 하며 리턴값으로 pending operation object를 받는다. 성공하면 successCallback이 호출되며 실패하면 errorCallback에 DeviceAPIError가 발생한다. 


요청된 feature와 연관된 JavaScript API가 존재하면 모든 API들의 global property들이 successCallback이 호출되기 전에 접근가능해진다. 보통 해당 API set의 root object를 생성하며 생성이 성공하면 successCallback에 인자로 넘겨진다. 

Posted by 삼스