source

Android의 Java 7 언어 기능

factcode 2022. 7. 21. 23:32
반응형

Android의 Java 7 언어 기능

Android에서 Java 7의 새로운 기능을 사용해 본 사람이 있는지 궁금해서요.나는 안드로이드가 자바가 뱉어내는 바이트코드를 읽고 그것을 덱스로 바꾼다는 것을 알고 있다.그래서 제 질문은 Java 7의 바이트 코드를 이해할 수 있느냐는 것입니다.

Android Studio를 사용하는 경우 Java 7 언어를 패치 없이 자동으로 활성화해야 합니다.리소스를 사용하여 시도하려면 API 레벨 19 이상이 필요하며 NIO 2.0이 누락되었습니다.

Java 7 기능을 사용할 수 없는 경우 @Nuno의 답변을 참조하여build.gradle.

다음은 역사 참고용입니다.


Java 7의 일부분은 Android에서 사용할 수 있습니다(주의:4.1)에서만 테스트하고 있습니다.

우선, 이클립스의 ADT는 Java 컴파일러 1.5와 1.6만 호환되도록 하드 코딩되어 있기 때문에 사용할 수 없었습니다.ADT를 재컴파일 할 수 있지만 전체 Android를 재컴파일하는 것 외에는 간단한 방법이 없습니다.

하지만 이클립스를 사용할 필요는 없습니다.를 들어 Android Studio 0.3.2, 인텔리J 아이디어 CE 및 기타 javac 기반 IDE는 Android 컴파일을 지원하며 다음과 같은 기능을 통해 Java 8까지 컴플라이언스를 설정할 수 있습니다.

  • File → Project Structure → Modules → (두 번째 창에서 모듈을 선택합니다) → Language → ("7.0 - Diamonds, ARM, multi-diamble 등" 선택)

IntelliJ에서의 Java 7의 이니블화

Java 7 언어 기능만 사용할 수 있습니다.또한 절반의 개선도 라이브러리에서 이루어지기 때문에 아무것도 얻을 수 없습니다.사용할 수 있는 기능은 라이브러리에 의존하지 않는 기능입니다.

  • 연산자(Diamondoperator, Diamond 연산자(Diamond 연산자)<>)
  • 스트링 스위치
  • (Multiple-catchcatch (Exc1 | Exc2 e))
  • 리터럴로 친다( 「」 「」 「」).1_234_567)
  • 리터럴Binary Literals)0b1110111)

이러한 기능은 아직 사용할 수 없습니다.

  • try 스테이트먼트:하지 않는 with-display"가 입니다.syslog"로 지정합니다.AutoCloseable" (4.4)
  • @SafeVarargs 주석.java.lang이기 때문입니다.SafeVarargs"가 존재하지 않습니다.

..."아직" :) Android의 라이브러리는 1.6을 목표로 하고 있지만, Android 소스에는 AutoCloseable과 같은 인터페이스가 포함되어 있고 Closeable과 같은 기존 인터페이스는 AutoCloseable에서 상속됩니다(SafeVararargs는 정말로 누락되어 있습니다).우리는 반사를 통해 그것의 존재를 확인할 수 있었다.단순히 자바독이 가지고 있다는 이유만으로 숨겨져 있습니다.@hide태그가 붙어 있기 때문에, 「tag.jar」에는 이러한 태그가 포함되지 않습니다.

숨겨진 API와 내부 API를 사용할 수 있는 Android SDK를 구축하려면 어떻게 해야 합니까?라는 기존 질문이 있습니다. 그 방법들을 되찾는 방법에 대해서요현재 플랫폼의 기존 "android.jar" 참조를 커스터마이즈된 참조로 대체하면 Java 7 API 중 많은 것을 사용할 수 있게 됩니다(절차는 Eclipse와 유사합니다).Project Structure → SDK를 확인하십시오.)

AutoCloseable 외에 (만) 다음 Java 7 라이브러리 기능도 공개됩니다.

  • ConcurrentModification의 예외 체인 생성자예외, Linking Error 및 Assertion Error
  • primitive의 static .compare() 메서드는 다음과 같습니다.Boolean.compare(), Byte.compare(), Short.compare(), Character.compare(), Integer.compare(), Long.compare().
  • 통화: .getAvailableCurrences() , .getDisplayName() (, .getNumericCode()는 제외)
  • 비트 세트: .이전SetBit(), .previousClearBit(), .valueOf(), .toLongArray(), .toByteArray()
  • 컬렉션: .emptyEnumeration(), .emptyIterator() 및 .emptyListIterator()
  • 자동 닫힘
  • 슬로우 가능: .addSuppressed(), .getSuppressed() 및 4인수 컨스트럭터
  • 문자: .compare() , .isSurrogate() , .getName() , .highSurrogate() , .isBmpCodePoint() (, .isAlphabric()및 .isIdeographic()는 제외)
  • 시스템: .lineSeparator() (문서화되어 있지 않음)
  • java.displect.reflect.수식자: .classModifiers(), .constructorModifiers(), .fieldModifiers(), .interfaceModifiers()
  • 네트워크 인터페이스: .getIndex(), .getByIndex()
  • InetSocketAddress: .getHostString()
  • InetAddress: .getLoopbackAddress()
  • 로거: .getGlobal()
  • Concurrent LinkedDeque
  • Abstract Queueed Synchronizer: .has Queueed Predecessors()
  • DeflaterOutputStream: "syncFlush"를 사용하는 3개의 컨스트럭터.
  • 디플레이터:NO_FLUSH, .SYNC_FLUSH,.4개의 인수를 가진 FULL_FLUSH, .deflate()

그게 다예요.특히 NIO 2.0은 존재하지 않으며 Arrays.asList는 아직 @SafeVarargs가 아닙니다.

편집: 이 글이 작성되었을 때 최신 릴리스는 Android 9와 Eclipse Indigo였습니다.그때 이후로 상황이 달라졌다.

  • 실용적인 답변

네, 해봤어요.그러나 Java 7을 실제로 사용할 수 있는 방법(적어도 간단한 방법은 아님)이 없는 수준 6으로 호환성이 제한되었기 때문에 이는 좋은 테스트가 아닙니다.

  • 처음에 다른 JDK가 설치되어 있지 않은 머신에 JDK7을 설치했습니다.Eclipse와 Android도 설치되어 있지 않습니다.

이 머신에는 7개밖에 설치되어 있지 않습니다.

  • 그리고 새로운 Eclipse Indigo를 설치하고 실제로 JDK 7을 사용하고 있는지 확인했습니다(이것이 유일한 것이고, 제가 선택한 것이기 때문에 놀랐을 것입니다).

7은 이클립스에서 유일하게 사용됩니다.

  • 그리고 Android SDK의 최신 버전을 설치했습니다(편집: 허니콤, API13, 이 게시물 작성 당시).JDK 7을 찾아 올바르게 설치했습니다.ADT도 마찬가지입니다.

  • 그런데 Hello Word Android 앱을 컴파일하여 실행하려고 할 때 깜짝 놀랐습니다.호환성이 Java 6으로 설정되어 Java 7로 강제할 수 없습니다.

호환성은 Java 6으로 제한됩니다.

  • Android가 아닌 일반 Java 프로젝트를 시도해보니 설명이 나왔습니다.호환성 수준은 Eclipse에 의해 제한되는 것 같습니다(다음 이미지 하단에 있는 메시지 참조).

Eclipse는 레벨 6 호환성으로 제한

그래서 Hello World와 다른 앱들도 좀 더 복잡해지고SQLite,Listview,Sensor ★★★★★★★★★★★★★★★★★」Camera그러나 이것은 Java 7의 호환성 처리가 잘 되어 있고 Android에서 작동하는 것처럼 보인다는 것을 증명하는 것일 뿐입니다.

그럼, 누군가 위에서 본 이클립스 한계를 벗어나기 위해 착한 개미와 함께 시도했을까요?

  • 신학적 답변

어쨌든 SDK는 여기에서 설명한 바와 같이 Java 5 또는 6에서 사용하도록 설계되어 있습니다.

Java 7에서 동작하는 것이 있을지도 모릅니다만, 「우연」으로 동작합니다.DEX의 구조는 정상적으로 동작하거나 동작하지 않을 수 있으며, DEX를 구축한 후에는 동작하거나 동작하지 않을 수 있습니다.이는 정규화되지 않은 JDK를 사용하면 정의상 예측할 수 없는 결과가 발생하기 때문입니다.

비록 누군가가 평범한 Java 7에서 Android 앱을 성공적으로 구축했다고 해도, 이것은 JDK에 해당되지 않습니다.다른 응용 프로그램에 적용된 동일한 프로세스가 실패하거나 결과적으로 응용 프로그램이 해당 JDK 사용과 관련된 버그를 가질 수 있습니다.권장하지 않습니다.

웹 앱 개발에 관여하는 사용자에게는 Java 5 또는 6에서 구축된 웹 애플리케이션을 Java 4에서만 사용할 수 있는 애플리케이션 서버(예를 들어 Weblogic 8)에 배치하는 것과 완전히 동일합니다.이것은 효과가 있을 수 있지만, 다른 목적으로는 권장할 수 없습니다.

dalvikvm.com에서 인용:

dx는 Android SDK에 포함되어 일반 Java 컴파일러에 의해 컴파일된 Java 클래스의 Java 클래스 파일을 다른 클래스 파일 형식(.dex 형식)으로 변환합니다.

즉, .java 소스 파일은 문제가 되지 않으며 .class 바이트 코드일 뿐입니다.

Java 7에서 JVM 바이트 코드에 추가된 것은 revokedynamic뿐이며, 나머지는 Java 6과 호환성이 있는 것으로 알고 있습니다.Java 언어 자체는 호출된 언어를 사용하지 않습니다.Strings를 사용스위치문이나 멀티캐치 등 다른 신기능은 구문설탕일 뿐 바이트 코드 변경이 필요하지 않습니다.예를 들어, 멀티 캐치는 가능한 각 예외에 대해 캐치 블록을 복사합니다.

유일한 문제는 Java 7에서 도입된 새로운 클래스가 AutoCloseable과 같은 Android에서 누락되어 있기 때문에 리소스 테스트 기능을 사용할 수 있을지 모르겠습니다(누군가 시도해 보셨나요?).

그것에 대한 소감은요?내가 뭘 빼놓았나요?

Android SDK v15에서는 Eclipse 3.7.1과 함께 Java 7은 Android 개발을 지원하지 않습니다.소스 호환성을 1.7로 설정하려면 생성된 .class 파일의 호환성을 1.7로 설정해야 합니다. 이 경우 Android 컴파일러는 다음과 같은 오류를 발생시킵니다.

Android를 사용하려면 컴파일러 호환성 수준 5.0 또는 6.0이 필요합니다.대신 '1.7'을 찾았습니다.[ Android Tools ]> [ Fix Project Properties ]를 사용해 주세요.

위의 답변을 @Kenny에 의해 자세히 설명하겠습니다.TM, 4.0.3 이상을 목표로 하고 있다면(minSdkVersion=15), 타겟의 SDK Android.jar에 몇 개의 클래스를 추가하여 숨겨진 API를 사용할 수 있습니다.

이렇게 하면 Closeable에서 try-with-resources를 사용할 수 있을 뿐만 아니라 자체 클래스에 AutoCloseable을 구현할 수 있습니다.

【API】【Android】.jar에서 수정해야 하는 모든 클래스의 소스와 바이너리를 포함하는 zip을 만들었습니다..
Android-sdk/랫랫/안안-NN/안로.

http://db.tt/kLxAYWbr 에서 다운로드 할 수 있습니다.

또한 지난 몇 달 동안 엘리엇 휴즈는 안드로이드 트리에 대해 AutoCloseable 완료, SafeVarargs 추가, 다양한 API 숨김 해제, Throwable의 보호된 컨스트럭터 수정, dx 버전 51 클래스 파일 지원 추가 등 몇 가지 약속을 했습니다.그래서 마침내 약간의 진전이 있었다.

편집 (2014년 4월):

SDK 19 릴리즈에서는 추가 API를 사용하여 android.jar에 패치를 적용할 필요가 없어졌습니다.

4.0.3 이상(minSdkVersion=15)을 대상으로 하는 앱에 Android Studio에서 Try-with-filen을 사용하는 가장 좋은 방법은 다음과 같습니다.compileOptions고객님께build.gradle:

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 19
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

Android Studio는 이 API 레벨에서는 Try-with-Resources를 사용할 수 없다고 불평하지만, 제 경험으로는 사용할 수 있습니다.이 프로젝트는 4.0.3 이상의 디바이스에서 문제없이 구축 및 실행됩니다.500k 이상의 기기에 설치되어 있는 앱은 문제가 없습니다.

Android Studio 오류

이 경고를 무시하려면 다음 항목을 에 추가하십시오.lint.xml:

<issue id="NewApi">
    <ignore regexp="Try-with-resources requires API level 19"/>
</issue>

순수한 개미와 함께 이것을 작동시키는 것은 좀 엉터리인 것 같다.

하지만 저는 http://www.informit.com/articles/article.aspx?p=1966024을 이용했습니다.

Android의 개미 기반 빌드 시스템에 의한 코드 빌드에 Java 7 기능을 사용하려면 , 다음의 것을 간단하게 입력해 주세요.custom_rules.xml프로젝트 루트 디렉토리에서 다음을 수행합니다.

custom_syslog.xml:

<project name="custom_android_rules">
    <property name="java.target" value="1.7" />
    <property name="java.source" value="1.7" />
</project>

몇몇 사람들은 내가 찾은 이 git 프로젝트에 관심이 있을 것이다.이 프로젝트는 Java 7을 안드로이드에서 실행할 수 있는 것처럼 보인다.https://github.com/yareally/Java7-on-Android

그러나 현재 진행 중인 프로젝트에 이것을 추가하면 너무 위험합니다.구글이 자바7을 공식적으로 지원할 때까지 기다리겠습니다.

언급URL : https://stackoverflow.com/questions/7153989/java-7-language-features-with-android

반응형