Merge branch 'fix/vivo_crash' into 'dev'

fix: 修复在 vivo 的 Android 14  设备上点击剪贴板功能时的闪退问题 https://sentry.shanqu.cc/organizations/lightgame/issues/277509

See merge request halo/android/assistant-android!1677
This commit is contained in:
陈君陶
2024-05-21 11:03:28 +08:00
2 changed files with 52 additions and 4 deletions

View File

@ -6,10 +6,7 @@ import com.android.build.api.transform.Transform
import com.android.build.api.transform.TransformInvocation
import com.android.build.gradle.AppExtension
import com.android.build.gradle.internal.pipeline.TransformManager
import com.gh.gamecenter.plugin.transform.ActivityTransformer
import com.gh.gamecenter.plugin.transform.DiskLruCacheTransformer
import com.gh.gamecenter.plugin.transform.ExoSourceManagerTransformer
import com.gh.gamecenter.plugin.transform.RoomTransformer
import com.gh.gamecenter.plugin.transform.*
import javassist.ClassPool
import org.apache.commons.io.FileUtils
import org.apache.commons.io.IOUtils
@ -51,6 +48,7 @@ class GhTransform(var project: Project) : Transform() {
mTransformHelper.addTransformer(DiskLruCacheTransformer())
mTransformHelper.addTransformer(RoomTransformer())
mTransformHelper.addTransformer(ActivityTransformer())
mTransformHelper.addTransformer(AppCompatEditTextTransformer())
}
/**

View File

@ -0,0 +1,50 @@
package com.gh.gamecenter.plugin.transform
import javassist.ClassPool
import javassist.CtClass
import javassist.NotFoundException
import javassist.bytecode.ClassFile
import java.io.BufferedInputStream
import java.io.DataInputStream
import java.io.InputStream
class AppCompatEditTextTransformer : Transformer {
private val classPool = ClassPool.getDefault()
override fun getModifyClassName(): String {
return "AppCompatEditText"
}
override fun modifyClass(filePath: String, inputStream: InputStream): CtClass? {
if (filePath.contains(getModifyClassName())) {
System.out.println("发现 AppCompatEditText")
val classFile = ClassFile(DataInputStream(BufferedInputStream(inputStream)))
val ctClass = classPool.get(classFile.name)
if (ctClass.isFrozen) {
ctClass.defrost()
}
// 使用 try catch 包裹找到的第一个 onTextContextMenuItem 方法 (若能找到的话)
// https://sentry.shanqu.cc/organizations/lightgame/issues/277509
try {
val ctMethod = ctClass.getDeclaredMethod("onTextContextMenuItem")
val exceptionType: CtClass = ClassPool.getDefault().get("java.lang.Exception")
val catchBody = "{ System.out.println(\$e); return false; }"
ctMethod.addCatch(catchBody, exceptionType)
System.out.println("为 AppCompatEditText.onTextContextMenuItem 添加 try catch")
} catch (e: NotFoundException) {
e.printStackTrace()
}
return ctClass
}
return null
}
}