Android SDK(またはAndroid.jarのみ))を再構築して、非表示および内部APIを含めます。
私はこれをどうやって進めるかについての文書や議論を見つけることができませんでした。 cm7をビルドできるUbuntu CyanogenModビルド環境が既にセットアップされています。
Make SDKがSDKをビルドすることを読みましたが、@ hideを使用して非表示としてマークされているメソッドとフィールドを含むSDKをビルドしたいと思います。これは可能ですか?
私がしたいことは、隠されたAPIを使用するアプリケーションに変更を加え、それを再構築するために、変更されたSDKを使用したいことです。
これは、非表示のAPIを使用するために常に行うことです。
私はこれについて調査しましたが、私の結論は単純です:これはかなりの労力なしではできません。私が見つけたものの詳細についてはこの回答の残りを読んでください。
Android.jar
は、実際には、デバイス上のframework.jar
にあるcore.jar
とsystem/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
ツールを使用しないため、これは質問とは無関係です(残念ながら)
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.jar
とframework-dex2jar.jar
を選択してください)。これにより、内部およびいくつかのJava 7 APIを使用できるようになります。 (私が見る限り、生成されたAPKにはJARからの実際のコードは含まれていません。)
Lollipopの場合、フローはほとんど変わりません。
Lollipopデバイスから/system/framework/arm/boot.oatを取得します
「Java -jar oat2dex.jar boot boot.oat」を使用します
ps:「framework_classes2.dex」に対して手順4〜6を繰り返す必要があります。
ここでは、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プラットフォームの内部の多くの洞察を伴うかなり高度なセッションを期待してください。
this を見てみてください:
これらの記事の最終的な目標は、リフレクションを使用せずに開発者に内部APIおよび非表示APIのパワーを提供することです。次のいくつかのパートで説明するすべての手順を完了すると、InternalおよびHidden APIを公開されたAPIのように使用できます。リフレクションの必要はありません。
ただし、これらの非公開APIを使用している場合は、アプリケーションが大きなリスクにさらされていることに注意する必要があります。基本的に、次のAndroid OSの更新でAPIが破損しないという保証はありません。異なるベンダーのデバイス間での一貫した動作についての保証さえありません。あなたは完全にあなた自身です。
次の3つのシナリオがあります。
- internalとhiddenの両方のAPIを有効にします(シナリオA)
- 有効にするhidden API(シナリオB)
- 有効にする内部 API(シナリオC)
シナリオAはBとCの合計です。シナリオBは最も簡単なシナリオです(Eclipse ADTプラグインの変更は不要です)。
変更されたAndroid.jar
をダウンロードして、非表示APIとして使用できます このリポジトリ 。そこの指示に従ってください。
http://source.Android.com/ からのレポチェックアウトからJavaファイルを抽出し、それを必要とせずにコンパイルするためのGroovyスクリプトをいくつか書いたことがあります。すべてのAndroidソースをコンパイルするための完全なツールチェーン。必要な他のステップ(パッケージ化、リソースの生成など)を含む。
ここにあります:
https://github.com/thoutbeckers/CollectAndroid
しかし、確かにこれは、主に設定ファイル(CollectConfig.groovy)の「rootdirs」に正しいディレクトリを設定することにより、Gingerbreadの後に更新する必要があります。
当時、私はこれを開発のために定期的に使用し、すべての隠されたAPIとソース(その時点でも問題があります)を利用できました。
他の場所で述べたように、com/Android/internal/**は、アクセスルールが追加されているため、ADTの最近のバージョンでは引き続き非表示になります。
ロングの答え 私のために働いたが、私はまだ必要ないくつかのクラス、特にAndroid.provider.Telephonyが欠けていました。次のように追加できました。
クラスの場所を見つける
$ 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
新しいクラスを追加し、フレームワーク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 .
私はコメントできませんが、これは基本的に@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もあります。