@@ -10,9 +10,9 @@ import brut.androlib.ApkDecoder
10
10
import brut.androlib.apk.UsesFramework
11
11
import brut.androlib.res.Framework
12
12
import brut.androlib.res.ResourcesDecoder
13
+ import brut.androlib.res.decoder.AndroidManifestPullStreamDecoder
13
14
import brut.androlib.res.decoder.AndroidManifestResourceParser
14
- import brut.androlib.res.decoder.XmlPullStreamDecoder
15
- import brut.androlib.res.xml.ResXmlPatcher
15
+ import brut.androlib.res.xml.ResXmlUtils
16
16
import brut.directory.ExtFile
17
17
import java.io.InputStream
18
18
import java.io.OutputStream
@@ -51,64 +51,62 @@ class ResourcePatchContext internal constructor(
51
51
*
52
52
* @param mode The [ResourceMode] to use.
53
53
*/
54
- internal fun decodeResources (mode : ResourceMode ) =
55
- with (packageMetadata.apkInfo) {
56
- config.initializeTemporaryFilesDirectories()
54
+ internal fun decodeResources (mode : ResourceMode ) = with (packageMetadata.apkInfo) {
55
+ config.initializeTemporaryFilesDirectories()
57
56
58
- // Needed to decode resources.
59
- val resourcesDecoder = ResourcesDecoder (config.resourceConfig, this )
57
+ // Needed to decode resources.
58
+ val resourcesDecoder = ResourcesDecoder (config.resourceConfig, this )
60
59
61
- if (mode == ResourceMode .FULL ) {
62
- logger.info(" Decoding resources" )
60
+ if (mode == ResourceMode .FULL ) {
61
+ logger.info(" Decoding resources" )
63
62
64
- resourcesDecoder.decodeResources(config.apkFiles)
65
- resourcesDecoder.decodeManifest(config.apkFiles)
63
+ resourcesDecoder.decodeResources(config.apkFiles)
64
+ resourcesDecoder.decodeManifest(config.apkFiles)
66
65
67
- // Needed to record uncompressed files.
68
- val apkDecoder = ApkDecoder (config.resourceConfig, this )
69
- apkDecoder.recordUncompressedFiles(resourcesDecoder.resFileMapping)
66
+ // Needed to record uncompressed files.
67
+ ApkDecoder (this , config.resourceConfig).recordUncompressedFiles(resourcesDecoder.resFileMapping)
70
68
71
- usesFramework =
72
- UsesFramework ().apply {
73
- ids = resourcesDecoder.resTable.listFramePackages().map { it.id }
74
- }
75
- } else {
76
- logger.info(" Decoding app manifest" )
77
-
78
- // Decode manually instead of using resourceDecoder.decodeManifest
79
- // because it does not support decoding to an OutputStream.
80
- XmlPullStreamDecoder (
81
- AndroidManifestResourceParser (resourcesDecoder.resTable),
82
- resourcesDecoder.resXmlSerializer,
83
- ).decodeManifest(
84
- apkFile.directory.getFileInput(" AndroidManifest.xml" ),
85
- // Older Android versions do not support OutputStream.nullOutputStream()
86
- object : OutputStream () {
87
- override fun write (b : Int ) { // Do nothing.
88
- }
89
- },
90
- )
91
-
92
- // Get the package name and version from the manifest using the XmlPullStreamDecoder.
93
- // XmlPullStreamDecoder.decodeManifest() sets metadata.apkInfo.
94
- packageMetadata.let { metadata ->
95
- metadata.packageName = resourcesDecoder.resTable.packageRenamed
96
- versionInfo.let {
97
- metadata.packageVersion = it.versionName ? : it.versionCode
69
+ usesFramework =
70
+ UsesFramework ().apply {
71
+ ids = resourcesDecoder.resTable.listFramePackages().map { it.id }
72
+ }
73
+ } else {
74
+ logger.info(" Decoding app manifest" )
75
+
76
+ // Decode manually instead of using resourceDecoder.decodeManifest
77
+ // because it does not support decoding to an OutputStream.
78
+ AndroidManifestPullStreamDecoder (
79
+ AndroidManifestResourceParser (resourcesDecoder.resTable),
80
+ resourcesDecoder.newXmlSerializer(),
81
+ ).decode(
82
+ apkFile.directory.getFileInput(" AndroidManifest.xml" ),
83
+ // Older Android versions do not support OutputStream.nullOutputStream()
84
+ object : OutputStream () {
85
+ override fun write (b : Int ) { // Do nothing.
98
86
}
87
+ },
88
+ )
89
+
90
+ // Get the package name and version from the manifest using the XmlPullStreamDecoder.
91
+ // AndroidManifestPullStreamDecoder.decode() sets metadata.apkInfo.
92
+ packageMetadata.let { metadata ->
93
+ metadata.packageName = resourcesDecoder.resTable.packageRenamed
94
+ versionInfo.let {
95
+ metadata.packageVersion = it.versionName ? : it.versionCode
96
+ }
99
97
100
- /*
101
- The ResTable if flagged as sparse if the main package is not loaded, which is the case here,
102
- because ResourcesDecoder.decodeResources loads the main package
103
- and not XmlPullStreamDecoder.decodeManifest .
104
- See ARSCDecoder.readTableType for more info.
98
+ /*
99
+ The ResTable if flagged as sparse if the main package is not loaded, which is the case here,
100
+ because ResourcesDecoder.decodeResources loads the main package
101
+ and not AndroidManifestPullStreamDecoder.decode .
102
+ See ARSCDecoder.readTableType for more info.
105
103
106
- Set this to false again to prevent the ResTable from being flagged as sparse falsely.
107
- */
108
- metadata.apkInfo.sparseResources = false
109
- }
104
+ Set this to false again to prevent the ResTable from being flagged as sparse falsely.
105
+ */
106
+ metadata.apkInfo.sparseResources = false
110
107
}
111
108
}
109
+ }
112
110
113
111
/* *
114
112
* Compile resources in [PatcherConfig.apkFiles].
@@ -130,10 +128,10 @@ class ResourcePatchContext internal constructor(
130
128
AaptInvoker (
131
129
config.resourceConfig,
132
130
packageMetadata.apkInfo,
133
- ).invokeAapt (
131
+ ).invoke (
134
132
resources.resolve(" resources.apk" ),
135
133
config.apkFiles.resolve(" AndroidManifest.xml" ).also {
136
- ResXmlPatcher .fixingPublicAttrsInProviderAttributes(it)
134
+ ResXmlUtils .fixingPublicAttrsInProviderAttributes(it)
137
135
},
138
136
config.apkFiles.resolve(" res" ),
139
137
null ,
0 commit comments