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
6f7c13b8
Commit
6f7c13b8
authored
Nov 03, 2019
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor JarMap
parent
e7d66850
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
108 additions
and
76 deletions
+108
-76
PatchAPK.kt
app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt
+1
-1
JarMap.java
signing/src/main/java/com/topjohnwu/signing/JarMap.java
+105
-73
SignAPK.java
signing/src/main/java/com/topjohnwu/signing/SignAPK.java
+1
-1
ZipSigner.java
signing/src/main/java/com/topjohnwu/signing/ZipSigner.java
+1
-1
No files found.
app/src/main/java/com/topjohnwu/magisk/utils/PatchAPK.kt
View file @
6f7c13b8
...
@@ -118,7 +118,7 @@ object PatchAPK {
...
@@ -118,7 +118,7 @@ object PatchAPK {
@JvmOverloads
@JvmOverloads
fun
patch
(
apk
:
String
,
out
:
String
,
pkg
:
String
,
label
:
String
=
"Manager"
):
Boolean
{
fun
patch
(
apk
:
String
,
out
:
String
,
pkg
:
String
,
label
:
String
=
"Manager"
):
Boolean
{
try
{
try
{
val
jar
=
JarMap
(
apk
)
val
jar
=
JarMap
.
open
(
apk
)
val
je
=
jar
.
getJarEntry
(
Const
.
ANDROID_MANIFEST
)
val
je
=
jar
.
getJarEntry
(
Const
.
ANDROID_MANIFEST
)
val
xml
=
jar
.
getRawData
(
je
)
val
xml
=
jar
.
getRawData
(
je
)
...
...
signing/src/main/java/com/topjohnwu/signing/JarMap.java
View file @
6f7c13b8
...
@@ -15,117 +15,149 @@ import java.util.jar.Manifest;
...
@@ -15,117 +15,149 @@ import java.util.jar.Manifest;
import
java.util.zip.ZipEntry
;
import
java.util.zip.ZipEntry
;
import
java.util.zip.ZipFile
;
import
java.util.zip.ZipFile
;
/*
public
abstract
class
JarMap
implements
Closeable
{
* A universal random access interface for both JarFile and JarInputStream
*
* In the case when JarInputStream is provided to constructor, the whole stream
* will be loaded into memory for random access purposes.
* On the other hand, when a JarFile is provided, it simply works as a wrapper.
* */
public
class
JarMap
implements
Closeable
{
LinkedHashMap
<
String
,
JarEntry
>
entryMap
;
private
JarFile
jarFile
;
public
static
JarMap
open
(
String
file
)
throws
IOException
{
private
JarInputStream
jis
;
return
new
FileMap
(
new
File
(
file
),
true
,
ZipFile
.
OPEN_READ
);
private
LinkedHashMap
<
String
,
JarEntry
>
bufMap
;
}
private
Manifest
manifest
;
public
JarMap
(
File
file
)
throws
IOException
{
public
static
JarMap
open
(
File
file
,
boolean
verify
)
throws
IOException
{
this
(
file
,
true
);
return
new
FileMap
(
file
,
verify
,
ZipFile
.
OPEN_READ
);
}
}
public
JarMap
(
File
file
,
boolean
verify
)
throws
IOException
{
public
static
JarMap
open
(
String
file
,
boolean
verify
)
throws
IOException
{
this
(
file
,
verify
,
ZipFile
.
OPEN_READ
);
return
new
FileMap
(
new
File
(
file
)
,
verify
,
ZipFile
.
OPEN_READ
);
}
}
public
JarMap
(
File
file
,
boolean
verify
,
int
mode
)
throws
IOException
{
public
static
JarMap
open
(
InputStream
is
,
boolean
verify
)
throws
IOException
{
jarFile
=
new
JarFile
(
file
,
verify
,
mode
);
return
new
StreamMap
(
is
,
verify
);
manifest
=
jarFile
.
getManifest
();
}
}
public
JarMap
(
String
name
)
throws
IOException
{
public
File
getFile
()
{
this
(
new
File
(
name
))
;
return
null
;
}
}
public
JarMap
(
String
name
,
boolean
verify
)
throws
IOException
{
public
abstract
Manifest
getManifest
()
throws
IOException
;
this
(
new
File
(
name
),
verify
);
public
InputStream
getInputStream
(
ZipEntry
ze
)
throws
IOException
{
JarMapEntry
e
=
getMapEntry
(
ze
.
getName
());
return
e
!=
null
?
e
.
data
.
getInputStream
()
:
null
;
}
}
public
JarMap
(
InputStream
is
)
throws
IOException
{
public
OutputStream
getOutputStream
(
ZipEntry
ze
)
{
this
(
is
,
true
);
if
(
entryMap
==
null
)
entryMap
=
new
LinkedHashMap
<>();
JarMapEntry
e
=
new
JarMapEntry
(
ze
.
getName
());
entryMap
.
put
(
ze
.
getName
(),
e
);
return
e
.
data
;
}
}
public
JarMap
(
InputStream
is
,
boolean
verify
)
throws
IOException
{
public
byte
[]
getRawData
(
ZipEntry
ze
)
throws
IOException
{
jis
=
new
JarInputStream
(
is
,
verify
);
JarMapEntry
e
=
getMapEntry
(
ze
.
getName
());
bufMap
=
new
LinkedHashMap
<>();
return
e
!=
null
?
e
.
data
.
toByteArray
()
:
null
;
JarEntry
entry
;
while
((
entry
=
jis
.
getNextJarEntry
())
!=
null
)
{
bufMap
.
put
(
entry
.
getName
(),
new
JarMapEntry
(
entry
,
jis
));
}
}
manifest
=
jis
.
getManifest
();
public
abstract
Enumeration
<
JarEntry
>
entries
();
public
final
ZipEntry
getEntry
(
String
name
)
{
return
getJarEntry
(
name
);
}
}
public
File
getFile
(
)
{
public
JarEntry
getJarEntry
(
String
name
)
{
return
jarFile
==
null
?
null
:
new
File
(
jarFile
.
getName
()
);
return
getMapEntry
(
name
);
}
}
public
Manifest
getManifest
()
{
JarMapEntry
getMapEntry
(
String
name
)
{
return
manifest
;
JarMapEntry
e
=
null
;
if
(
entryMap
!=
null
)
e
=
(
JarMapEntry
)
entryMap
.
get
(
name
);
return
e
;
}
}
public
InputStream
getInputStream
(
ZipEntry
ze
)
throws
IOException
{
private
static
class
FileMap
extends
JarMap
{
if
(
bufMap
!=
null
)
{
JarMapEntry
e
=
(
JarMapEntry
)
bufMap
.
get
(
ze
.
getName
());
private
JarFile
jarFile
;
if
(
e
!=
null
)
return
e
.
data
.
getInputStream
();
FileMap
(
File
file
,
boolean
verify
,
int
mode
)
throws
IOException
{
jarFile
=
new
JarFile
(
file
,
verify
,
mode
);
}
}
return
jarFile
.
getInputStream
(
ze
);
@Override
public
File
getFile
()
{
return
new
File
(
jarFile
.
getName
());
}
}
public
OutputStream
getOutputStream
(
ZipEntry
ze
)
{
@Override
manifest
=
null
;
/* Invalidate the manifest */
public
Manifest
getManifest
()
throws
IOException
{
if
(
bufMap
==
null
)
return
jarFile
.
getManifest
();
bufMap
=
new
LinkedHashMap
<>();
JarMapEntry
e
=
new
JarMapEntry
(
ze
.
getName
());
bufMap
.
put
(
ze
.
getName
(),
e
);
return
e
.
data
;
}
}
public
byte
[]
getRawData
(
ZipEntry
ze
)
throws
IOException
{
@Override
if
(
bufMap
!=
null
)
{
public
InputStream
getInputStream
(
ZipEntry
ze
)
throws
IOException
{
JarMapEntry
e
=
(
JarMapEntry
)
bufMap
.
get
(
ze
.
getName
());
InputStream
is
=
super
.
getInputStream
(
ze
);
if
(
e
!=
null
)
return
is
!=
null
?
is
:
jarFile
.
getInputStream
(
ze
);
return
e
.
data
.
toByteArray
();
}
}
@Override
public
byte
[]
getRawData
(
ZipEntry
ze
)
throws
IOException
{
byte
[]
b
=
super
.
getRawData
(
ze
);
if
(
b
!=
null
)
return
b
;
ByteArrayStream
bytes
=
new
ByteArrayStream
();
ByteArrayStream
bytes
=
new
ByteArrayStream
();
bytes
.
readFrom
(
jarFile
.
getInputStream
(
ze
));
bytes
.
readFrom
(
jarFile
.
getInputStream
(
ze
));
return
bytes
.
toByteArray
();
return
bytes
.
toByteArray
();
}
}
@Override
public
Enumeration
<
JarEntry
>
entries
()
{
public
Enumeration
<
JarEntry
>
entries
()
{
return
jarFile
==
null
?
Collections
.
enumeration
(
bufMap
.
values
())
:
jarFile
.
entries
();
return
jarFile
.
entries
();
}
public
ZipEntry
getEntry
(
String
name
)
{
return
getJarEntry
(
name
);
}
}
@Override
public
JarEntry
getJarEntry
(
String
name
)
{
public
JarEntry
getJarEntry
(
String
name
)
{
JarEntry
e
=
jarFile
==
null
?
bufMap
.
get
(
name
)
:
jarFile
.
getJarEntry
(
name
);
JarEntry
e
=
getMapEntry
(
name
);
if
(
e
==
null
&&
bufMap
!=
null
)
return
e
!=
null
?
e
:
jarFile
.
getJarEntry
(
name
);
return
bufMap
.
get
(
name
);
return
e
;
}
}
@Override
@Override
public
void
close
()
throws
IOException
{
public
void
close
()
throws
IOException
{
if
(
jarFile
!=
null
)
jarFile
.
close
();
jarFile
.
close
();
else
}
}
private
static
class
StreamMap
extends
JarMap
{
private
JarInputStream
jis
;
StreamMap
(
InputStream
is
,
boolean
verify
)
throws
IOException
{
jis
=
new
JarInputStream
(
is
,
verify
);
entryMap
=
new
LinkedHashMap
<>();
JarEntry
entry
;
while
((
entry
=
jis
.
getNextJarEntry
())
!=
null
)
{
entryMap
.
put
(
entry
.
getName
(),
new
JarMapEntry
(
entry
,
jis
));
}
}
@Override
public
Manifest
getManifest
()
{
return
jis
.
getManifest
();
}
@Override
public
Enumeration
<
JarEntry
>
entries
()
{
return
Collections
.
enumeration
(
entryMap
.
values
());
}
@Override
public
void
close
()
throws
IOException
{
jis
.
close
();
jis
.
close
();
}
}
}
private
static
class
JarMapEntry
extends
JarEntry
{
private
static
class
JarMapEntry
extends
JarEntry
{
ByteArrayStream
data
;
ByteArrayStream
data
;
JarMapEntry
(
JarEntry
je
,
InputStream
is
)
{
JarMapEntry
(
JarEntry
je
,
InputStream
is
)
{
...
...
signing/src/main/java/com/topjohnwu/signing/SignAPK.java
View file @
6f7c13b8
...
@@ -72,7 +72,7 @@ public class SignAPK {
...
@@ -72,7 +72,7 @@ public class SignAPK {
ZipAdjust
.
adjust
(
temp1
,
temp2
);
ZipAdjust
.
adjust
(
temp1
,
temp2
);
try
(
JarMap
map
=
new
JarMap
(
temp2
,
false
))
{
try
(
JarMap
map
=
JarMap
.
open
(
temp2
,
false
))
{
sign
(
cert
,
key
,
map
,
output
,
true
);
sign
(
cert
,
key
,
map
,
output
,
true
);
}
}
}
finally
{
}
finally
{
...
...
signing/src/main/java/com/topjohnwu/signing/ZipSigner.java
View file @
6f7c13b8
...
@@ -65,7 +65,7 @@ public class ZipSigner {
...
@@ -65,7 +65,7 @@ public class ZipSigner {
Security
.
insertProviderAt
(
new
BouncyCastleProvider
(),
1
);
Security
.
insertProviderAt
(
new
BouncyCastleProvider
(),
1
);
try
(
JarMap
in
=
new
JarMap
(
args
[
args
.
length
-
2
],
false
);
try
(
JarMap
in
=
JarMap
.
open
(
args
[
args
.
length
-
2
],
false
);
OutputStream
out
=
new
FileOutputStream
(
args
[
args
.
length
-
1
]))
{
OutputStream
out
=
new
FileOutputStream
(
args
[
args
.
length
-
1
]))
{
if
(
args
.
length
==
2
)
{
if
(
args
.
length
==
2
)
{
sign
(
in
,
out
);
sign
(
in
,
out
);
...
...
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