레이블이 Android-JDK인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android-JDK인 게시물을 표시합니다. 모든 게시물 표시

8/26/2018

JAVA와 JDK 관련지식

1. Java 

Java는 썬 마이크로 시스템즈가 개발한 객체지향 언어이며, 현재 썬 마이크로 시스템즈 오라클에 인수되어져 있다.

Java의 장점은 Source 코드를 중간코드(Java Bytecode)로 변환하여 JVM(Java Virtual Machine)에서 실행할수 있어 높은 호환성을 가지고 있다.
물론 다른 언어처럼 완전 Compiler 기능을 가지고 있지만 이를 이용시 JVM은 이용을 못한다.

  • Java의 Platform 분류 
  1. Java SE(Standard Edition) 
  2. Java EE(Enterprise Edition)
  3. Java ME(Micro Edition)
  4. 이외 

나의 관심은 Java SE으로만으로도 충분한 것 같어 더 자세한 내용은 JDK 에서 찾자.
아래의 Wiki에서 구글과 오라클 소송에 관한 이야기도 흥미로운것 같다.

  https://namu.wiki/w/Java
  https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)

1.1 Java Development Kit 의 구성 

JDK를 설치하면 아래의 사항들이 전부 설치가 되며, 각 구성의 용어를 알아보자.
  1. JDK(Java Development Kit) : 자바의 개발 도구 이며, JRE 와 JVM을 포함하고 있다. 
  2. JRE(Java Runtime Environment) : 자바의 실행환경이며, JVM과 관련 Library를 포함하고 있다고 한다. 
  3. JVM(Java Virtual Machine) :  Java Bytecode (*.class, *.jar)를 실행시간에 동작하는 interpreter 기능

아래의 정보에서 잘 설명해주고 있다.
  1. JDK = JRE + Development/debugging tools
  2. JRE = JVM + Java Packages Classes(like util, math, lang, awt,swing etc)+runtime libraries.
  3. JVM = Class loader system + runtime data area + Execution Engine.



출처
  https://www.quora.com/What-is-JDK

  • JDK SE 5.0 JDK 구조 




  • JAVA SE JDK 구조 

출처
  http://javacodedepot.com/java/java-jre-vs-jdk
  http://www.cs.mun.ca/java-api-1.5/
  https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre



상위의 Tools 정보를 보면 아래와 같이 볼수 있다.
  • Java의 개발 Tools 
  1. appletviewer: Run and debug applets without a web browser.
  2. extcheck: Utility to detect Jar conflicts.
  3. jar: Create and manage Java Archive (JAR) files.
  4. java: The launcher for Java applications.
  5. javac: The compiler for the Java programming language.
  6. javadoc: API documentation generator.
  7. javah: C header and stub generator. Used to write native methods.
  8. javap: Class file disassembler
  9. jdb: The Java Debugger.

JDK 1.7.0의 구조
  https://programmingmitra.blogspot.com/2016/05/jdk-and-jre-file-structure.html
  http://www.tech-faq.com/jdk.html

  • 일반적인 JAVA 사용법  
  1. 개발툴 java : *.java -> *.class (Java byte code)
  2. 개발툴 jar   :  *.class -> *.jar (생성)
  3. JVM에서  *.class/*.jar  실행 

Bytecode
  https://en.wikipedia.org/wiki/Bytecode

JAR(Java ARchive)
  https://en.wikipedia.org/wiki/JAR_(file_format)

  • Oracle JDK vs Open JDK
이전에는 Sun JDK이었으나, Oracle이 Sun을 인수 했기에  Oracle 과 Open JDK로 구분되어지겠다.

Oracle JDK
  https://www.oracle.com/technetwork/java/javase/downloads/index.html

Open JDK
  https://openjdk.java.net/projects/jdk/11/
  https://openjdk.java.net/projects/jdk7/
  http://openjdk.java.net/projects/jdk6/



1.2 Ubuntu 에서 JDK 의 Version 별 관리 

Ubuntu에서 아래와 같이 여러 Version JDK를 설치 후 각 Tool을 Version별로 설정하여 사용이 가능하다. 


$ sudo apt-get install openjdk-6-jdk 
$ sudo apt-get install openjdk-7-jdk

$ sudo update-alternatives --list java   // 설치확인 

$ sudo update-alternatives --config java   // Android Version에 따라 변경 
대체 항목 java에 대해 (/usr/bin/java 제공) 2개 선택이 있습니다.

  선택       경로                                          우선순ꡬ태
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      자동 모드
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      수동 모드
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      수동 모드

$ sudo update-alternatives --config javac   // Android Version에 따라 변경 
대체 항목 javac에 대해 (/usr/bin/javac 제공) 2개 선택이 있습니다.

  선택       경로                                       우선순ꡬ태
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-amd64/bin/javac   1071      자동 모드
  1            /usr/lib/jvm/java-6-openjdk-amd64/bin/javac   1061      수동 모드
  2            /usr/lib/jvm/java-7-openjdk-amd64/bin/javac   1071      수동 모드

$ sudo update-alternatives --config jar  // Android Version에 따라 변경 
대체 항목 jar에 대해 (/usr/bin/jar 제공) 3개 선택이 있습니다.

  선택       경로                                     우선순ꡬ태
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-amd64/bin/jar   1071      자동 모드
  1            /usr/bin/fastjar                            100       수동 모드
  2            /usr/lib/jvm/java-6-openjdk-amd64/bin/jar   1061      수동 모드
  3            /usr/lib/jvm/java-7-openjdk-amd64/bin/jar   1071      수동 모드

$ sudo update-alternatives --config javah    // Android Version에 따라 변경 
대체 항목 javah에 대해 (/usr/bin/javah 제공) 2개 선택이 있습니다.

  선택       경로                                       우선순ꡬ태
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-openjdk-amd64/bin/javah   1071      자동 모드
* 1            /usr/lib/jvm/java-6-openjdk-amd64/bin/javah   1061      수동 모드
  2            /usr/lib/jvm/java-7-openjdk-amd64/bin/javah   1071      수동 모드



2. Android의 Java 와 VM(Virtual Machine) 

Google에서는 라이센스 문제로 JVM을 사용하지 못하고 대신에 DVM(Dalvik Virtual Machine)을 사용한다. 흔히 Dalvik이라고 말한다.
하지만 Android의 Virtual Machine 인 Dalvik은 Android 5.0 "Lollipop" 부터 DVM 대신  ART(Android_Runtime)만 사용하고 있다고 한다.

ART(Android_Runtime)는 Dalvik 이후로 나온 Android의 Virtual Machine이며, 실행시간에 dex file을 실행할수있으나, Dalvik 에서 동작하는 일부 기술은 ART에서 동작이 되지 않는 다고 한다.


  • DEX(Dalvik Executable)
Android에서는 독자적인 Virtual Machine을 가지고 있어서 Java의 기존 *.class(bytecode) 사용할수 없기 때문에 독자적인 파일 포맷을 가지고 있다.
  1. .dex  ( Dalvik EXecutable ) 
  2. .odex ( Optimized Dalvik EXecutable ) 

Dalvik 관련자료

ART and Dalvik


  • Android JAVA 사용법 
  1. 개발툴 java : *.java -> *.class (Java byte code)
  2. 개발툴 jar   :  *.class -> *.jar (생성)
  3. dx             :  *.jar/*.class -> *.dex
  4. VM            : *.class/*.jar  실행 
Android에서 JAVA 사용법은 dx라는 tool을 이용하여 한단계가 더 걸치고 dx tool은 Java의 *.class file을 *.dex file로 변환을 한다고 한다. (상위 wiki 설명)


1.1 File CLASS 와 File DEX

안드로이드에서 dx를 통하여 File format *.class를  *.dex로 변경된 후 간단히 비교해보자. 참고로 File format Class와 OOP의 Class를 혼동하지 말자.



세부내역은 아래의 사이트에서 확인

CLASS 와 DEX 구조
  https://xsolve.software/blog/differences-between-class-and-dex-files-in-java-android/

CLASS (Java bytecode)의 구조
  https://en.wikipedia.org/wiki/Java_class_file

DEX FORMAT
  https://source.android.com/devices/tech/dalvik/dex-format


1.2 File APK의 구성 

Android의 Package 구성이며, 이를 기존의 Java Archive인 JAR와 비교를 해보자.

  • JAR의 구성 vs APK의 구성 
일반적은 JAR를 보면 *.class file로 구성된 Java Archive 파일이며, APK에 내에는 1개의 Dex가 존재한다.
1개의 Dex 크기에 제한 64K로 제한이 되어있어 만약 사이즈가 문제가 된다면 MultiDex를 지원한다고 한다.


출처
  https://stackoverflow.com/questions/8210173/what-is-the-difference-between-class-and-dex-files

MultiDex지원 (64K 이상의 Dex file)
  https://developer.android.com/studio/build/multidex?hl=ko

JIT
  https://source.android.com/devices/tech/dalvik/jit-compiler

12/31/2013

Android 개발환경 설정 Ubuntu 12.04

1. ANDROID BUILD 개발환경.

현재 ODROID를 위한 기본개발환경구성 

  • Host OS Ubuntu 권장사항 
  1. Android 6.0 (Marshmallow) - AOSP master: Ubuntu 14.04 (Trusty)
  2. Android 2.3.x (Gingerbread) - Android 5.x (Lollipop): Ubuntu 12.04 (Precise)
  3. Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu 10.04 (Lucid)

  • Build Toolchain
  1. Android 8.0 and higher support only Clang/LLVM
  2. legacy kernels, GCC 4.9 included in the AOSP master branch (under prebuilts/) may also be used.

  • JDK 권장사항 
  1. Android 7.0 (Nougat) - Android 8.0 (Oreo): Ubuntu - OpenJDK 8, Mac OS - jdk 8u45 or newer
  2. Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu - OpenJDK 7, Mac OS - jdk-7u71-macosx-x64.dmg
  3. Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6
  4. Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu - Java JDK 5

Repo 와 Git 및 Build 환경구성 

  • 개발환경-Key packages
  1. Python 2.6 to 2.7 from python.org
  2. GNU Make 3.81 to 3.82 from gnu.org
  3. Git 1.7 or newer from git-scm.com

  • Make Version 
To avoid build errors, Android 4.0.x (Ice Cream Sandwich) and earlier must revert from make 3.82.

Android SITE의 기본요구사항 확인 
  https://source.android.com/setup/build/requirements

Host에서 USB Device 설정
  https://developer.android.com/studio/run/device#setting-up


1.1 Ubuntu 12.04 LTS 32bit Version 설치 

Android 기본 빌드내용은 아래의 사이트를 참고
Linux에 기본 Android Build 환경과 SDK 및 기타 설정해보자
Ubuntu에 Android 개발환경을 설치해보자. 만약 Virtual Machine을 이용한다면,우선 Virtual Machine 먼저 설정하고, 아래와 같이 ubuntu를 기본으로 설치진행 

  • OS : unbuntu 12.04_LTS
  • Virtual Box 사용.
Virtual Machine을 사용한 Linux를 이용할 경우, 적어도, 16GB RAM 그리고, 30GB 그 이상의 disk 용량을 요구.

Virtual Box 설치 및 Ubuntu 12.04 설치
  https://ahyuo79.blogspot.com/2013/12/virtualbox.html

repo 설치 및 git 설치
  https://ahyuo79.blogspot.com/2014/07/repo.html

Google의 개발환경구성 관련설명
  https://source.android.com/setup/build/initializing

Google의 개발환경구성 관련설정
  https://source.android.com/source/initializing.html#installing-the-jdk

ODROID Download
  https://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword&tag&bid=230


  • 기본 adb 와 fastboot 설치
$ sudo apt-get install android-tools-adb android-tools-fastboot 

  • 설정 Tool Chain 
$ sudo apt-get install gcc-arm-linux-gnueabihf
$ vi ~/.profile
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-

JAVA_HOME=/usr/lib/jvm/jdk1.6.0_35
PATH=$JAVA_HOME/bin:$PATH

  • AOSP Build 시 문제사항 
  https://stackoverflow.com/questions/20235901/aosp-build-error
$ sudo apt-get install libswitch-perl 

  • JDK 관련문제사항 
Copying: out/target/common/obj/APPS/KeyChain_intermediates/emma_out/lib/classes-jarjar.jar
Copying: out/target/common/obj/APPS/Launcher2_intermediates/emma_out/lib/classes-jarjar.jar
make: *** [out/target/common/docs/api-stubs-timestamp] 오류 45

  • JDK 문제 발생시 변경  
$ update-alternatives --config javadoc
$ update-alternatives --config java
$ update-alternatives --config javac
$ update-alternatives --config jar


  • Errors.HIDDEN_SUPERCLASS
아래와 같이 JDK Version 변경 
.... ERROR사항 (stripped of unavailable superclass 에러)  (JDK 6으로 변경)
Install: out/target/product/odroidx2/system/app/Development.apk
Copying: out/target/common/obj/JAVA_LIBRARIES/uiautomator_intermediates/noproguard.classes.jar
target Dex: uiautomator
Install: out/target/product/odroidx2/system/app/PinyinIME.apk
frameworks/base/ethernet/java/android/net/ethernet/EthernetStateMachine.java:72: error 111: Public class android.net.ethernet.EthernetStateMachine stripped of unavailable superclass com.android.internal.util.StateMachine
DroidDoc took 19 sec. to write docs to out/target/common/docs/api-stubs 

  https://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidaf&bid=1294
  https://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword=&tag=&bid=95

설치된 중복 Package 관리방법
  https://ahyuo79.blogspot.com/2018/02/ubuntu-package-2.html

  • JAVA JDK 관련링크
Java SE Development Kit 6u26
jdk-6u26-linux-x64.bin  (계정이 필요)
  https://www.oracle.com/technetwork/java/javase/downloads/index.html
  https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html


1.1.  Installing JDK (Java Development Kit) 

ubuntu를 설치를 하고 update를 하면 , 기본적으로 openJDK가 설치가 된다고 하는데 이 openJDK로 빌드를 하면 문제발생하는데, 주로 JDK의 Version 문제이다. 
ODROID Android  Source Version 를 여러 개 같이 빌드하니, 이 문제는 각 버전마다 별도로 각각 관리해야함 

일단 TEST를 위해서 Sun사 JDK와 OpenJDK 둘다 설치해보고 테스트 중이다.
더불어 Oracle JDK도 존재하며, Sun 사는 Oracle사에 인수합병이 되었으니, Sun JDK가 이전 Version , Oracle JDK가 이후 Version일 것 이라고 생각함

본래 JDK에 문제가 없다면 하나만 설치하면된다. 문제가 발생하면 처음 Version을 변경을 해보고, 다른 JDK로 변경을 해보자.

  •  Sun JDK 설치 (실패) 
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo vi /etc/apt/sources.list 
   ## check your list 
$ sudo apt-get install sun-java6-jdk

위의 명령대로 했더니, 설치가 안되어서, 다시 구글링해서 아래와 같이 script version or manual version으로 설치

  •  Sun JDK 설치 (성공) 
$ wget https://raw.github.com/flexiondotorg/oab-java6/master/oab-java.sh
$ chmod +x oab-java.sh
$ sudo ./oab-java.sh
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk sun-java6-fonts sun-java6-source
$ sudo update-alternatives --config java    // JAVA JDK중 사용자가 직접설정
$ sudo update-alternatives --all            // 모든설정 사용자가 직접설정.
# 체크 모든 JDK , JRE 설정 

  • Oracle JDK 설치 
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update  
sudo apt-get upgrade  
sudo apt-get install oracle-java7-installer        // oracle-7 JDK 설치 

sudo update-java-alternatives -s java-7-oracle     // oracle-java-7로 설정 및 사용

sudo echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections                     // 정확히 뭔지 모르겠음 

sudo apt-get install oracle-java7-set-default  // JAVA_HOME and PATH 환경변수 자동설정.
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java6-installer    // 각 version 별로 설치

상위 관련내용 
  http://askubuntu.com/questions/21131/how-to-correctly-remove-openjdk-openjre-and-set-sunjdk-sunjre-as-default


Sun사와 Oracle 사의 JDK를 설치, Version 1.6로 확인 JDK는 Ubuntu Terminal에서 설치를 해야한다. (SSH Client 설치할 경우, Error)
     
JDK 관련설명 및 사용법
  https://help.ubuntu.com/community/Java

Android Version ICS와  JDK 권장내용 (ODROID 관련내용, 중요한 내용)
  http://codewalkerster.blogspot.kr/2011/11/android-openjdk-vs-sun-jdk-build.html

  • Open JDK 설치 
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk

  • SUN SDK 6 설치확인
각 JDK를 설치 후 Version 확인 

$ java -version
$ javac -version 
Sun JDK 6
$ java -version  //Sun JDK 6 and Oracle 6
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

OPEN JDK 7 설치확인 
$ java -version  // OpenJDK 설치시
java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1~0.12.04.2)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

javac 1.7.0_55

이렇게 JDK를 여러개를 설치 한 후 JDK와 JRE를 변경하고 싶다면 update-alternatives를 이용하는데, 이게 애매할때가 있는데,
이런 경우에는 각 설치한 JDK 패키지들을 각자 삭제한후 새로 설치 진행을 하자 
나중에 정리가 필요할 것 같다.


1.2. Ubuntu 12.04의 Package 설치 


$ sudo apt-get install git gnupg flex bison gperf build-essential \
  zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
  libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos \
  python-markdown libxml2-utils xsltproc zlib1g-dev:i386

$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so


1.3. Host 에서 ADB USB Access 허용   

Host 즉  Window에서,  Guest OS인 Linux Server에 usb device 관련설정 한 후에 , Window의 Virtual box에서 USB Filter로 등록하여 사용하자. 

  • adb 사용을 위해 USB Device 설정 
$ sudo vi /etc/udev/rules.d/51-android.rules
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666"

$ sudo chmod a+rx /etc/udev/rules.d/51-android.rules
$ sudo service udev restart

아래의 사이트 참고 
  http://developer.android.com/tools/device.html

Fastboot 설치방법 
  https://github.com/red-root/PortingARMLinux/wiki/Fastboot-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95


2. How to install Toolchain 

Lite version 만 무료이며, 아래의 링크는 ODROID 사이트에서 가져옴

  • Code Sourcery - Tool Chain Download
  https://sourcery.mentor.com/sgpp/lite/arm/portal/release1294

  • Download 후 설치 
$ sudo chmod a+x arm-2010q1-188-arm-none-eabi.bin
$ sudo dpkg-reconfigure -plow dash
    아니오 선택.

$ ./arm-2010q1-188-arm-none-eabi.bin


설치시 PATH에  cross compiler 설치된 디렉토리 자동으로 추가되며,이를 .bath_profile로 확인.


3. How to install SDK and ECLIPSE



3.1 ECLIPSE

$ sudo apt-get install ecplise

회사 컴퓨터는 위와 같이 설치가 했는데  아래와 같은 에러가 발생하여, 아래와 같이 해결.
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:

$ ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64/ 

이상하게, Eclipse와 위에서 설치한 필수 library와 충돌한다.
만약 위의 대로 설치가 되지 않는다면, 아래와 사이트가서 직접 다운로드해서 실행.

  http://www.eclipse.org/downloads/packages/release/indigo/sr2


3.2. ECLIPSE에서 Android SDK 설치

ODROID 메뉴얼과 아래의 메뉴얼을 참조하면 쉽게 할수 있을 것이다.

$ eclipse 실행.
Help->Install New Software -> ADD

ADT(Android Develop Tools) 로
      Name: ADT Plugin
      Location: https://dl-ssl.google.com/android/eclipse/


  • ADB와 FASTBOOT를 사용하기위해서 PATH설정 

$ vi ~/.bash_profile
 PATH=${PATH}:~/android-sdks/platform-tools
$ source ~/.bash_profile

아래사이트 참조
  http://blog.naver.com/PostList.nhn?from=postList&blogId=kazama10&categoryNo=29&currentPage=3


Ref.
  http://source.android.com/source/initializing.html