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


86

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

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

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

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


2
@Hidden 단지의 javadoc가 숨 깁니다, 모든 방법을 계속 사용할 수 있습니다
Blundell은

12
@hide는 클래스 파일에서 제거합니다.
Thomas Hofmann


리플렉션을 사용할 수 있다는 것을 알고 있지만 리플렉션없이 숨겨진 API를 사용하는 기존 애플리케이션을 변경하고 싶고 리플렉션을 사용하도록 기존 코드를 모두 변경하고 싶지 않습니다.
Thomas Hofmann

4
난 당신이 제거 할 수 있다고 생각 @Hidden실행 한 후, 액세스하려는 API의 라벨을 make update-api하고 make SDK자신의 SDK를 구축 할 수 있습니다.
dreamtale

답변:


69

이것이 내가 항상 숨겨진 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 이전으로 이동하십시오.

이것은 나에게도 효과적이었습니다! 지금은, 실제 작업과 이에 대한 감사에서 얻을 수 있습니다
CurlyPaul

IMHO, 이것은 가장 쉽고 빠릅니다.
Patrick Cho

이것을 정답으로 표시하는 방법이 없습니까?
Chris Browet 2014-06-24

2
이 방법은 모든 장치에서 작동합니까, 아니면 대상 장치에서만 작동합니까?
Hải Phong 2014

android studio에서 라이브러리 순서를 정의하려면 모듈의 .iml파일 을 변경하고 원하는 lib <orderEntry>Android SDK 보다 먼저 가져와야합니다 . 불행히도이 기술은 gradle-sync 버튼을 누르면 파일을 덮어 쓰므로 영구적이지 않습니다.
waqaslam

44

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


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 . (운수 나쁘게.)


나도 봤어. Droiddoc 외에 / development / tools / mkstubs에 mkstubs라는 도구가 있습니다. 빌드 중에 호출되고 내가 본 한 클래스 파일을 수정하여 물건을 스터 빙합니다. build / core / tasks / sdk-addon.mk에는 다음 코드가 있습니다. define stub-addon-jar $ (call stub-addon-jar-file, $ (1)) : $ (1) | mkstubs $ (info 스터 빙 addon jar using $ (PRODUCT_SDK_ADDON_STUB_DEFS)) $ (hide) java -jar $ (call module-installed-files, mkstubs) $ (if $ (hide) ,,-v) \ "$$ <" "$$ @"@ $ (PRODUCT_SDK_ADDON_STUB_DEFS) endef
토마스 호프만

불행히도 나는 이것에 관심이 없지만 나도 모두 hide라는 변수에 의존하는 것처럼 보입니다. 나는 그것이 설정되었다는 것을 발견하지 못했다. 다른 빌드 파일에서 $ (hide)를 검색하면이 값에 많이 의존한다는 것을 알 수 있습니다. C 라이브러리가 빌드되는 방식에도 영향을 미치는 것 같습니다.
토마스 호프만

@ThomasHofmann : 처음에는 mkstubs 도구에도 혼란 스러웠습니다. 내가 배운 것은 mkstubs는 일반 sdk를 빌드 할 때가 아니라 (공급 업체) sdk 애드온을 빌드 할 때만 사용된다는 것입니다. 그러나 mkstubs는 @hide주석을 사용하지 않는다는 점을 제외하면 DroidDoc과 거의 동일 합니다. "단지" .defs애드온의 API에 포함될 패키지 / 클래스 / 필드를 설명 하는 파일을 사용합니다 .
Bjarke Freund-Hansen 2012 년

2
@ThomasHofmann : 정보 $(hide) , 당신은 자신을 혼란스럽게하고 있습니다. $(hide)실행되는 프로그램의 실제 명령 줄을 숨기는 메이크 파일의 접두사 일 뿐이며 그 이상은 아니며 거의 모든 곳에서 사용됩니다. Android SDK 또는 @hide소스 코드 의 주석과 관련이 없습니다.
Bjarke Freund-Hansen

위의 경로 out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes.jar
Bunny

31

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의 실제 코드가 포함되어 있지 않습니다.)


정말 감사합니다. 저는 당신의 방법 만이 저에게 효과가있는 여러 가지 방법을 시도했습니다.
SalutonMondo

7
이 방법은 ICS 및 이후 시스템에서 여전히 작동하지만 더 많은 저글링이 필요하다는 점에 유의하는 것이 중요합니다. 관련 파일은 /system/framework/core.odex, /system/framework/framework.odex및 그 이상일 것입니다. 이것들은 deodexed ( java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core) 및 reodexed ( java -jar smali-2.0.3.jar -x -o core.dex core) 일 수 있으며 dex2jar core.dex그 후에 만 해당 작업을 수행합니다.
Alex Cohn

core.jar를에 마시 멜로 찾을 수 없습니다
mehmet6parmak

안드로이드 p의 코어 및 프레임 워크 jar에 대한 아이디어가 있습니까?
프라 바카

위의 경로 out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes.jar
Bunny

17

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


4
이 답변은 가장 간단한 솔루션이므로 더 많이 찬성되어야합니다. 사람들, 당신이 해결책을 찾고 있다면-다른 사람들이 이미 그렇게했고 그 github 저장소에 해결책을 배치했다는 것을 알고 있습니다. 그것을 사용하고 즐기십시오! ))
Mixaz

1
API 28에 android.jar을 사용하는 동안 robolectric에 오류가 발생합니다. 문제의 제기 github.com/anggrayudi/android-hidden-api/issues/62을 하고 항아리에 대한 @Anggrayudi 감사합니다
프라 바카

나는 또한 안드로이드 10에 대해서도 똑같이했습니다 . 다른 기여자 github.com/aeab13/android-jar-with-hidden-api 에서 다운로드 했습니다 . hdmi-cec 클래스에 액세스하여 빌드 할 수 있었지만 코드는 여전히 헷갈
립니다. .code

17

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 단계를 반복해야합니다.


3 단계의 경우 해당 링크에서 dex2jar.jar을 찾을 수 없습니다 .... 많은 것을 시도했지만 알아낼 수 없습니다. 어딘가에 링크가 있습니까? 내 Android SDK에 있습니까? 찾을 수 없습니다.
Dwebtron 2015

네, 그것은 GitHub의 프로젝트로 진행하고, 어쩌면 그것은 나를, 그러나 나는 거기 ... "의 .jar"로 끝나는 모든 파일을 찾을 수 없습니다
Dwebtron

1
'releases'섹션 참조
deviant

2
따라서 dex2jar의 최신 버전이 다운로드 형식을 변경 한 것 같습니다. 다운로드의 압축을 풀고 'java -jar ...'대신 플랫폼에 따라 'd2j-dex2jar.sh'또는 'd2j-dex2jar.bat'스크립트를 framework.dex 파일에서 직접 실행하십시오
CalumMcCall

1
두 jar 파일을 android.jar에 복사했습니다. 이제 android studio에서 ': app : processDebugResources'작업에 대해 오류 : 실행이 실패했습니다. > com.android.ide.common.process.ProcessException : org.gradle.process.internal.ExecException : Process '명령'D : \ Programme \ Android \ android-sdk \ build-tools \ 19.1.0 \ aapt.exe ' '종료 값이 0이 아닌 종료 값 1
wutzebaer

15

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 플랫폼의 내부에 대한 많은 통찰력을 가진 상당히 고급 세션을 기대하십시오.


1
흥미롭지 만 안타깝게도 내 질문에 대답하지 않습니다. 숨겨진 항목이 포함 된 SDK를 실제로 다시 빌드하는 방법을 요청했습니다.
Thomas Hofmann

내가 원하는 것을 달성 할 다른 방법을 찾은 것 같습니다. 내일 설명하겠습니다.
Thomas Hofmann

ADT에서 숨겨진 API를 사용하는 프로젝트의 소스를 컴파일하려면 다음을 수행 할 수 있습니다. 1) 소스에 대한 Android 프로젝트를 만듭니다. 2) 빌드 경로에서 Android 클래스 경로 컨테이너를 제거합니다. 3) ASOP ROM 빌드 (예 : cm7)의 JAR 파일을 포함하는 사용자 라이브러리를 정의합니다 (시스템 라이브러리 확인란도 선택). 사용하는 JAR 파일은 참조해야하는 항목에 따라 다릅니다. framework-immediates는 아마도 그것의 일부가 될 것입니다.
Thomas Hofmann

4) 이제 프로젝트가 빌드되면 생성되는 APK에 사용자 라이브러리 클래스가 포함되지 않습니다. 숨겨진 API가 표시되고 모든 것이 잘 컴파일됩니다.
Thomas Hofmann

@Blundell : 링크를 업데이트 해 주시겠습니까 .. 그들은 죽었습니다!
zombie

12

이것을 보십시오 :

이 기사의 궁극적 인 목표는 개발자에게 리플렉션을 사용하지 않고 내부 및 숨겨진 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 읽기


3
이미 그 블로그 항목을 읽었습니다. "1) Android는 오픈 소스 프로젝트입니다. android.jar에서 내부 및 숨겨진 클래스를 제외하지 않도록 소스 코드를 다운로드하고 빌드 시스템을 사용자 정의 할 수 있습니다. 이것은 어려운 방법입니다." 불행히도 자세한 내용은 다루지 않습니다.
Thomas Hofmann

3
블로그 게시물 (의 마지막 부분으로 이동 devmaze.wordpress.com/2011/01/19/... ), 링크있다 ( github.com/inazaruk/android-sdk/tree/master/platforms ) 안드로이드 사전 구축 모든 숨겨진 및 내부 API가있는 API.
Bob

1
주어진 링크에 액세스 할 수 없습니다. 작성자의 허가가 필요합니다.
SHAHS

위 경로 out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes.jar
Bunny

1

http://source.android.com/ 의 저장소 체크 아웃에서 자바 파일을 추출하기 위해 Groovy 스크립트를 작성한 적이 있습니다 . 다음 필요한 다른 단계를 포함하여 모든 Android 소스를 컴파일하기위한 전체 도구 모음없이 컴파일하는 있습니다. 포장, 자원 생성 등).

여기에서 찾을 수 있습니다.

https://github.com/thoutbeckers/CollectAndroid

하지만 확실히 이것은 Gingerbread 이후에 무엇이든 업데이트가 필요할 것입니다. 대부분 설정 파일 (CollectConfig.groovy)의 "rootdirs"에 올바른 디렉토리를 설정함으로써.

당시 나는 모든 숨겨진 API와 소스 (당시 문제가 있음)를 사용하여 개발을 위해 정기적으로 이것을 사용했습니다.

다른 곳에서 언급했듯이 com / android / internal / **은 액세스 규칙이 적용되어 최신 버전의 ADT에서 여전히 숨겨집니다.


이 경로 out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes.jar
Bunny

Gingerbread에 대해 마지막으로 업데이트 된 이후로 해당 저장소를 보관했습니다 . 안타깝게도 다른 접근 방식을 찾아야합니다.
thoutbeckers

1

Long의 대답 은 나를 위해 일했지만 여전히 필요한 수업, 특히 android.provider.Telephony가 누락되었습니다. 다음과 같이 추가 할 수있었습니다.

  1. framework.jar 파일 추출

    mkdir /tmp/framework
    cp framework.jar /tmp
    cd /tmp/framework
    jar xvf ../framework.jar
    mv android classes
    
  2. out / target / common / obj / JAVA_LIBRARIES 디렉토리를 생성 할 Android 리포지토리를 빌드합니다.

  3. 누락 된 클래스가있는 위치 찾기

    $ cd /path/to/out/target/common/obj/JAVA_LIBRARIES
    $ find . | grep "/Telephony.class"
    ./telephony-common_intermediates/classes/android/provider/Telephony.class
    ./android_stubs_current_intermediates/classes/android/provider/Telephony.class
    
  4. 새 클래스를 추가하고 프레임 워크 JAR 파일을 다시 빌드하십시오.

    cd /tmp/framework
    cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes .
    cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates/classes .
    cd classes
    jar cvf ../framework.jar .
    

또는 게으르고 모든 클래스를 하나의 거대한 jar 파일에 포함시킬 수 있습니다.

cd /tmp/framework
cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes .
cd classes
jar cvf ../framework.jar .

out / target / common / obj / JAVA_LIBRARIES이 경로를 찾는 방법은 무엇입니까?
Bunny

@Bunny 자세한 내용으로 답변을 업데이트했습니다. 그러나 여기에 대한 답이 더 쉬울 것 같습니다. stackoverflow.com/a/32626155/399105
bmaupin

@bmaupin .. 프레임 워크 jar를 얻기 위해이 경로를 어떻게 찾을 수 있는지 도와주세요. 뭔가를 놓치고 ... 가이드하십시오
토끼

0

댓글을 달 수는 없지만 기본적으로 @KennyTM ( https://stackoverflow.com/a/13550030/2923406에 대한 댓글입니다. ) 훌륭한 답변에 대한 .

Eclipse에서 다음 오류가 발생하는 경우 :

The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class   files

(즉, android.internal. *을 사용할 수 없습니다.)

그런 다음 가능한 해결책 중 하나는 /system/framework/framework2.jar에 대해 동일한 방법을 적용하는 것입니다. SDK19 용 Android 에뮬레이터를 사용하면이 추가 항아리가 있습니다. 내 HTC One에는 framework3.jar도 있습니다.


이 경로 out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes.jar
Bunny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.