提交 7d0e014f 编写于 作者: J johnsonlee

Commit optimizations for shared preferences

上级 10e6c8ca
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
dependencies {
compileOnly project(':booster-android-api')
}
package com.didiglobal.booster.instrument;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Looper;
public class ShadowEditor {
public static void apply(final SharedPreferences.Editor editor) {
if (Looper.myLooper() == Looper.getMainLooper()) {
AsyncTask.SERIAL_EXECUTOR.execute(new Runnable() {
@Override
public void run() {
editor.commit();
}
});
} else {
editor.commit();
}
}
}
dependencies {
compile project(':booster-transform-lint')
compile project(':booster-transform-shared-preferences')
compile project(':booster-transform-shrink')
compile project(':booster-transform-toast')
compile project(':booster-transform-usage')
......
apply from: '../gradle/booster.gradle'
dependencies {
kapt "com.google.auto.service:auto-service:1.0-rc4"
implementation project(':booster-android-gradle-api')
implementation project(':booster-gradle-base')
implementation project(':booster-task-spi')
implementation project(':booster-transform-asm')
compileOnly 'com.android.tools.build:gradle:3.0.0'
testCompileOnly 'com.android.tools.build:gradle:3.0.0'
}
package com.didiglobal.booster.transform.sharedpreferences
import com.didiglobal.booster.kotlinx.GREEN
import com.didiglobal.booster.kotlinx.RESET
import com.didiglobal.booster.kotlinx.asIterable
import com.didiglobal.booster.transform.TransformContext
import com.didiglobal.booster.transform.asm.ClassTransformer
import com.google.auto.service.AutoService
import jdk.internal.org.objectweb.asm.Opcodes
import org.objectweb.asm.tree.ClassNode
import org.objectweb.asm.tree.MethodInsnNode
import org.objectweb.asm.tree.MethodNode
/**
* Represents a transformer for *SharedPreferences* bug fixing
*
* @author johnsonlee
*/
@AutoService(ClassTransformer::class)
class SharedPreferencesEditorTransformer : ClassTransformer {
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
if (klass.name == SHADOW_EDITOR) {
return klass
}
klass.methods.forEach { method ->
method.instructions?.iterator()?.asIterable()?.filterIsInstance(MethodInsnNode::class.java)?.filter {
it.opcode == Opcodes.INVOKEINTERFACE && it.owner == SHARED_PREFERENCES_EDITOR
}?.forEach { invoke ->
when ("${invoke.name}${invoke.desc}") {
"commit()Z" -> {
// if the return value of commit() does not used
// use asynchronous commit() instead
if (Opcodes.POP == invoke.next?.opcode) {
optimize(invoke, klass, method)
method.instructions.remove(invoke.next)
}
}
"apply()V" -> {
optimize(invoke, klass, method)
}
}
}
}
return klass
}
}
private fun optimize(invoke: MethodInsnNode, klass: ClassNode, method: MethodNode) {
println(" * $GREEN${invoke.owner}.${invoke.name}${invoke.desc}$RESET => $GREEN$SHADOW_EDITOR.apply(L$SHARED_PREFERENCES_EDITOR;)V$RESET: ${klass.name}.${method.name}${method.desc}")
invoke.apply {
itf = false
owner = SHADOW_EDITOR
name = "apply"
opcode = Opcodes.INVOKESTATIC
desc = "(L$SHARED_PREFERENCES_EDITOR;)V"
}
}
private const val SHARED_PREFERENCES_EDITOR = "android/content/SharedPreferences\$Editor"
private const val SHADOW_EDITOR = "com/didiglobal/booster/instrument/ShadowEditor"
package com.didiglobal.booster.transform.sharedpreferences
import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.api.LibraryVariant
import com.didiglobal.booster.gradle.scope
import com.didiglobal.booster.task.spi.VariantProcessor
import com.didiglobal.booster.transform.shared.preferences.Build
import com.google.auto.service.AutoService
@AutoService(VariantProcessor::class)
class SharedPreferencesEditorVariantProcessor : VariantProcessor {
override fun process(variant: BaseVariant) {
if (variant !is LibraryVariant) {
variant.scope.globalScope.project.dependencies.add("implementation", "${Build.GROUP}:booster-android-instrument-shared-preferences:${Build.VERSION}")
}
}
}
include ':booster-aapt2'
include ':booster-android-api'
include ':booster-android-instrument'
include ':booster-android-instrument-shared-preferences'
include ':booster-android-instrument-toast'
include ':booster-android-gradle-api'
include ':booster-android-gradle-v3_0'
......@@ -15,10 +16,11 @@ include ':booster-task-permission'
include ':booster-task-spi'
include ':booster-transform-all'
include ':booster-transform-asm'
include ':booster-transform-toast'
include ':booster-transform-lint'
include ':booster-transform-spi'
include ':booster-transform-shared-preferences'
include ':booster-transform-shrink'
include ':booster-transform-toast'
include ':booster-transform-usage'
include ':booster-transform-util'
include ':booster-kotlinx'
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册