web-dev-qa-db-ja.com

.apkが初めてインストールされたときにサービスを開始する方法

アプリケーションにはUIパーツがないため、デバイスにApplicatonがインストールされたらすぐにサービスを開始する必要があります。答えは不可能だというリンクがたくさんありましたが、きっと可能だと思います。 PlanB をご覧くださいAndroidマーケットは私の要件を満たしています。以下は私のマニフェストファイルです。しかし、サービスはまったく呼び出されませんでした。 。それで、アプリケーションがインストールされたときにサービスを開始するための最良の方法は何か教えてください。

[〜#〜] update [〜#〜]

また、Android.intent.action.PACKAGE_ADDEDそれは、他のアプリケーションのパッケージを検出するために正常に動作しますが、それ自体では検出しません。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.auto.start"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk Android:minSdkVersion="8" />
    <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
        Android:icon="@drawable/ic_launcher" >

        <service Android:name=".MyService">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </service>

        <receiver Android:name=".BootUpReceiver">
            <intent-filter>
                <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
                <category Android:name="Android.intent.category.DEFAULT"/>
                <action Android:name="Android.intent.action.PACKAGE_INSTALL" />
                <action Android:name="Android.intent.action.PACKAGE_ADDED" />
                <data Android:scheme="package"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>
67
Lalit Poptani

幸いなことに、プランBは、XOOMとGalaxy Nexusでテストされているように、Android 3.1+では動作しません。

プランBが行うことは、ドライブバイマルウェアによって使用される可能性のあるセキュリティホールを悪用することです。これが、特にAndroidがそれを防止する理由です。


[〜#〜] update [〜#〜]

明確にするために:inazarukが投稿し、他の回答にコメントを入れると、すべてのアプリケーションはインストール時に「停止」状態になります。これは、ユーザーが設定アプリケーションからアプリを強制停止した後、アプリケーションが終了するのと同じ状態です。この「停止」状態では、アクティビティの手動起動による場合を除き、アプリケーションは何らかの理由で実行されません。特に、ユーザーがアプリを手動で実行するまで、登録したイベントに関係なく、BroadcastReceviersは呼び出されません。

このブロックは、以前に利用していたリモートインストールと実行のプランBシナリオを対象としています。結局のところ、ハッキングされたGoogleアカウントを持っている人は、デバイスが感染する危険性があります。

だから、OPが言うとき:

Applicatonがデバイスにインストールされたらすぐにサービスを開始する必要があります

oPは失敗し、アプリケーションを再設計して、この「必要性」を回避する必要があります。

78
CommonsWare

/ systemパーティションにインストールされたアプリケーションは、インストール後に「停止」状態になることはありません。ルートがあれば、できます、

$ adb root
$ adb remount
$ adb Push your.apk /system/app

また、ブロードキャストインテントをすぐに受信できます。これは確かに汎用的なソリューションを提供するものではありませんが、完全を期すために言及したいと思いました。

編集:Androidの異なるバージョンでシステムAPKを見つけます。たとえば、Android 8は/ system/app //の下に置きます。 apk。デバイスにシェル接続し、他のシステムAPKで使用されているのと同じスキームをたどります。

17

CommonsWareの質問に対する答えに同意します: インストール時にAndroidサービスを開始する方法 。つまり、インストールしたばかりのサービスを自動的に開始することはできません。

新しいAndroidプラットフォームに関するもう1つのこと:UIがまったくない場合、Android 3.1でBOOT_COMPLETEインテントを使用してもサービスの開始に問題が発生します+。

これは、インストールされているすべてのアプリケーションが停止状態にあるためです。この状態では、アプリケーションはブロードキャスト通知を受信しません。

アプリケーションをアクティブにするには、他のアプリケーション(またはユーザー)がサービスまたはアクティビティ、またはコンテンツプロバイダーを開始する必要があります。通常のワークフローでは、ユーザーがアプリケーションのアイコンをクリックします。

これについての詳細な説明を ブログ投稿 に書きました。

14
inazaruk

プランBは、システムで発生するイベントをリッスンすることにより、この起動を行います。そのうちのいくつかが最終的に起動することを期待して、文字通り何百ものイベントをリッスンするレシーバーを使用します。これがあなたのやり方です。それ以外の場合、アプリケーションがインストールされるとすぐにアプリケーションを起動する組み込みの手段はありません。

5
Malcolm

制約/目的がわからないが、アクティビティがある別のアプリケーションをインストールできる場合、フラグ FLAG_INCLUDE_STOPPED_PACKAGES でインテントを送信することができます。

これにより、アプリケーションが停止状態であっても、意図の解決に使用されます。インテントのアクションがフィルターのいずれかに一致する場合、パッケージも停止状態から復帰します。

5
Xiao

デバイスにアプリケーションをインストールした直後にサービスを開始できるとは思わない

アプリケーションは、最初に何らかのActivityを介してユーザーが呼び出す必要があります。登録する必要があるのはBroadcast Receiverデバイスで何かが起こっているときにサービスを呼び出すマニフェスト内の適切なインテントを使用しますが、これはAndroid 3.1バージョンに残ります。

編集:

Android 3.1 +以降は、デバイスの起動とユーザーが呼び出す必要のあるアプリケーションの起動後、すべてのアプリケーションが非アクティブ状態のままになるため、アプリケーションの起動にBroadcastを使用できません(アプリのアイコンをタッチして)。

3
user370305

おそらくこれを達成するための最良の方法は(そして今、私はOPの特定の意図に話をしています。これは、一般的な質問ではなく、盗まれた電話を取得するためにインストールされるプログラムです)、ソフトウェアエンジニアリングではなく、ソーシャルエンジニアリングです。

そのため、ホーム画面に突然表示された「パスワードリスト」や「マイバンクアカウント」などのテキストが付いたアイコンは、間違いなくクリックされます。あらゆる種類の他のフィッシングの成功を見てください。ここでは、泥棒を狙っています。泥棒は、すでに不正な活動を続けようとしています。泥棒があなたのためにそれを始めましょう。 :)

1
Anders8

CommonsWareの この質問への答え (あなたは見たことがあると思いますが、無視することを選択した)で述べたように、インストール時にサービスを開始することはできません-それは単に実装されたものではありませんプラットフォームに。

ただし、次回起動時に自動的に起動することは可能です。

PlanBの技術詳細に記載されているとおり:

プランBは、ダウンロードするとすぐに起動を試みますが、場合によってはSMSを送信して開始する必要があります。

私の推測では、ルート化された電話では、mightがインストール時にServiceを開始できる可能性があります-しかし、電話が保証されるわけではありませんこれは、アプリのIntentFilterによって登録され、Serviceを開始するために使用できるため、PlanBが場合によってはテキストを受信する必要がある理由です。

1
kaspermoerch

google Playにアプリがあります Android Lost バージョン3.0以降では、アプリを一度も起動せずに着信SMS経由でGoogleプッシュメッセージの登録サービスを呼び出します。

1
test