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
4eecaea6
Commit
4eecaea6
authored
May 05, 2019
by
Viktor De Pasquale
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed rewritten java code being java-styled in kotlin
Fixed accessing kotlin code illegally via companion helper
parent
63055818
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
133 additions
and
110 deletions
+133
-110
FlashZip.kt
app/src/main/java/com/topjohnwu/magisk/tasks/FlashZip.kt
+60
-37
DownloadApp.java
...src/main/java/com/topjohnwu/magisk/utils/DownloadApp.java
+1
-1
PatchAPK.java
app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.java
+6
-6
RootUtils.kt
app/src/main/java/com/topjohnwu/magisk/utils/RootUtils.kt
+58
-58
ZipUtils.kt
app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.kt
+5
-5
EnvFixDialog.java
.../java/com/topjohnwu/magisk/view/dialogs/EnvFixDialog.java
+3
-3
No files found.
app/src/main/java/com/topjohnwu/magisk/tasks/FlashZip.kt
View file @
4eecaea6
package
com.topjohnwu.magisk.tasks
import
android.net.Uri
import
com.skoumal.teanity.extensions.subscribeK
import
com.topjohnwu.magisk.App
import
com.topjohnwu.magisk.Const
import
com.topjohnwu.magisk.utils.*
import
com.topjohnwu.magisk.utils.fileName
import
com.topjohnwu.magisk.utils.inject
import
com.topjohnwu.magisk.utils.readUri
import
com.topjohnwu.magisk.utils.unzip
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.internal.UiThreadHandler
import
io.reactivex.Single
import
java.io.File
import
java.io.FileNotFoundException
import
java.io.IOException
abstract
class
FlashZip
(
private
val
mUri
:
Uri
,
private
val
console
:
MutableList
<
String
>,
private
val
logs
:
MutableList
<
String
>)
{
abstract
class
FlashZip
(
private
val
mUri
:
Uri
,
private
val
console
:
MutableList
<
String
>,
private
val
logs
:
MutableList
<
String
>
)
{
private
val
tmpFile
:
File
=
File
(
App
.
self
.
cacheDir
,
"install.zip"
)
private
val
app
:
App
by
inject
()
private
val
tmpFile
:
File
=
File
(
app
.
cacheDir
,
"install.zip"
)
@Throws
(
IOException
::
class
)
private
fun
unzipAndCheck
():
Boolean
{
unzip
(
tmpFile
,
tmpFile
.
parentFile
!!
,
"META-INF/com/google/android"
,
true
)
return
Shell
.
su
(
"grep -q '#MAGISK' ${File(tmpFile.parentFile, "
updater
-
script
")}"
)
.
exec
().
isSuccess
val
parentFile
=
tmpFile
.
parentFile
?:
return
false
tmpFile
.
unzip
(
parentFile
,
"META-INF/com/google/android"
,
true
)
val
updaterScript
=
File
(
parentFile
,
"updater-script"
)
return
Shell
.
su
(
"grep -q '#MAGISK' $updaterScript"
)
.
exec
()
.
isSuccess
}
@Throws
(
IOException
::
class
)
private
fun
flash
():
Boolean
{
console
.
add
(
"- Copying zip to temp directory"
)
try
{
App
.
self
.
readUri
(
mUri
).
use
{
input
->
runCatching
{
app
.
readUri
(
mUri
).
use
{
input
->
tmpFile
.
outputStream
().
use
{
out
->
input
.
copyTo
(
out
)
}
}
}
catch
(
e
:
FileNotFoundException
)
{
console
.
add
(
"! Invalid Uri"
)
throw
e
}
catch
(
e
:
IOException
)
{
console
.
add
(
"! Cannot copy to cache"
)
throw
e
}
.
getOrElse
{
when
(
it
)
{
is
FileNotFoundException
->
console
.
add
(
"! Invalid Uri"
)
is
IOException
->
console
.
add
(
"! Cannot copy to cache"
)
}
throw
it
}
try
{
if
(!
unzipAndCheck
())
{
console
.
add
(
"! This zip is not a Magisk Module!"
)
return
false
}
}
catch
(
e
:
IOException
)
{
val
isMagiskModule
=
runCatching
{
unzipAndCheck
()
}.
getOrElse
{
console
.
add
(
"! Unzip error"
)
throw
e
throw
it
}
if
(!
isMagiskModule
)
{
console
.
add
(
"! This zip is not a Magisk Module!"
)
return
false
}
console
.
add
(
"- Installing ${mUri.fileName}"
)
return
Shell
.
su
(
"cd "
+
tmpFile
.
parent
!!
,
"BOOTMODE=true sh update-binary dummy 1 $tmpFile"
)
.
to
(
console
,
logs
)
.
exec
().
isSuccess
val
parentFile
=
tmpFile
.
parent
?:
return
false
return
Shell
.
su
(
"cd $parentFile"
,
"BOOTMODE=true sh update-binary dummy 1 $tmpFile"
)
.
to
(
console
,
logs
)
.
exec
().
isSuccess
}
fun
exec
()
{
App
.
THREAD_POOL
.
execut
e
{
val
success
=
try
{
fun
exec
()
=
Single
.
fromCallabl
e
{
runCatching
{
flash
()
}
catch
(
e
:
IOException
)
{
}.
getOrElse
{
it
.
printStackTrace
()
false
}.
apply
{
Shell
.
su
(
"cd /"
,
"rm -rf ${tmpFile.parent} ${Const.TMP_FOLDER_PATH}"
)
.
submit
()
}
Shell
.
su
(
"cd /"
,
"rm -rf ${tmpFile.parent} ${Const.TMP_FOLDER_PATH}"
).
submit
()
UiThreadHandler
.
run
{
onResult
(
success
)
}
}
}
.
subscribeK
(
onError
=
{
onResult
(
false
)
})
{
onResult
(
it
)
}
.
let
{
Unit
}
// ignores result disposable
protected
abstract
fun
onResult
(
success
:
Boolean
)
}
app/src/main/java/com/topjohnwu/magisk/utils/DownloadApp.java
View file @
4eecaea6
...
...
@@ -89,7 +89,7 @@ public class DownloadApp {
// Make it world readable
apk
.
setReadable
(
true
,
false
);
if
(
Shell
.
su
(
"pm install "
+
apk
).
exec
().
isSuccess
())
RootUtils
.
Companion
.
rmAndLaunch
(
app
.
getPackageName
(),
RootUtils
.
rmAndLaunch
(
app
.
getPackageName
(),
new
ComponentName
(
BuildConfig
.
APPLICATION_ID
,
ClassMap
.
get
(
SplashActivity
.
class
).
getName
()));
progress
.
dismiss
();
...
...
app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.java
View file @
4eecaea6
...
...
@@ -3,8 +3,6 @@ package com.topjohnwu.magisk.utils;
import
android.content.ComponentName
;
import
android.widget.Toast
;
import
androidx.core.app.NotificationCompat
;
import
com.topjohnwu.magisk.App
;
import
com.topjohnwu.magisk.BuildConfig
;
import
com.topjohnwu.magisk.ClassMap
;
...
...
@@ -29,6 +27,8 @@ import java.util.ArrayList;
import
java.util.List
;
import
java.util.jar.JarEntry
;
import
androidx.core.app.NotificationCompat
;
public
class
PatchAPK
{
public
static
final
String
LOWERALPHA
=
"abcdefghijklmnopqrstuvwxyz"
;
...
...
@@ -56,7 +56,7 @@ public class PatchAPK {
return
builder
.
toString
();
}
private
static
boolean
findAndPatch
(
byte
xml
[]
,
String
from
,
String
to
)
{
private
static
boolean
findAndPatch
(
byte
[]
xml
,
String
from
,
String
to
)
{
if
(
from
.
length
()
!=
to
.
length
())
return
false
;
CharBuffer
buf
=
ByteBuffer
.
wrap
(
xml
).
order
(
ByteOrder
.
LITTLE_ENDIAN
).
asCharBuffer
();
...
...
@@ -83,7 +83,7 @@ public class PatchAPK {
return
true
;
}
private
static
boolean
findAndPatch
(
byte
xml
[]
,
int
a
,
int
b
)
{
private
static
boolean
findAndPatch
(
byte
[]
xml
,
int
a
,
int
b
)
{
IntBuffer
buf
=
ByteBuffer
.
wrap
(
xml
).
order
(
ByteOrder
.
LITTLE_ENDIAN
).
asIntBuffer
();
int
len
=
xml
.
length
/
4
;
for
(
int
i
=
0
;
i
<
len
;
++
i
)
{
...
...
@@ -112,7 +112,7 @@ public class PatchAPK {
Config
.
set
(
Config
.
Key
.
SU_MANAGER
,
pkg
);
Config
.
export
();
RootUtils
.
Companion
.
rmAndLaunch
(
BuildConfig
.
APPLICATION_ID
,
RootUtils
.
rmAndLaunch
(
BuildConfig
.
APPLICATION_ID
,
new
ComponentName
(
pkg
,
ClassMap
.
get
(
SplashActivity
.
class
).
getName
()));
return
true
;
...
...
@@ -122,7 +122,7 @@ public class PatchAPK {
try
{
JarMap
jar
=
new
JarMap
(
in
);
JarEntry
je
=
jar
.
getJarEntry
(
Const
.
ANDROID_MANIFEST
);
byte
xml
[]
=
jar
.
getRawData
(
je
);
byte
[]
xml
=
jar
.
getRawData
(
je
);
if
(!
findAndPatch
(
xml
,
BuildConfig
.
APPLICATION_ID
,
pkg
)
||
!
findAndPatch
(
xml
,
R
.
string
.
app_name
,
R
.
string
.
re_app_name
))
...
...
app/src/main/java/com/topjohnwu/magisk/utils/RootUtils.kt
View file @
4eecaea6
...
...
@@ -38,72 +38,70 @@ fun Intent.toCommand(args: MutableList<String>) {
}
val
extras
=
extras
if
(
extras
!=
null
)
{
for
(
key
in
extras
.
keySet
())
{
loop
@
for
(
key
in
extras
.
keySet
())
{
val
v
=
extras
.
get
(
key
)
?:
continue
var
value
:
Any
=
v
val
arg
:
String
if
(
v
is
String
)
arg
=
"--es"
else
if
(
v
is
Boolean
)
arg
=
"--ez"
else
if
(
v
is
Int
)
arg
=
"--ei"
else
if
(
v
is
Long
)
arg
=
"--el"
else
if
(
v
is
Float
)
arg
=
"--ef"
else
if
(
v
is
Uri
)
arg
=
"--eu"
else
if
(
v
is
ComponentName
)
{
arg
=
"--ecn"
value
=
v
.
flattenToString
()
}
else
if
(
v
is
ArrayList
<*>)
{
if
(
v
.
size
<=
0
)
/* Impossible to know the type due to type erasure */
continue
when
{
v
is
String
->
arg
=
"--es"
v
is
Boolean
->
arg
=
"--ez"
v
is
Int
->
arg
=
"--ei"
v
is
Long
->
arg
=
"--el"
v
is
Float
->
arg
=
"--ef"
v
is
Uri
->
arg
=
"--eu"
v
is
ComponentName
->
{
arg
=
"--ecn"
value
=
v
.
flattenToString
()
}
v
is
ArrayList
<*>
->
{
if
(
v
.
size
<=
0
)
/* Impossible to know the type due to type erasure */
continue
@loop
arg
=
if
(
v
[
0
]
is
Int
)
"--eial"
else
if
(
v
[
0
]
is
Long
)
"--elal"
else
if
(
v
[
0
]
is
Float
)
"--efal"
else
if
(
v
[
0
]
is
String
)
"--esal"
else
continue
/* Unsupported */
arg
=
if
(
v
[
0
]
is
Int
)
"--eial"
else
if
(
v
[
0
]
is
Long
)
"--elal"
else
if
(
v
[
0
]
is
Float
)
"--efal"
else
if
(
v
[
0
]
is
String
)
"--esal"
else
continue
@loop
/* Unsupported */
val
sb
=
StringBuilder
()
for
(
o
in
v
)
{
sb
.
append
(
o
.
toString
().
replace
(
","
,
"\\,"
))
sb
.
append
(
','
)
val
sb
=
StringBuilder
()
for
(
o
in
v
)
{
sb
.
append
(
o
.
toString
().
replace
(
","
,
"\\,"
))
sb
.
append
(
','
)
}
// Remove trailing comma
sb
.
deleteCharAt
(
sb
.
length
-
1
)
value
=
sb
}
// Remove trailing comma
sb
.
deleteCharAt
(
sb
.
length
-
1
)
value
=
sb
}
else
if
(
v
.
javaClass
.
isArray
)
{
arg
=
if
(
v
is
IntArray
)
"--eia"
else
if
(
v
is
LongArray
)
"--ela"
else
if
(
v
is
FloatArray
)
"--efa"
else
if
(
v
is
Array
<*>
&&
v
.
isArrayOf
<
String
>())
"--esa"
else
continue
/* Unsupported */
v
.
javaClass
.
isArray
->
{
arg
=
if
(
v
is
IntArray
)
"--eia"
else
if
(
v
is
LongArray
)
"--ela"
else
if
(
v
is
FloatArray
)
"--efa"
else
if
(
v
is
Array
<*>
&&
v
.
isArrayOf
<
String
>())
"--esa"
else
continue
@loop
/* Unsupported */
val
sb
=
StringBuilder
()
val
len
=
RArray
.
getLength
(
v
)
for
(
i
in
0
until
len
)
{
sb
.
append
(
RArray
.
get
(
v
,
i
)
!!
.
toString
().
replace
(
","
,
"\\,"
))
sb
.
append
(
','
)
val
sb
=
StringBuilder
()
val
len
=
RArray
.
getLength
(
v
)
for
(
i
in
0
until
len
)
{
sb
.
append
(
RArray
.
get
(
v
,
i
)
!!
.
toString
().
replace
(
","
,
"\\,"
))
sb
.
append
(
','
)
}
// Remove trailing comma
sb
.
deleteCharAt
(
sb
.
length
-
1
)
value
=
sb
}
// Remove trailing comma
sb
.
deleteCharAt
(
sb
.
length
-
1
)
value
=
sb
}
else
continue
/* Unsupported */
else
->
continue
@loop
}
/* Unsupported */
args
.
add
(
arg
)
args
.
add
(
key
)
...
...
@@ -153,10 +151,12 @@ class RootUtils : Shell.Initializer() {
companion
object
{
@JvmStatic
fun
rmAndLaunch
(
rm
:
String
,
component
:
ComponentName
)
{
Shell
.
su
(
"(rm_launch $rm ${component.flattenToString()})"
).
exec
()
}
@JvmStatic
fun
reboot
()
{
Shell
.
su
(
"/system/bin/reboot ${if (Config.recovery) "
recovery
" else ""}"
).
submit
()
}
...
...
app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.kt
View file @
4eecaea6
...
...
@@ -9,16 +9,16 @@ import java.util.zip.ZipEntry
import
java.util.zip.ZipInputStream
@Throws
(
IOException
::
class
)
fun
unzip
(
zip
:
File
,
folder
:
File
,
path
:
String
=
""
,
junkPath
:
Boolean
=
false
)
{
zip
.
inputStream
().
buffered
().
use
{
unzip
(
it
,
folder
,
path
,
junkPath
)
fun
File
.
unzip
(
folder
:
File
,
path
:
String
=
""
,
junkPath
:
Boolean
=
false
)
{
inputStream
().
buffered
().
use
{
it
.
unzip
(
folder
,
path
,
junkPath
)
}
}
@Throws
(
IOException
::
class
)
fun
unzip
(
zip
:
InputStream
,
folder
:
File
,
path
:
String
,
junkPath
:
Boolean
)
{
fun
InputStream
.
unzip
(
folder
:
File
,
path
:
String
,
junkPath
:
Boolean
)
{
try
{
val
zin
=
ZipInputStream
(
zip
)
val
zin
=
ZipInputStream
(
this
)
var
entry
:
ZipEntry
while
(
true
)
{
entry
=
zin
.
nextEntry
?:
break
...
...
app/src/main/java/com/topjohnwu/magisk/view/dialogs/EnvFixDialog.java
View file @
4eecaea6
...
...
@@ -4,8 +4,6 @@ import android.app.Activity;
import
android.app.ProgressDialog
;
import
android.widget.Toast
;
import
androidx.annotation.NonNull
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.tasks.MagiskInstaller
;
import
com.topjohnwu.magisk.utils.RootUtils
;
...
...
@@ -14,6 +12,8 @@ import com.topjohnwu.superuser.Shell;
import
com.topjohnwu.superuser.internal.UiThreadHandler
;
import
com.topjohnwu.superuser.io.SuFile
;
import
androidx.annotation.NonNull
;
public
class
EnvFixDialog
extends
CustomAlertDialog
{
public
EnvFixDialog
(
@NonNull
Activity
activity
)
{
...
...
@@ -38,7 +38,7 @@ public class EnvFixDialog extends CustomAlertDialog {
pd
.
dismiss
();
Utils
.
toast
(
success
?
R
.
string
.
reboot_delay_toast
:
R
.
string
.
setup_fail
,
Toast
.
LENGTH_LONG
);
if
(
success
)
UiThreadHandler
.
handler
.
postDelayed
(
RootUtils
.
Companion
::
reboot
,
5000
);
UiThreadHandler
.
handler
.
postDelayed
(
RootUtils:
:
reboot
,
5000
);
}
}.
exec
();
});
...
...
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