Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
b3b2149e
Commit
b3b2149e
authored
Feb 05, 2017
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Optimize root shell and startups
parent
0886dca3
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
85 additions
and
97 deletions
+85
-97
Global.java
app/src/main/java/com/topjohnwu/magisk/Global.java
+31
-10
SplashActivity.java
app/src/main/java/com/topjohnwu/magisk/SplashActivity.java
+14
-11
BootReceiver.java
...ain/java/com/topjohnwu/magisk/receivers/BootReceiver.java
+8
-17
Async.java
app/src/main/java/com/topjohnwu/magisk/utils/Async.java
+10
-37
Shell.java
app/src/main/java/com/topjohnwu/magisk/utils/Shell.java
+10
-8
Utils.java
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
+12
-14
No files found.
app/src/main/java/com/topjohnwu/magisk/Global.java
View file @
b3b2149e
...
...
@@ -13,6 +13,7 @@ import com.topjohnwu.magisk.utils.Shell;
import
com.topjohnwu.magisk.utils.Utils
;
import
com.topjohnwu.magisk.utils.ValueSortedMap
;
import
java.io.File
;
import
java.util.List
;
public
class
Global
{
...
...
@@ -37,13 +38,6 @@ public class Global {
public
static
List
<
String
>
blockList
;
public
static
List
<
ApplicationInfo
>
appList
;
public
static
List
<
String
>
magiskHideList
;
public
static
void
clear
()
{
repoMap
=
null
;
moduleMap
=
null
;
blockList
=
null
;
appList
=
null
;
magiskHideList
=
null
;
}
}
public
static
class
Events
{
public
static
final
CallbackHandler
.
Event
blockDetectionDone
=
new
CallbackHandler
.
Event
();
...
...
@@ -66,6 +60,29 @@ public class Global {
public
static
int
suResponseType
;
public
static
int
suNotificationType
;
}
public
static
void
init
(
Context
context
)
{
SharedPreferences
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
context
);
Configs
.
isDarkTheme
=
prefs
.
getBoolean
(
"dark_theme"
,
false
);
Configs
.
devLogging
=
prefs
.
getBoolean
(
"developer_logging"
,
false
);
Configs
.
shellLogging
=
prefs
.
getBoolean
(
"shell_logging"
,
false
);
Configs
.
magiskHide
=
prefs
.
getBoolean
(
"magiskhide"
,
false
);
updateMagiskInfo
();
initSuAccess
();
initSuConfigs
(
context
);
// Initialize prefs
prefs
.
edit
()
.
putBoolean
(
"dark_theme"
,
Configs
.
isDarkTheme
)
.
putBoolean
(
"magiskhide"
,
Configs
.
magiskHide
)
.
putBoolean
(
"busybox"
,
Utils
.
commandExists
(
"busybox"
))
.
putBoolean
(
"hosts"
,
new
File
(
"/magisk/.core/hosts"
).
exists
())
.
putBoolean
(
"disable"
,
Utils
.
itemExist
(
MAGISK_DISABLE_FILE
))
.
putString
(
"su_request_timeout"
,
String
.
valueOf
(
Configs
.
suRequestTimeout
))
.
putString
(
"su_auto_response"
,
String
.
valueOf
(
Configs
.
suResponseType
))
.
putString
(
"su_notification"
,
String
.
valueOf
(
Configs
.
suNotificationType
))
.
putString
(
"su_access"
,
String
.
valueOf
(
Configs
.
suAccessState
))
.
apply
();
}
public
static
void
initSuConfigs
(
Context
context
)
{
SharedPreferences
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
context
);
...
...
@@ -85,7 +102,7 @@ public class Global {
if
(
Utils
.
isValidShellResponse
(
ret
))
Configs
.
suAccessState
=
Integer
.
parseInt
(
ret
.
get
(
0
));
else
{
Shell
.
su
(
"setprop persist.sys.root_access 3"
);
Shell
.
su
(
true
,
"setprop persist.sys.root_access 3"
);
Configs
.
suAccessState
=
3
;
}
}
...
...
@@ -105,8 +122,12 @@ public class Global {
}
}
ret
=
Shell
.
sh
(
"getprop ro.magisk.disable"
);
if
(
Utils
.
isValidShellResponse
(
ret
))
Info
.
disabled
=
Integer
.
parseInt
(
ret
.
get
(
0
))
!=
0
;
try
{
Info
.
disabled
=
Utils
.
isValidShellResponse
(
ret
)
&&
Integer
.
parseInt
(
ret
.
get
(
0
))
!=
0
;
}
catch
(
NumberFormatException
e
)
{
Info
.
disabled
=
false
;
}
}
}
app/src/main/java/com/topjohnwu/magisk/SplashActivity.java
View file @
b3b2149e
...
...
@@ -13,16 +13,15 @@ public class SplashActivity extends AppCompatActivity {
super
.
onCreate
(
savedInstanceState
);
// Start all async tasks
new
Async
.
InitConfigs
(
getApplicationContext
()){
@Override
protected
void
onPostExecute
(
Void
v
)
{
// Start main activity only after configs are loaded
Intent
intent
=
new
Intent
(
getApplicationContext
(),
MainActivity
.
class
);
startActivity
(
intent
);
finish
();
}
}.
exec
();
// Init the info and configs and root shell
Global
.
init
(
getApplicationContext
());
// Start MagiskHide if not started at boot
if
(
Global
.
Configs
.
magiskHide
&&
!
Global
.
Info
.
disabled
&&
Global
.
Info
.
magiskVersion
>
10.3
)
new
Async
.
MagiskHide
().
enable
();
// Now fire all async tasks
new
Async
.
LoadApps
(
getPackageManager
()).
exec
();
new
Async
.
GetBootBlocks
().
exec
();
new
Async
.
CheckUpdates
().
exec
();
new
Async
.
LoadModules
()
{
...
...
@@ -32,6 +31,10 @@ public class SplashActivity extends AppCompatActivity {
new
Async
.
LoadRepos
(
getApplicationContext
()).
exec
();
}
}.
exec
();
new
Async
.
LoadApps
(
getPackageManager
()).
exec
();
// Preparation done, now start main activity
Intent
intent
=
new
Intent
(
getApplicationContext
(),
MainActivity
.
class
);
startActivity
(
intent
);
finish
();
}
}
app/src/main/java/com/topjohnwu/magisk/receivers/BootReceiver.java
View file @
b3b2149e
...
...
@@ -12,24 +12,15 @@ import com.topjohnwu.magisk.R;
import
com.topjohnwu.magisk.utils.Async
;
public
class
BootReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
new
Async
.
RootTask
<
Void
,
Void
,
Void
>()
{
@Override
protected
Void
doInBackground
(
Void
...
params
)
{
Global
.
initSuAccess
();
Global
.
updateMagiskInfo
();
return
null
;
}
@Override
protected
void
onPostExecute
(
Void
v
)
{
SharedPreferences
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
context
);
if
(
prefs
.
getBoolean
(
"magiskhide"
,
false
)
&&
!
Global
.
Info
.
disabled
&&
Global
.
Info
.
magiskVersion
>=
11
)
{
Toast
.
makeText
(
context
,
R
.
string
.
start_magiskhide
,
Toast
.
LENGTH_SHORT
).
show
();
new
Async
.
MagiskHide
().
enable
();
}
}
}.
exec
();
Global
.
initSuAccess
();
Global
.
updateMagiskInfo
();
SharedPreferences
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
context
);
if
(
prefs
.
getBoolean
(
"magiskhide"
,
false
)
&&
!
Global
.
Info
.
disabled
&&
Global
.
Info
.
magiskVersion
>
10.3
)
{
Toast
.
makeText
(
context
,
R
.
string
.
start_magiskhide
,
Toast
.
LENGTH_SHORT
).
show
();
new
Async
.
MagiskHide
(
true
).
enable
();
}
}
}
app/src/main/java/com/topjohnwu/magisk/utils/Async.java
View file @
b3b2149e
...
...
@@ -2,13 +2,11 @@ package com.topjohnwu.magisk.utils;
import
android.app.ProgressDialog
;
import
android.content.Context
;
import
android.content.SharedPreferences
;
import
android.content.pm.ApplicationInfo
;
import
android.content.pm.PackageManager
;
import
android.database.Cursor
;
import
android.net.Uri
;
import
android.os.AsyncTask
;
import
android.preference.PreferenceManager
;
import
android.provider.OpenableColumns
;
import
android.widget.Toast
;
...
...
@@ -51,40 +49,6 @@ public class Async {
public
static
final
String
MAGISK_HIDE_PATH
=
"/magisk/.core/magiskhide/"
;
public
static
final
String
TMP_FOLDER_PATH
=
"/dev/tmp"
;
public
static
class
InitConfigs
extends
RootTask
<
Void
,
Void
,
Void
>
{
Context
mContext
;
public
InitConfigs
(
Context
context
)
{
mContext
=
context
;
}
@Override
protected
Void
doInBackground
(
Void
...
params
)
{
SharedPreferences
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
mContext
);
Global
.
Configs
.
isDarkTheme
=
prefs
.
getBoolean
(
"dark_theme"
,
false
);
Global
.
Configs
.
devLogging
=
prefs
.
getBoolean
(
"developer_logging"
,
false
);
Global
.
Configs
.
shellLogging
=
prefs
.
getBoolean
(
"shell_logging"
,
false
);
Global
.
Configs
.
magiskHide
=
prefs
.
getBoolean
(
"magiskhide"
,
false
);
Global
.
updateMagiskInfo
();
Global
.
initSuAccess
();
Global
.
initSuConfigs
(
mContext
);
// Initialize prefs
prefs
.
edit
()
.
putBoolean
(
"dark_theme"
,
Global
.
Configs
.
isDarkTheme
)
.
putBoolean
(
"magiskhide"
,
Global
.
Configs
.
magiskHide
)
.
putBoolean
(
"busybox"
,
Utils
.
commandExists
(
"busybox"
))
.
putBoolean
(
"hosts"
,
Utils
.
itemExist
(
false
,
"/magisk/.core/hosts"
))
.
putBoolean
(
"disable"
,
Utils
.
itemExist
(
Global
.
MAGISK_DISABLE_FILE
))
.
putString
(
"su_request_timeout"
,
String
.
valueOf
(
Global
.
Configs
.
suRequestTimeout
))
.
putString
(
"su_auto_response"
,
String
.
valueOf
(
Global
.
Configs
.
suResponseType
))
.
putString
(
"su_notification"
,
String
.
valueOf
(
Global
.
Configs
.
suNotificationType
))
.
putString
(
"su_access"
,
String
.
valueOf
(
Global
.
Configs
.
suAccessState
))
.
apply
();
return
null
;
}
}
public
static
class
CheckUpdates
extends
NormalTask
<
Void
,
Void
,
Void
>
{
@Override
...
...
@@ -327,10 +291,19 @@ public class Async {
}
public
static
class
MagiskHide
extends
RootTask
<
Object
,
Void
,
Void
>
{
private
boolean
newShell
=
false
;
public
MagiskHide
()
{}
public
MagiskHide
(
boolean
b
)
{
newShell
=
b
;
}
@Override
protected
Void
doInBackground
(
Object
...
params
)
{
String
command
=
(
String
)
params
[
0
];
Shell
.
su
(
MAGISK_HIDE_PATH
+
command
);
Shell
.
su
(
newShell
,
MAGISK_HIDE_PATH
+
command
);
return
null
;
}
...
...
app/src/main/java/com/topjohnwu/magisk/utils/Shell.java
View file @
b3b2149e
...
...
@@ -15,16 +15,15 @@ public class Shell {
// -1 = problematic/unknown issue; 0 = not rooted; 1 = properly rooted
public
static
int
rootStatus
;
private
static
boolean
isInit
=
false
;
private
static
Process
rootShell
;
private
static
DataOutputStream
rootSTDIN
;
private
static
StreamGobbler
rootSTDOUT
;
private
static
List
<
String
>
rootOutList
=
new
ArrayList
<>(
);
private
static
List
<
String
>
rootOutList
=
Collections
.
synchronizedList
(
new
ArrayList
<
String
>()
);
static
{
init
();
}
public
static
void
init
()
{
private
static
void
init
()
{
isInit
=
true
;
try
{
rootShell
=
Runtime
.
getRuntime
().
exec
(
"su"
);
...
...
@@ -64,7 +63,7 @@ public class Shell {
}
public
static
boolean
rootAccess
()
{
return
rootStatus
>
0
;
return
isInit
&&
rootStatus
>
0
;
}
public
static
List
<
String
>
sh
(
String
...
commands
)
{
...
...
@@ -120,9 +119,12 @@ public class Shell {
DataOutputStream
STDIN
;
StreamGobbler
STDOUT
;
if
(!
rootAccess
())
{
// Create the default shell if not init
if
(!
newShell
&&
!
isInit
)
init
();
if
(!
newShell
&&
!
rootAccess
())
return
null
;
}
if
(
newShell
)
{
res
=
Collections
.
synchronizedList
(
new
ArrayList
<
String
>());
...
...
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
View file @
b3b2149e
...
...
@@ -25,18 +25,9 @@ public class Utils {
public
static
boolean
isDownloading
=
false
;
public
static
boolean
itemExist
(
String
path
)
{
return
itemExist
(
true
,
path
);
}
public
static
boolean
itemExist
(
boolean
root
,
String
path
)
{
String
command
=
"if [ -e "
+
path
+
" ]; then echo true; else echo false; fi"
;
List
<
String
>
ret
;
if
(
Shell
.
rootAccess
()
&&
root
)
{
ret
=
Shell
.
su
(
command
);
return
isValidShellResponse
(
ret
)
&&
Boolean
.
parseBoolean
(
ret
.
get
(
0
));
}
else
{
return
new
File
(
path
).
exists
();
}
List
<
String
>
ret
=
Shell
.
su
(
command
);
return
isValidShellResponse
(
ret
)
&&
Boolean
.
parseBoolean
(
ret
.
get
(
0
));
}
public
static
boolean
commandExists
(
String
s
)
{
...
...
@@ -59,10 +50,8 @@ public class Utils {
}
public
static
List
<
String
>
getModList
(
String
path
)
{
List
<
String
>
ret
;
String
command
=
"find "
+
path
+
" -type d -maxdepth 1 ! -name \"*.core\" ! -name \"*lost+found\" ! -name \"*magisk\""
;
ret
=
Shell
.
su
(
command
);
return
ret
;
return
Shell
.
su
(
command
);
}
public
static
List
<
String
>
readFile
(
String
path
)
{
...
...
@@ -151,4 +140,13 @@ public class Utils {
return
Integer
.
parseInt
(
prefs
.
getString
(
key
,
String
.
valueOf
(
def
)));
}
public
static
void
checkAndStartMagiskHide
()
{
String
command
=
"ps | grep magiskhide >/dev/null; echo $?"
;
List
<
String
>
ret
=
Shell
.
su
(
command
);
if
(!
isValidShellResponse
(
ret
))
return
;
if
(
Integer
.
parseInt
(
ret
.
get
(
0
))
!=
0
)
new
Async
.
MagiskHide
().
enable
();
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment