diff --git a/src/bio.c b/src/bio.c
index 295850046..2a2185c32 100644
--- a/src/bio.c
+++ b/src/bio.c
@@ -399,7 +399,11 @@ void bioKillThreads(void) {
 
     for (j = 0; j < BIO_WORKER_NUM; j++) {
         if (bio_threads[j] == pthread_self()) continue;
+#ifndef __ANDROID__
         if (bio_threads[j] && pthread_cancel(bio_threads[j]) == 0) {
+#else
+        if (bio_threads[j] && pthread_kill(bio_threads[j], SIGUSR2) == 0) {
+#endif
             if ((err = pthread_join(bio_threads[j],NULL)) != 0) {
                 serverLog(LL_WARNING,
                     "Bio worker thread #%lu can not be joined: %s",
diff --git a/src/debug.c b/src/debug.c
index 4ff7da7e7..63405a2b5 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -2283,7 +2283,11 @@ int memtest_test_linux_anonymous_maps(void) {
 
 static void killMainThread(void) {
     int err;
+#ifndef __ANDROID__
     if (pthread_self() != server.main_thread_id && pthread_cancel(server.main_thread_id) == 0) {
+#else
+    if (pthread_self() != server.main_thread_id && pthread_kill(server.main_thread_id, SIGUSR2) == 0) {
+#endif
         if ((err = pthread_join(server.main_thread_id,NULL)) != 0) {
             serverLog(LL_WARNING, "main thread can not be joined: %s", strerror(err));
         } else {
diff --git a/src/iothread.c b/src/iothread.c
index 27d533923..ffe98fcfd 100644
--- a/src/iothread.c
+++ b/src/iothread.c
@@ -796,7 +796,11 @@ void killIOThreads(void) {
     int err, j;
     for (j = 1; j < server.io_threads_num; j++) {
         if (IOThreads[j].tid == pthread_self()) continue;
+#ifndef __ANDROID__
         if (IOThreads[j].tid && pthread_cancel(IOThreads[j].tid) == 0) {
+#else
+        if (IOThreads[j].tid && pthread_kill(IOThreads[j].tid, SIGUSR2) == 0) {
+#endif
             if ((err = pthread_join(IOThreads[j].tid,NULL)) != 0) {
                 serverLog(LL_WARNING,
                     "IO thread(tid:%lu) can not be joined: %s",
diff --git a/src/server.c b/src/server.c
index 41607356d..501cb3833 100644
--- a/src/server.c
+++ b/src/server.c
@@ -2756,12 +2756,27 @@ void resetServerStats(void) {
     lazyfreeResetStats();
 }
 
+#ifdef __ANDROID__
+static void threadSignalHandler(int signum) {
+    pthread_exit(0);
+}
+#endif
+
 /* Make the thread killable at any time, so that kill threads functions
  * can work reliably (default cancelability type is PTHREAD_CANCEL_DEFERRED).
  * Needed for pthread_cancel used by the fast memory test used by the crash report. */
 void makeThreadKillable(void) {
+#ifndef __ANDROID__
     pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
     pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+#else
+    struct sigaction actions;
+    memset(&actions, 0, sizeof(actions));
+    sigemptyset(&actions.sa_mask);
+    actions.sa_flags = 0;
+    actions.sa_handler = threadSignalHandler;
+    sigaction(SIGUSR2, &actions, NULL);
+#endif
 }
 
 void initServer(void) {
