USB権限など、アプリケーションでシステム関連の権限を使用する必要がある場合があります。独自のアプリケーションのプロセスとシステムプロセスが同じUIDである場合、デフォルトでこの権限が付与されるため、によって付与される必要はありません。多くの場合、それははるかに便利になります。私が最近取り組んでいるプロジェクトのほとんどは、このアクセス許可を使用しています。システム時刻の変更、hiddenメソッドの呼び出し、システムのシャットダウンと再起動、アプリケーションのサイレントインストール、アップグレード、アンインストールなど。最初に、アクセス許可を直接追加します。エラーが報告された場合、シミュレーターまたは実マシンに関係なく、logcatで常に「アラームドライバーを開くことができません:アクセスが拒否されました」が表示されます。この関数を使用するには、root権限が必要であるか、システムプロセスで実行されます。 。
長い間オンラインで検索した後、私はそれを解決する2つの方法があることに気づきました。
1つは、Androidシステムのソースコードの環境でmakeを使用してコンパイルすることです。
1.属性android:sharedUserId = "android.uid.system"をアプリケーションのAndroidManifest.xmlのマニフェストノードに追加します。
2. Android.mkファイルを変更し、行LOCAL_CERTIFICATE:= platformを追加します
3. mmコマンドを使用してコンパイルすると、生成されたapkにシステム時刻を変更する権限が与えられます。
このメソッドは.mkでコンパイルできないため、2番目のメソッドを参照する必要があり
ます。1。属性android:sharedUserId = "android.uid.system"を追加します。
2. eclipseを使用して署名されていないapkファイルをコンパイルしますが、このapkファイルは使用できません。
3.ターゲットシステムのプラットフォームキーを使用して、apkファイルに再署名します。
この手順はもっと面倒です。最初にキーファイルを見つけます。Androidのソースコードディレクトリ内の場所は「build / target / product / security」です。
次の2つのファイルは、platform.pk8とplatform.x509.pemです。次に、Androidが提供するSignapkツールを使用して署名します。
signapkのソースコードは「build / tools / signapk」の下にあり、使用法は「signapk platform.x509.pem platform.pk8input.apkoutput.apk」です。
ファイル名は、絶対パスを使用して見つからないようにするのが最適です。または、ソースコードを変更して直接使用することもできます。このように、最終的なapkは最初の方法と同じです。
最後に、原則を説明し、最初に属性android:sharedUserId = "android.uid.system"を追加します。
共有ユーザーIDを使用すると、同じユーザーIDを持つ複数のAPKを同じプロセスで実行するように構成できます。
次に、プログラムのUIDをandroid.uid.systemに一致させます。つまり、プログラムをシステムプロセスで実行させて、システム時刻を変更する権限を付与します。
UIDを追加するだけでは不十分です。この時点でAPKがインストールされていると、APKをインストールできず、署名が一致しないことがわかります。
その理由は、システムプロセスで実行するプログラムには、ターゲットシステムのプラットフォームキーもあるためです。これは、上記の2番目の方法で説明した2つのファイルplatform.pk8とplatform.x509.pemです。
これらの2つのキーで署名した後、apkを実際にシステムプロセスに入れることができます。LOCAL_CERTIFICATE:=プラットフォームを最初のメソッドに追加すると、実際にはこれら2つのキーを使用して署名します。
また、この方法で生成されたプログラムは、元のAndroidシステムまたは自分でコンパイルしたシステムでしか使用できないという問題もあります。このようなシステムは2つのファイルplatform.pk8とplatform.x509.pemを取得できるためです。
他社製のAndroidもインストールできない場合。元のAndroidのキーに署名してみてください。プログラムはエミュレーターで実行されますが、G3にインストールすると、「パッケージ...には共有ユーザーandroid.uid.systemの署名と一致する署名がありません」というプロンプトが直接表示されるため、システムのセキュリティを保護します。
最後に、android:sharedUserId属性は、apkをシステムプロセスに配置するだけでなく、1つのプロセスで実行するように複数のAPKを構成することもできます。
データの共有は役立つはずです。
UIDとは
ご存知のとおり、PidはプロセスID、UidはユーザーIDですが、Androidはコンピューターと同じではありません。各コンピューターユーザーには、プログラムを開始するユーザー、このプログラムのUidがそのユーザー、およびAndroidのすべてのプログラムにはUidがあります。デフォルトでは、Androidは各プログラムに異なる一般レベルのUidを割り当てます。互いに呼び出すと、Uidのみが同じになります。これにより、共有データにある程度のセキュリティ。ソフトウェア間でデータを任意に取得することはできません。
独自のアプリケーションUIDをシステムプロセスのUIDに設定します
システムプロセスUIDには次の3つのタイプがあります。
- android:sharedUserId = "android.uid.system"
- android:sharedUserId = "android.uid.shared"
- android:sharedUserId = "android.media"
ここで最初の実装を試してみましょう。他の2つの実装は同じですが、
UIDを宣言する
まず、マニフェストでアプリケーションのUIDを宣言する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.izis.chessdeskrobot"
android:sharedUserId="android.uid.system"
>
...
</manifest>
シグネチャーパッケージ
署名パッケージの前提条件は、システム署名ファイルを持っていることです。これは通常、ソースコードのbuild / target / product / securityディレクトリにあり、一部のメーカーのカスタムシステムは他のディレクトリにあります。たとえば、Nanopc3 I使用は次のディレクトリにあり、グローバルに検索できます。最初はビルドディレクトリも使用しましたが、パッケージ化後にインストールできませんでした。その後、/(ㄒoㄒ)もあることがわかりました。ベンダーディレクトリの/ ~~:
アップロード中...再アップロードがキャンセルされましたアップロード中...再アップロードがキャンセルされました
署名file.png
その中で、android:sharedUserId = "android.uid.system"は、platform.pk8とplatform.x509.pemの2つのファイルに対応します。
システム署名をインポートする一般的な3つの方法は次のとおりです。
- 生成されたapkに再署名します
- アプリケーション自体の署名ファイルに再署名します
- mkファイルからコンパイル
すでにapkを持っています
生成されたapkファイルは、ソースコード/ out / host / linux-x86 / frameworkディレクトリのsignapk.jarファイルから次のコマンドで再署名できます。
java -jar signapk.jar platform.x509.pem platform.pk8 my.apk new.apk
この命令を使用するときは、signapk.jar、platform.x509.pem、platform.pk8、およびmy.apkの4つのファイルが同じパスにある必要があることに注意してください。そうでない場合は、自分でパスを変更する必要があります。
署名を再生成します
独自のキーファイルを生成した後、keytool-importkeypairツールを使用して、次のコマンドを使用して署名を再生成します。
keytool-importkeypair -k demo.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias demo
- demo.jks:署名ファイル
- 123456:署名ファイルのパスワード
- platform.pk8、platform.x509.pem:システム署名ファイル
- デモ:署名ファイルのエイリアス
keytool-importkeypairツールはここからダウンロードできます。
mkファイルを使用してソース環境でコンパイルする
私はmkファイルについてあまり知らないので、当分の間このメソッドをテストしていません。通常の状況では使用されませんが、結局のところ、基本的にはideツールを使用して開発されています。上記の2つの方法で十分です。必要に応じて、後で追加してください。