숨겨진 및 내부 API를 포함하도록 Android SDK (또는 android.jar 만)를 다시 빌드하고 싶습니다.
이 문제를 해결하는 방법에 대한 문서 나 토론을 찾을 수 없습니다. cm7을 빌드 할 수있는 Ubuntu CyanogenMod 빌드 환경이 이미 설정되어 있습니다.
이제 make SDK가 SDK를 빌드한다고 읽었지만 @hide를 사용하여 숨김으로 표시된 메서드와 필드를 포함하는 SDK를 빌드하고 싶습니다. 이것이 가능한가?
내가하고 싶은 것은 숨겨진 API를 사용하는 응용 프로그램을 변경하는 것이며이를 다시 빌드하기 위해 수정 된 SDK를 사용하고 싶습니다.
답변
이것이 내가 항상 숨겨진 API를 사용하는 것입니다.
- https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yong 에서 저장소를 빌드하거나 jar를 다운로드합니다.
- 복사 /target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar (framework_all.jar과 같은 이름으로 이름을 바꾸는 것이 좋습니다)
- 프로젝트 빌드 경로를 구성-> 라이브러리->이 외부 jar를 추가하십시오. 주문 및 내보내기에서 android.jar 이전으로 이동하십시오.
답변
나는 이것에 대해 몇 가지 조사를했고 내 결론은 간단하다 : 이것은 꽤 많은 작업 없이는 할 수 없다. 내가 찾은 내용에 대한 자세한 내용은이 답변의 나머지 부분을 읽으십시오.
android.jar
실제의 “공개 API”로 구성된다 framework.jar
및 core.jar
발견 된 system/frameworks/
장치에서. android.jar
나는 자바 라이브러리 헤더라고 부르는의 일종이며, 실제 바이트 코드의 모든 구현은 단지이다 throw new RuntimeException("stub");
, 이것은 당신이에 구축 할 수 있습니다 android.jar
(예 : 이클립스), 그러나 실행은 장치 또는 에뮬레이터에서 수행되어야한다.
Android SDK의 공용 API 는 javadoc 어노테이션 이 접 두부 가 없는 클래스 / 메소드 / 필드로 정의됩니다 @{hide}
. 즉, 주석이 추가 되지 않은 모든 것이 SDK에 포함됩니다.
android.jar
에 out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates
있는 DroidDoc 도구에 의해 생성 된 소스에서 빌드 됩니다 build/tools/droiddoc
.
DroidDoc 은 실제 Android SDK 문서를 생성하는 도구 (아마도 javadoc 또는 javadoc 사용)입니다. 부작용으로, 아마도 이미 모든 javadoc을 파싱하고 있기 때문에 android.jar
SDK에 배포되는 로 컴파일되는 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의 경우 흐름이 약간 다릅니다.
-
Lollipop 기기에서 /system/framework/arm/boot.oat 가져 오기
-
‘java -jar oat2dex.jar boot boot.oat’사용
- dex와 odex라는 두 개의 폴더가 있습니다. dex로 이동하여 ‘java -jar dex2jar.jar framework.dex’를 만듭니다.
- 결과 framework.jar의 이름을 .zip으로 바꾸고 필요한 클래스를 추출하여 찾습니다.
- [sdk_path] / platforms / [target_platform]으로 이동하여 android.jar의 압축을 풉니 다 (먼저 이름을 zip으로 바꿉니다).
- 추출 된 프레임 워크에서 추출 된 android.jar로 파일을 복사합니다. 그런 다음 zip으로 압축하고 .jar로 이름을 바꿉니다.
추신 : 아마도 ‘framework_classes2.dex’에 대해 4-6 단계를 반복해야합니다.
답변
다음은 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가 손상되지 않을 것이라는 보장은 없습니다. 여러 공급 업체의 장치에서 일관된 동작에 대한 보장조차 없습니다. 당신은 완전히 당신 자신입니다.
따라야 할 세 가지 시나리오가 있습니다.
- 내부 및 숨겨진 API 모두 사용 (시나리오 A)
- 숨겨진 API 만 사용 (시나리오 B)
- 내부 API 만 사용 (시나리오 C)
시나리오 A는 B와 C의 합계입니다. 시나리오 B는 가장 쉬운 방법입니다 (일식 ADT 플러그인 수정이 필요하지 않음).
