[android] 숨겨진 및 내부 API를 사용할 수있는 Android SDK를 어떻게 빌드합니까?

숨겨진 및 내부 API를 포함하도록 Android SDK (또는 android.jar 만)를 다시 빌드하고 싶습니다.

이 문제를 해결하는 방법에 대한 문서 나 토론을 찾을 수 없습니다. cm7을 빌드 할 수있는 Ubuntu CyanogenMod 빌드 환경이 이미 설정되어 있습니다.

이제 make SDK가 SDK를 빌드한다고 읽었지만 @hide를 사용하여 숨김으로 표시된 메서드와 필드를 포함하는 SDK를 빌드하고 싶습니다. 이것이 가능한가?

내가하고 싶은 것은 숨겨진 API를 사용하는 응용 프로그램을 변경하는 것이며이를 다시 빌드하기 위해 수정 된 SDK를 사용하고 싶습니다.



답변

이것이 내가 항상 숨겨진 API를 사용하는 것입니다.

  1. https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yong 에서 저장소를 빌드하거나 jar를 다운로드합니다.
  2. 복사 /target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar (framework_all.jar과 같은 이름으로 이름을 바꾸는 것이 좋습니다)
  3. 프로젝트 빌드 경로를 구성-> 라이브러리->이 외부 jar를 추가하십시오. 주문 및 내보내기에서 android.jar 이전으로 이동하십시오.


답변

나는 이것에 대해 몇 가지 조사를했고 내 결론은 간단하다 : 이것은 꽤 많은 작업 없이는 할 수 없다. 내가 찾은 내용에 대한 자세한 내용은이 답변의 나머지 부분을 읽으십시오.


android.jar실제의 “공개 API”로 구성된다 framework.jarcore.jar발견 된 system/frameworks/장치에서. android.jar나는 자바 라이브러리 헤더라고 부르는의 일종이며, 실제 바이트 코드의 모든 구현은 단지이다 throw new RuntimeException("stub");, 이것은 당신이에 구축 할 수 있습니다 android.jar(예 : 이클립스), 그러나 실행은 장치 또는 에뮬레이터에서 수행되어야한다.

Android SDK의 공용 API 는 javadoc 어노테이션 이 접 두부 가 없는 클래스 / 메소드 / 필드로 정의됩니다 @{hide}. 즉, 주석이 추가 되지 않은 모든 것이 SDK에 포함됩니다.

android.jarout/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates있는 DroidDoc 도구에 의해 생성 된 소스에서 빌드 됩니다 build/tools/droiddoc.

DroidDoc 은 실제 Android SDK 문서를 생성하는 도구 (아마도 javadoc 또는 javadoc 사용)입니다. 부작용으로, 아마도 이미 모든 javadoc을 파싱하고 있기 때문에 android.jarSDK에 배포되는 로 컴파일되는 Android 스텁도 분출됩니다 .

따라서 숨겨진 항목을 포함하려면 특정 부분 만 포함하려는 경우 @hide주석을 제거 하고 SDK를 다시 빌드하면됩니다.

그러나 모든 숨겨진 부분을 포함하려면 상황이 훨씬 더 복잡해집니다. 숨겨진 것으로 감지되지 않도록 DroidDoc (관련 소스는에 있음 build/tools/droiddoc/src/Stubs.java)을 수정할 수 있습니다 . 이것은 매우 사소한 일이며 이것을 시도했지만 생성 된 스텁은 전혀 컴파일되지 않습니다.

내 결론은 이것이 단순히 실현 가능하지 않다는 것입니다. 숨겨진 주석을 감지하는 DroidDoc 부분을 제거하면 생성되는 스텁은 단순히 컴파일 할 수 없으며 올바르게 컴파일하려면 상당한 작업이 필요합니다.

그래서 당신의 질문에 대한 나의 대답은 : 아니오, 이것은 많은 일을하지 않고서는 할 수 없습니다. 죄송합니다.


mkstubs도구 에 대한 추가 정보 입니다. SDK 애드온mkstubs 을 빌드 할 때 사용됩니다 . 즉, 공급 업체의 Android SDK 관리자에서 찾을 수있는 애드온입니다. 예를 들어 삼성은 삼성 휴대 전화와 관련된 추가 API를 제공합니다. DroidDoc 스텁 생성 프로세스와 거의 동일하지만 주석을 사용하지 않고 SDK 애드온에 포함하거나 제외 할 패키지 / 클래스 / 필드를 설명 하는 파일을 사용합니다 .mkstubs@hide.defs

그러나 이것은 Android SDK 빌드가 도구를 사용 하지 않기 때문에 질문과 관련이 없습니다mkstubs . (운수 나쁘게.)


답변

Android 플랫폼에서 * .jar 파일을 재구성 할 수 있습니다.

먼저 ADB를 장치에 연결하십시오. 그런 다음 다음을 실행하십시오.

adb pull /system/framework/core.jar .
adb pull /system/framework/framework.jar .

core.jar표준 자바 라이브러리를 포함 ( java.*)과은 framework.jar(안드로이드 라이브러리를 포함 android.*). 실제 파일은 JAR 형식이 아닌 DEX 형식이므로 아직 사용할 수 없습니다.

dex2jar 와 같은 도구를 사용하여 DEX 형식의 * .jar를 실제 JAR로 변환 할 수 있습니다 .

dex2jar core.jar
dex2jar framework.jar

그런 다음 “외부 JAR 추가 …”를 사용하여 이러한 jar를 가져옵니다 (Eclipse ADT를 사용한다고 가정).

  • 오른쪽 클릭 Project → Properties → Java Build Path → Libraries → Add External JARs… → ( 위에서 core-dex2jar.jar및 선택 framework-dex2jar.jar).

이를 통해 내부 및 일부 Java 7 API를 사용할 수 있습니다. (내가 볼 수있는 한 생성 된 APK에는 JAR의 실제 코드가 포함되어 있지 않습니다.)


답변

이 저장소android.jar 에서 숨겨진 API로 사용 하도록 수정 된 파일을 다운로드 할 수 있습니다 . 거기의 지침을 따르십시오.


답변

Lollipop의 경우 흐름이 약간 다릅니다.

  1. Lollipop 기기에서 /system/framework/arm/boot.oat 가져 오기

  2. ‘java -jar oat2dex.jar boot boot.oat’사용

  3. dex와 odex라는 두 개의 폴더가 있습니다. dex로 이동하여 ‘java -jar dex2jar.jar framework.dex’를 만듭니다.
  4. 결과 framework.jar의 이름을 .zip으로 바꾸고 필요한 클래스를 추출하여 찾습니다.
  5. [sdk_path] / platforms / [target_platform]으로 이동하여 android.jar의 압축을 풉니 다 (먼저 이름을 zip으로 바꿉니다).
  6. 추출 된 프레임 워크에서 추출 된 android.jar로 파일을 복사합니다. 그런 다음 zip으로 압축하고 .jar로 이름을 바꿉니다.

추신 : 아마도 ‘framework_classes2.dex’에 대해 4-6 단계를 반복해야합니다.


답변

DroidCon 2011

다음은 Sony Ericson의 Erik Hellman이 숨겨진 Android API에 액세스하는 방법을 설명합니다.

http://vimeo.com/30180393(Hmm
링크가 작동하지 않는 것 같습니다).

고토 DroidCon 웹 페이지 일 2 로 스크롤 아래 숨겨진 API 10:15 사용 하고 당신이 거기에 그것을 볼 수 있습니다.

링크가 죽고 있습니다!

나는 이것을 찾았습니다 : http://skillsmatter.com/podcast/os-mobile-server/hidden-api dunno 얼마나 오래 걸릴지

Android SDK의 공식 API는 일반적으로 대부분의 일반 애플리케이션에 충분합니다. 그러나 때때로 개발자가 공식 API에 게시되지 않은 내부 시스템 서비스, API 및 리소스에 액세스해야하는 상황이 있습니다. 다행히도 이러한 API는 몇 가지 영리한 트릭을 통해 계속 사용할 수 있으며 Android에서 새롭고 혁신적인 솔루션을 개발할 때 종종 유용 할 수 있습니다. 이 세션에서는 이러한 숨겨지고 보호 된 API에 액세스하고 사용하는 방법, 사용 제한 사항 및 여러 공급 업체 장치 및 Android 버전에서 안전하게 제어하는 ​​방식으로 API를 사용하는 방법에 대한 몇 가지 팁을 배웁니다. 청중은 일반적으로 Android에서 할 수없는 몇 가지 고급 데모를 보게됩니다. Android 플랫폼의 내부에 대한 많은 통찰력을 가진 상당히 고급 세션을 기대하십시오.


답변

이것을 보십시오 :

이 기사의 궁극적 인 목표는 개발자에게 리플렉션을 사용하지 않고 내부 및 숨겨진 API의 기능을 제공하는 것입니다. 다음 여러 부분에서 설명하는 모든 단계를 완료하면 내부숨겨진 API를 공개 공개 API 인 것처럼 사용할 수 있습니다 . 반성 할 필요가 없습니다.

그러나 이러한 비공개 API를 사용하는 경우 애플리케이션이 큰 위험에 처해 있음을 인식해야합니다. 기본적으로 다음 Android OS 업데이트시 API가 손상되지 않을 것이라는 보장은 없습니다. 여러 공급 업체의 장치에서 일관된 동작에 대한 보장조차 없습니다. 당신은 완전히 당신 자신입니다.

따라야 할 세 가지 시나리오가 있습니다.

  1. 내부숨겨진 API 모두 사용 (시나리오 A)
  2. 숨겨진 API 만 사용 (시나리오 B)
  3. 내부 API 만 사용 (시나리오 C)

시나리오 A는 B와 C의 합계입니다. 시나리오 B는 가장 쉬운 방법입니다 (일식 ADT 플러그인 수정이 필요하지 않음).

시나리오 A : 파트 1 , 2 , 3 , 4 , 5 읽기

시나리오 B : 파트 1 , 2 , 3 , 5 읽기

시나리오 C : 파트 1 , 2 , 3 , 4 , 5 읽기