Skip to content

Commit 2f6f289

Browse files
authored
Merge pull request #8 from huanli233/apkmixin-fix
ApkMixin fix
2 parents 5a6dc3f + 91dceab commit 2f6f289

4 files changed

Lines changed: 82 additions & 14 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: Android CI
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
7+
jobs:
8+
build:
9+
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- uses: actions/checkout@v4
14+
- name: set up JDK 17
15+
uses: actions/setup-java@v4
16+
with:
17+
java-version: '17'
18+
distribution: 'temurin'
19+
cache: gradle
20+
21+
- name: Grant execute permission for gradlew
22+
run: chmod +x gradlew
23+
- name: Build with Gradle
24+
run: ./gradlew MixinApk-release
25+
26+
- name: Upload a Build Artifact
27+
uses: actions/[email protected]
28+
with:
29+
name: QQPro
30+
path: app/dist/QQPro.*.apk

.github/workflows/pr_android.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Pull Requests build
2+
3+
on:
4+
pull_request:
5+
branches: [ "main" ]
6+
7+
jobs:
8+
build:
9+
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- uses: actions/checkout@v4
14+
- name: set up JDK 17
15+
uses: actions/setup-java@v4
16+
with:
17+
java-version: '17'
18+
distribution: 'temurin'
19+
cache: gradle
20+
21+
- name: Grant execute permission for gradlew
22+
run: chmod +x gradlew
23+
- name: Build with Gradle
24+
run: ./gradlew MixinApk-release

ApkMixin/src/main/java/momoi/plugin/apkmixin/MixinPlugin.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package momoi.plugin.apkmixin
33
import com.android.apksigner.ApkSignerTool
44
import com.wind.meditor.ManifestEditorMain
55
import momoi.plugin.apkmixin.utils.child
6+
import momoi.plugin.apkmixin.utils.lifecycle
67
import org.gradle.api.DefaultTask
78
import org.gradle.api.Plugin
89
import org.gradle.api.Project
@@ -33,7 +34,7 @@ class MixinPlugin : Plugin<Project> {
3334
private fun createMixinBaseTask(project: Project) {
3435
project.tasks.register("MixinApk", MixinApkTask::class.java) {
3536
val targetApkName = extension.targetApk ?: throw IllegalArgumentException("targetApk must not be null")
36-
it.mixinAppDex = project.fileTree("build/intermediates/dex/release/mergeDexRelease")
37+
it.mixinAppDex = project.layout.buildDirectory.dir("intermediates/dex/release/mergeDexRelease").get().asFileTree
3738
it.targetAppFile = project.layout.projectDirectory.dir("mixin").file(targetApkName)
3839
it.doLast {
3940
createMetadata(project)
@@ -47,7 +48,7 @@ class MixinPlugin : Plugin<Project> {
4748
it.doLast {
4849
processManifest(project, isDebug = true)
4950
sign(project)
50-
createMetadata(project, extension.output.signedFileName)
51+
createMetadata(project, if (extension.signing.enabled) extension.output.signedFileName else extension.output.unsignedFileName)
5152
}
5253
}
5354
}
@@ -58,12 +59,13 @@ class MixinPlugin : Plugin<Project> {
5859
it.doLast {
5960
processManifest(project, isDebug = false)
6061
sign(project)
61-
createMetadata(project, extension.output.signedFileName)
62+
createMetadata(project, if (extension.signing.enabled) extension.output.signedFileName else extension.output.unsignedFileName)
6263
}
6364
}
6465
}
6566

6667
private fun processManifest(project: Project, isDebug: Boolean) {
68+
lifecycle("Processing manifest...")
6769
ManifestEditorMain.main(
6870
project.outputDir(extension).child(extension.output.mixinApkFileName).absolutePath,
6971
"-o",
@@ -76,15 +78,18 @@ class MixinPlugin : Plugin<Project> {
7678

7779
private fun sign(project: Project) {
7880
if (extension.signing.enabled) {
81+
lifecycle("Signing...")
7982
val unsignedApkFile = project.outputDir(extension).child(extension.output.unsignedFileName)
83+
val signedApkFile = project.outputDir(extension).child(extension.output.signedFileName)
8084
ApkSignerTool.main(arrayOf(
8185
"sign",
8286
"--key", extension.signing.keyFile?.absolutePath,
8387
"--cert", extension.signing.certFile?.absolutePath,
84-
"--out", project.outputDir(extension).child(extension.output.signedFileName).absolutePath,
88+
"--out", signedApkFile.absolutePath,
8589
unsignedApkFile.absolutePath
8690
))
8791
unsignedApkFile.delete()
92+
lifecycle("Signed: ${signedApkFile.absolutePath}")
8893
}
8994
}
9095

@@ -97,7 +102,7 @@ class MixinPlugin : Plugin<Project> {
97102
}
98103

99104
private fun createRedirectFile(project: Project) {
100-
project.projectDir.child("build/intermediates/apk_ide_redirect_file/debug/createDebugApkListingFileRedirect/redirect.txt")
105+
project.layout.buildDirectory.file("intermediates/apk_ide_redirect_file/debug/createDebugApkListingFileRedirect/redirect.txt").get().asFile
101106
.writeText("""
102107
#- File Locator -
103108
listingFile=../../../../../dist/output-metadata.json
@@ -108,7 +113,7 @@ class MixinPlugin : Plugin<Project> {
108113
project: Project,
109114
fileName: String
110115
) {
111-
project.projectDir.child("dist/output-metadata.json").writeText("""
116+
project.outputDir(extension).child("output-metadata.json").writeText("""
112117
{
113118
"version": 3,
114119
"artifactType": {
@@ -133,14 +138,17 @@ class MixinPlugin : Plugin<Project> {
133138
}
134139

135140
abstract class MixinApkTask: DefaultTask() {
141+
142+
private val extension = project.extensions.findByType(ApkMixinExtension::class.java) ?: ApkMixinExtension()
143+
136144
@get:InputFiles
137145
abstract var mixinAppDex: FileCollection
138146

139147
@get:InputFile
140148
abstract var targetAppFile: RegularFile
141149

142150
@get:OutputFile
143-
val outputFile: RegularFile = project.layout.projectDirectory.file("dist/${DEFAULT_MIXIN_APK_NAME}")
151+
val outputMixinFile: RegularFile = project.layout.projectDirectory.dir(extension.output.outputDir).file(extension.output.mixinApkFileName)
144152

145153
init {
146154
dependsOn("mergeDexRelease")

ApkMixin/src/main/java/momoi/plugin/apkmixin/MixinProcessor.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ import momoi.plugin.apkmixin.utils.toSmali
2525
import org.gradle.api.Project
2626
import java.io.File
2727
import java.io.FileNotFoundException
28+
import java.io.IOException
2829
import java.util.concurrent.TimeUnit
2930
import java.util.zip.ZipFile
3031
import kotlin.getValue
3132

3233
class MixinProcessor(
3334
private val project: Project,
34-
private val inputDexDir: File = project.projectDir.child("build/intermediates/dex/release/mergeDexRelease"),
35+
private val inputDexDir: File = project.layout.buildDirectory.dir("intermediates/dex/release/mergeDexRelease").get().asFile,
3536
private val targetApkFile: File = project.projectDir.child("mixin").child(extension.targetApk.orEmpty()),
3637
private val extension: ApkMixinExtension = project.extensions.getByType(ApkMixinExtension::class.java)
3738
) {
@@ -49,7 +50,7 @@ class MixinProcessor(
4950
private fun loadDexFiles(): Triple<DexFile, DexFile, ZipFile> {
5051
val srcDex = MultiDexIO.readDexFile(
5152
/* multiDex = */ true,
52-
/* file = */ File(project.projectDir, "build/intermediates/dex/release/mergeDexRelease"),
53+
/* file = */ inputDexDir,
5354
/* namer = */ BasicDexFileNamer(),
5455
/* opcodes = */ null,
5556
/* logger = */ null
@@ -179,7 +180,11 @@ class MixinProcessor(
179180
lifecycle("Writing dex...")
180181
val stopWatchWriteDex = Stopwatch.createStarted()
181182
val namer = BasicDexFileNamer()
182-
val outputDexDir = project.projectDir.child("build/mixinDex")
183+
val outputDexDir = project.layout.buildDirectory.dir("mixinDex").get().asFile.also {
184+
if (!it.isDirectory && ((it.exists() && !it.delete()) || !it.mkdirs())) {
185+
throw IOException("Failed to create ${it.absolutePath}")
186+
}
187+
}
183188

184189
MultiDexIO.writeDexFile(
185190
/* multiDex = */ true,
@@ -194,18 +199,19 @@ class MixinProcessor(
194199
stopWatchWriteDex.stop()
195200
lifecycle("Dex written in ${stopWatchWriteDex.elapsed(TimeUnit.MILLISECONDS)}ms")
196201

197-
lifecycle("Zip to mixin.apk...")
202+
lifecycle("Zip to mixin apk...")
198203
val stopWatchZipToApk = Stopwatch.createStarted()
199-
val mixinApkFile = project.projectDir.child("dist/mixin.apk")
200-
if (mixinApkFile.length() != targetApkFile.length())
204+
val mixinApkFile = project.outputDir(extension).child(extension.output.mixinApkFileName)
205+
if (mixinApkFile.length() != targetApkFile.length()) {
201206
targetApkFile.copyTo(mixinApkFile, overwrite = true)
207+
}
202208
ZipUtil.addOrReplaceFilesInZip(
203209
mixinApkFile,
204210
outputDexDir.listFiles()?.associateBy { it.name } ?: emptyMap()
205211
)
206212

207213
stopWatchZipToApk.stop()
208-
lifecycle("Mixin.apk written in ${stopWatchZipToApk.elapsed(TimeUnit.MILLISECONDS)}ms")
214+
lifecycle("Mixin apk written in ${stopWatchZipToApk.elapsed(TimeUnit.MILLISECONDS)}ms")
209215
}
210216

211217
private fun createDexRewriter(newClassesDex: DexFile, modifiedClasses: Map<String, ClassDef>): DexRewriter {

0 commit comments

Comments
 (0)