{"id":19682330,"url":"https://github.com/flyskywhy/app_watchdogd","last_synced_at":"2026-03-05T07:01:50.292Z","repository":{"id":146587451,"uuid":"500715909","full_name":"flyskywhy/app_watchdogd","owner":"flyskywhy","description":"An app_watchdogd.sh to keep an eye on app with rooted Android and restart it if it crashes","archived":false,"fork":false,"pushed_at":"2022-06-21T09:05:59.000Z","size":3,"stargazers_count":2,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-06T20:41:08.112Z","etag":null,"topics":["activity","android","app","app-watchdogd","crashed","killed","mainactivity","oom","oom-adj","react-native","react-native-android-shell","relaunch","restart","root","shell","supersu","watchdogd"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flyskywhy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-07T06:25:43.000Z","updated_at":"2025-03-10T05:24:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"fa251d55-353b-42d4-96af-dd8dd84ffd47","html_url":"https://github.com/flyskywhy/app_watchdogd","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/flyskywhy/app_watchdogd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyskywhy%2Fapp_watchdogd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyskywhy%2Fapp_watchdogd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyskywhy%2Fapp_watchdogd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyskywhy%2Fapp_watchdogd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flyskywhy","download_url":"https://codeload.github.com/flyskywhy/app_watchdogd/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flyskywhy%2Fapp_watchdogd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30113111,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T03:40:26.266Z","status":"ssl_error","status_checked_at":"2026-03-05T03:39:15.902Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["activity","android","app","app-watchdogd","crashed","killed","mainactivity","oom","oom-adj","react-native","react-native-android-shell","relaunch","restart","root","shell","supersu","watchdogd"],"created_at":"2024-11-11T18:10:21.989Z","updated_at":"2026-03-05T07:01:50.268Z","avatar_url":"https://github.com/flyskywhy.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# app_watchdogd\n`app_watchdogd.sh` is used to automatically relaunch an Android APP which is killed or crashed.\n\n`app_watchdogd.sh` can be run in `/data/data/com.domain.appname/files/` or `/system/xbin/` .\n\nIf run `app_watchdogd.sh` without `su -c` , even your device is rooted, `adb shell cat /proc/APP_WATCHDOG_SH_PID/oom_adj` will not be `-17` but `0`, Android system will kill `app_watchdogd.sh` process if not smaller than `0` when memory is low, so you need\n\n    su -c /data/data/com.domain.appname/files/app_watchdogd.sh \u0026\n\nand this one line command above is obviously better than\n\n    /data/data/com.domain.appname/files/app_watchdogd.sh \u0026\n    manually find APP_WATCHDOG_SH_PID with `ps | grep /system/bin/sh | grep -c poll_sched)`\n    su -c echo -12 \u003e /proc/APP_WATCHDOG_SH_PID/oom_adj\n    su -c chmod -r /proc/APP_WATCHDOG_SH_PID/oom_adj\n\n## Usage\nFor sure your device\n\n* rooted\n* [install-supersu](https://github.com/flyskywhy/install-supersu)\n\n### shell test\n* $1 pkg_or_kill: pkg e.g. `com.domain.appname` means enable watchdogd; or just `kill` means disable watchdogd\n* $2 activity: e.g. `MainActivity` if pkg; null if kill\n* $3 timeout_sec: e.g. `5` if pkg; null if kill\n\n```\nadb remount\nadb push app_watchdogd.sh system/xbin/\nadb shell su -c system/xbin/app_watchdogd.sh com.domain.appname MainActivity 5 \u0026\nadb shell su -c system/xbin/app_watchdogd.sh kill\n```\n\n### react-native APP\nCopy as `android/app/src/main/assets/app_watchdogd.sh` .\n\n`utils.js` :\n```\nimport AndroidShell from '@flyskywhy/react-native-android-shell';\n\nexport function enableAppWatchdogd({\n  shPath = '/system/xbin/app_watchdogd.sh',\n  pkg,\n  activity = 'MainActivity',\n  timeoutSec = 5,\n}) {\n  AndroidShell.executeCommand(\n    'su -c ' + shPath + ' ' + pkg + ' ' + activity + ' ' + timeoutSec + ' \u0026',\n    () =\u003e {},\n  );\n}\n\nexport function disableAppWatchdogd({\n  shPath = '/system/xbin/app_watchdogd.sh',\n  callback = () =\u003e {},\n}) {\n  AndroidShell.executeCommand('su -c ' + shPath + ' kill', callback);\n}\n```\n\n`Navigation.js` :\n```\nif (Platform.OS !== 'web') {\n  var RNFS = require('react-native-fs');\n}\nimport AndroidShell from '@flyskywhy/react-native-android-shell';\nimport RNExitApp from 'react-native-exit-app';\nimport * as utils from '../utils';\n\nconst shPath = `${RNFS.DocumentDirectoryPath}/app_watchdogd.sh`;\n\nclass Navigation extends Component {\n\n...\n\n  componentDidMount() {\n    this.enableAppWatchdogd();\n  }\n\n  enableAppWatchdogd = async () =\u003e {\n    if (Platform.OS === 'android') {\n      if (!(await RNFS.exists(shPath))) {\n        await RNFS.copyFileAssets('app_watchdogd.sh', shPath); // /data/data/com.domain.appname/files/app_watchdogd.sh\n      }\n\n      AndroidShell.executeCommand(\n        'su -c dumpsys window | grep mCurrentFocus',\n        (activity) =\u003e {\n          let a = activity\n            .replace(/\\n/, '')\n            .replace(/^.* .* /, '')\n            .replace('}', ''); // com.domain.appname/com.domain.appname.MainActivity\n          let pkg = a.replace(/\\/.*/, ''); // com.domain.appname\n          utils.enableAppWatchdogd({ // if APP exit abnormally (killed or crashed), will be relaunched\n            shPath,\n            pkg,\n          });\n        },\n      );\n\n      // above have a small bug: after adb install then first launch, pkg could be `com.android.systemui` (from mCurrentFocus)\n      // below works well if you can `import {applicationId} from 'expo-application'`\n      // utils.enableAppWatchdogd({ // if APP exit abnormally (killed or crashed), will be relaunched\n      //   shPath,\n      //   pkg: applicationId,\n      // });\n    }\n  };\n\n  onBackPress = async () =\u003e {\n    if (USER_PRESS_ANDROID_BACK_KEY_TWICE) {\n      if (Platform.OS === 'android') {\n        utils.disableAppWatchdogd({ // if APP exit normally (by user), will disable watchdogd\n          shPath,\n          callback: RNExitApp.exitApp,\n        });\n      } else {\n        RNExitApp.exitApp();\n      }\n    }\n  };\n\n...\n\n}\n```\n\n### pure Android APP\nCopy as `android/app/src/main/assets/app_watchdogd.sh` when building, save as `/data/data/com.domain.appname/files/app_watchdogd.sh` when running, then `su -c /data/data/com.domain.appname/files/app_watchdogd.sh \u0026` from Java.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflyskywhy%2Fapp_watchdogd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflyskywhy%2Fapp_watchdogd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflyskywhy%2Fapp_watchdogd/lists"}