web-dev-qa-db-ja.com

非表示および内部APIを使用できるAndroid SDKをビルドするにはどうすればよいですか?

Android SDK(またはAndroid.jarのみ))を再構築して、非表示および内部APIを含めます。

私はこれをどうやって進めるかについての文書や議論を見つけることができませんでした。 cm7をビルドできるUbuntu CyanogenModビルド環境が既にセットアップされています。

Make SDKがSDKをビルドすることを読みましたが、@ hideを使用して非表示としてマークされているメソッドとフィールドを含むSDKをビルドしたいと思います。これは可能ですか?

私がしたいことは、隠されたAPIを使用するアプリケーションに変更を加え、それを再構築するために、変更されたSDKを使用したいことです。

80
Thomas Hofmann

これは、非表示の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を追加します。 Order and Exportで、Android.jarの前に移動します
63
Long

私はこれについて調査しましたが、私の結論は単純です:これはかなりの労力なしではできません。私が見つけたものの詳細についてはこの回答の残りを読んでください。


Android.jarは、実際には、デバイス上のframework.jarにあるcore.jarsystem/frameworks/の「パブリックAPI」で構成されています。 Android.jarは私が呼ぶようなものですJavaライブラリヘッダー、実際のバイトコードのすべての実装はthrow new RuntimeException("stub");であり、これによりAndroid.jar(たとえばEclipse)、ただし、実行はデバイスまたはエミュレーターで実行する必要があります。

Android SDKのパブリックAPIは、@{hide} javadoc注釈が接頭辞として付けられたnotクラス/メソッド/フィールドによって定義されます。 not注釈付きはSDKに含まれています。

Android.jarは、out/target/common/obj/Java_LIBRARIES/Android_stubs_current_intermediatesにあるソースからビルドされます。ソースは、build/tools/droiddocにあるツールDroidDocによって生成されます。

DroidDocは、実際のAndroid SDKドキュメンテーション。おそらく副作用として、おそらくすべてのjavadocを解析すると、Androidスタブが生成されます。このスタブは、SDKで配布されるAndroid.jarにコンパイルされます。

したがって、非表示のものを含めるには、特定の部分のみを含める場合は、@hide注釈を削除してSDKを再構築します。

ただし、すべての隠された部分を含める場合は、さらに複雑になります。 DroidDoc(関連するソースはbuild/tools/droiddoc/src/Stubs.Javaにあります)を変更して、非表示として何も検出されないようにすることができます。これは非常に簡単で、これを試しましたが、生成されるスタブはまったくコンパイルされません。

これまでの私の結論は、これは単に実行可能ではないということです。隠された注釈を検出するDroidDocの部分を削除した場合に生成されるスタブは、単にコンパイルできず、正しくコンパイルするにはかなりの作業が必要になります。

だからあなたの質問に対する私の答えは:いいえ、これは多くの仕事をしないとできません。ごめんなさい。


mkstubsツールに関する補足事項。 mkstubsは、SDKアドオンを構築するときに使用されます。つまり、AndroidベンダーのSDKマネージャー、たとえばSamsungが提供するアドオンサムスンの携帯電話専用の追加API mkstubsは、DroidDocスタブ生成プロセスとほぼ同じですが、@hide注釈を使用せず、どのパッケージ/クラス/フィールドを含めるか、または除外するかを説明する.defsファイルを使用しますSDKアドオン。

ただし、Android SDKビルドはnotmkstubsツールを使用しないため、これは質問とは無関係です(残念ながら)

40

Androidプラットフォームから* .jarファイルを再構築できました。

まず、ADBをデバイスに接続します。次に実行します:

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

core.jarには標準のJavaライブラリ(Java.*)が含まれ、framework.jarにはAndroidライブラリ(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.jarframework-dex2jar.jarを選択してください)。

これにより、内部およびいくつかのJava 7 APIを使用できるようになります。 (私が見る限り、生成されたAPKにはJARからの実際のコードは含まれていません。)

29
kennytm

Lollipopの場合、フローはほとんど変わりません。

  1. Lollipopデバイスから/system/framework/arm/boot.oatを取得します

  2. 「Java -jar oat2dex.jar boot boot.oat」を使用します

  3. Dexとodexの2つのフォルダーを取得します。 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に名前を変更します。

ps:「framework_classes2.dex」に対して手順4〜6を繰り返す必要があります。

16
deviant

DroidCon 2011

ここでは、Sony EricsonのErik Hellmanが、非表示のAndroid APIにアクセスする方法について説明しています。

http://vimeo.com/3018039 (Hmmリンクは機能していないようです)。

DroidCon webpage Day 2 にスクロールして、Hidden APIs 10:15を使用してスクロールし、そこで見ることができます。

リンクが死んでいます!

私はこれを見つけました: http://skillsmatter.com/podcast/os-mobile-server/hidden-api dunnoそれがいつまで続くか

Android SDKの公式APIは通常、ほとんどの通常のアプリケーションに十分です。ただし、開発者が内部システムサービス、APIおよびリソースに公開されていないリソースにアクセスする必要がある場合があります。公式のAPI幸いなことに、これらのAPIはいくつかの巧妙なトリックを介して利用可能であり、Android上で新しい革新的なソリューションを開発する際に役立つことがよくあります。それらの使用法といくつかのヒントは、複数のベンダーのデバイスとAndroidバージョンで安全に制御する方法でそれらを使用する方法に関するトリックではありません。 Android:Androidプラットフォームの内部の多くの洞察を伴うかなり高度なセッションを期待してください。

15
Blundell

this を見てみてください:

これらの記事の最終的な目標は、リフレクションを使用せずに開発者に内部APIおよび非表示APIのパワーを提供することです。次のいくつかのパートで説明するすべての手順を完了すると、InternalおよびHidden APIを公開されたAPIのように使用できます。リフレクションの必要はありません。

ただし、これらの非公開APIを使用している場合は、アプリケーションが大きなリスクにさらされていることに注意する必要があります。基本的に、次のAndroid OSの更新でAPIが破損しないという保証はありません。異なるベンダーのデバイス間での一貫した動作についての保証さえありません。あなたは完全にあなた自身です。

次の3つのシナリオがあります。

  1. internalhiddenの両方のAPIを有効にします(シナリオA)
  2. 有効にするhidden API(シナリオB)
  3. 有効にする内部 API(シナリオC)

シナリオAはBとCの合計です。シナリオBは最も簡単なシナリオです(Eclipse ADTプラグインの変更は不要です)。

シナリオA:パーツの読み取り 12 、、 45

シナリオB:読み取り部分 12 、、 5

シナリオC:読み取り部分 12 、、 45

12
Zorb

変更されたAndroid.jarをダウンロードして、非表示APIとして使用できます このリポジトリ 。そこの指示に従ってください。

11
Anggrayudi H

http://source.Android.com/ からのレポチェックアウトからJavaファイルを抽出し、それを必要とせずにコンパイルするためのGroovyスクリプトをいくつか書いたことがあります。すべてのAndroidソースをコンパイルするための完全なツールチェーン。必要な他のステップ(パッケージ化、リソースの生成など)を含む。

ここにあります:

https://github.com/thoutbeckers/CollectAndroid

しかし、確かにこれは、主に設定ファイル(CollectConfig.groovy)の「rootdirs」に正しいディレクトリを設定することにより、Gingerbreadの後に更新する必要があります。

当時、私はこれを開発のために定期的に使用し、すべての隠されたAPIとソース(その時点でも問題があります)を利用できました。

他の場所で述べたように、com/Android/internal/**は、アクセスルールが追加されているため、ADTの最近のバージョンでは引き続き非表示になります。

1
thoutbeckers

ロングの答え 私のために働いたが、私はまだ必要ないくつかのクラス、特にAndroid.provider.Telephonyが欠けていました。次のように追加できました。

  1. クラスの場所を見つける

    $ 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
    
  2. 新しいクラスを追加し、フレームワークJARファイルを再構築します

    cd /path/to/temp/folder
    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 .
    

または、単に怠け者にして、すべてのクラスを1つの巨大なjarファイルに含めることができます。

cd /path/to/temp/folder
cp -r /path/to/out/target/common/obj/Java_LIBRARIES/*/classes .
cd classes
jar cvf ../framework.jar .
0
bmaupin

私はコメントできませんが、これは基本的に@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。*は使用できません)

次に、1つの可能な解決策は、/ system/framework/framework2.jarに同じメソッドを適用することです。 Android SDK19のエミュレーターを使用します。この追加のjarファイルがあります。HTCOneにはframework3.jarもあります。

0
Rolf