У меня есть приложение, написанное на C / C ++, которое должно запускаться каждый раз, когда система загружается / перезагружается.Какой самый простой способ добиться этого? - PullRequest
0 голосов
/ 11 июня 2019

Все, у меня есть простое приложение командной строки, которое я написал с использованием NDK.Это приложение написано на C. Мне нужно запускать его каждый раз, когда загружается мое устройство Android.Устройство работает под управлением Android 7.

Я ищу самый простой способ добиться этого.Должен ли я написать приложение для Android для этого?В дни Linux я мог просто добавить его в init.rc или каким-либо другим методом или начать как демон и покончить с этим.

Я уже пытался написать службу Android, которую я строю как APK.Этот сервис для Android использует BroadCastReceiver для подписки на BOOT_EVENT_COMPLETED.Служба onCommandStart () вызывается, и в этот момент я вызываю метод JNI для вызова system () с путем к моему исполняемому файлу.Я думаю, что вызов system () не удался, потому что у приложения нет корневых разрешений.

Я знаю, что служба запускается, потому что у меня есть вызовы Log.v (), и я вижу это в Logcat.Я знаю, что метод JNI вызывается, потому что тот же метод JNI возвращает строку, которую я использую в качестве заголовка окна приложения Android, и это работает.

Если я запускаю свое приложение из оболочки adb, выполняя adb root, а затемadb shell / data / тоже работает

Мне просто нужно запускать собственное приложение всякий раз, когда система загружается или перезагружается по любой причине.

=============================================================================== Вот вывод команды ls -l в приложении при запуске из оболочки adb.Приложение находится в / data

-rwxrwxrwx 1 root root 19512 2019-06-08 14: 12

Вот код для приложения Android.Кстати, OnReceive () вещательного приемника также не вызывается.

Это код для MainActivity.java.Это деятельность.Я просто добавил вызов метода JNI здесь.Это вызывается, когда строка возвращается методом C ++, который используется в заголовке.Это работает.Вызов для запуска приложения также находится в методе C ++, который находится в конце

package com.rk.startonboot;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.util.*;


public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService(new Intent(this, MyService.class));

        Log.d("RKService", "RKService");

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

This is the code for the service. I was planning to use this to call the C++ method eventually

package com.rk.startonboot;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.*;

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //TODO write your own code

        Log.v("RKServiceLog", "RKServiceLog");

        return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        //TODO for communication return IBinder implementation
        return null;
    }
}

This is the code for the receiver

package com.rk.startonboot;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.*;

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //TODO write your own code

        Log.v("RKServiceLog", "RKServiceLog");

        return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        //TODO for communication return IBinder implementation
        return null;
    }
}

This is the manifest file (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.rk.startonboot">

    <dist:module dist:instant="true" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyService" />

        <receiver
            android:name="com.rk.startonboot.StartMyServiceAtBootReceiver"
            android:exported="true"
            android:enabled="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
            android:label="StartMyServiceAtBootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

Вот код C ++.

include

include

extern "C" JNIEXPORT jstring JNICALL Java_com_rk_startonboot_MainActivity_stringFromJNI (JNIEnv * env, jobject / * this * /) {std :: string hello = "Привет из LedStrip";Система ( "/ данные / ledstrip");return env-> NewStringUTF (hello.c_str ());}

1 Ответ

0 голосов
/ 11 июня 2019

Это может быть НЕ ROOTED!

Попробуйте использовать автозапуск в Google PlayStore.https://play.google.com/store/apps/details?id=com.autostart

Это также очень легко понять.Если вы хотите больше, перейдите на эту страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...