diff --git a/gradle.properties b/gradle.properties index 1ac7a592e..be6d466ed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,3 +14,4 @@ org.gradle.jvmargs=-Xmx4096m android.useAndroidX=true org.gradle.caching=true +android.nonTransitiveRClass=true diff --git a/projects/sample/source/sample-plugin/sample-base-lib/src/main/AndroidManifest.xml b/projects/sample/source/sample-plugin/sample-base-lib/src/main/AndroidManifest.xml index 7a2f6a139..2ba1085f2 100644 --- a/projects/sample/source/sample-plugin/sample-base-lib/src/main/AndroidManifest.xml +++ b/projects/sample/source/sample-plugin/sample-base-lib/src/main/AndroidManifest.xml @@ -4,10 +4,10 @@ diff --git a/projects/sample/source/sample-plugin/sample-base-lib/src/main/res/values/themes.xml b/projects/sample/source/sample-plugin/sample-base-lib/src/main/res/values/themes.xml new file mode 100644 index 000000000..066ac677b --- /dev/null +++ b/projects/sample/source/sample-plugin/sample-base-lib/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/projects/sample/source/sample-plugin/sample-base/src/main/AndroidManifest.xml b/projects/sample/source/sample-plugin/sample-base/src/main/AndroidManifest.xml index 4c511fd70..6b2b1e5e7 100644 --- a/projects/sample/source/sample-plugin/sample-base/src/main/AndroidManifest.xml +++ b/projects/sample/source/sample-plugin/sample-base/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ - + diff --git a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt index e4f60a100..1e822dbc6 100644 --- a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt +++ b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompat.kt @@ -22,19 +22,14 @@ import com.android.build.gradle.BaseExtension import com.android.build.gradle.api.ApplicationVariant import com.android.build.gradle.api.BaseVariantOutput import com.android.build.gradle.internal.dsl.ProductFlavor -import org.gradle.api.Project import org.gradle.api.Task -import java.io.File /** * 不同版本AGP的兼容层 */ internal interface AGPCompat { - fun getManifestFile(processManifestTask: Task): File - fun getPackageForR(project: Project, variantName: String): String fun addFlavorDimension(baseExtension: BaseExtension, dimensionName: String) fun setProductFlavorDefault(productFlavor: ProductFlavor, isDefault: Boolean) - fun getProcessManifestTask(output: BaseVariantOutput): Task fun getProcessResourcesTask(output: BaseVariantOutput): Task fun getAaptAdditionalParameters(processResourcesTask: Task): List fun getMinSdkVersion(pluginVariant: ApplicationVariant): Int diff --git a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt index ba7f14947..39fe43d4f 100644 --- a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt +++ b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/AGPCompatImpl.kt @@ -1,28 +1,16 @@ package com.tencent.shadow.core.gradle -import com.android.SdkConstants import com.android.build.gradle.BaseExtension import com.android.build.gradle.api.ApplicationVariant import com.android.build.gradle.api.BaseVariantOutput import com.android.build.gradle.internal.dsl.ProductFlavor import com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask -import com.android.build.gradle.tasks.ProcessApplicationManifest -import com.android.build.gradle.tasks.ProcessMultiApkApplicationManifest import com.android.sdklib.AndroidVersion.VersionCodes -import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.provider.Property -import java.io.File internal class AGPCompatImpl : AGPCompat { - override fun getProcessManifestTask(output: BaseVariantOutput): Task = - try { - output.processManifestProvider.get() - } catch (e: NoSuchMethodError) { - output.processManifest - } - override fun getProcessResourcesTask(output: BaseVariantOutput): Task = try { output.processResourcesProvider.get() @@ -57,58 +45,6 @@ internal class AGPCompatImpl : AGPCompat { additionalParameters ?: listOf() } - - override fun getManifestFile(processManifestTask: Task) = - when (processManifestTask.javaClass.superclass.simpleName) { - "ProcessMultiApkApplicationManifest" -> { - (processManifestTask as ProcessMultiApkApplicationManifest) - .mainMergedManifest.get().asFile - } - "ProcessApplicationManifest" -> { - try { - (processManifestTask as ProcessApplicationManifest) - .mergedManifest.get().asFile - } catch (e: NoSuchMethodError) { - //AGP小于4.1.0 - val dir = - processManifestTask.outputs.files.files - .first { it.parentFile.name == "merged_manifests" } - File(dir, SdkConstants.ANDROID_MANIFEST_XML) - } - } - "MergeManifests" -> { - val dir = try {// AGP 3.2.0 - processManifestTask.outputs.files.files - .first { it.parentFile.parentFile.parentFile.name == "merged_manifests" } - } catch (e: NoSuchElementException) { - // AGP 3.1.0 - processManifestTask.outputs.files.files - .first { it.path.contains("intermediates${File.separator}manifests${File.separator}full${File.separator}") } - } - File(dir, SdkConstants.ANDROID_MANIFEST_XML) - } - else -> throw IllegalStateException("不支持的Task类型:${processManifestTask.javaClass}") - } - - override fun getPackageForR(project: Project, variantName: String): String { - val linkApplicationAndroidResourcesTask = - project.tasks.getByName("process${variantName.capitalize()}Resources") - return getStringFromProperty( - when { - linkApplicationAndroidResourcesTask.hasProperty("namespace") -> { - linkApplicationAndroidResourcesTask.property("namespace") - } - linkApplicationAndroidResourcesTask.hasProperty("originalApplicationId") -> { - linkApplicationAndroidResourcesTask.property("originalApplicationId") - } - linkApplicationAndroidResourcesTask.hasProperty("packageName") -> { - linkApplicationAndroidResourcesTask.property("packageName") - } - else -> throw IllegalStateException("不支持的AGP版本") - } - ) - } - override fun addFlavorDimension(baseExtension: BaseExtension, dimensionName: String) { val flavorDimensionList = baseExtension.flavorDimensionList as MutableList? // AGP 3.6.0版本可能返回null diff --git a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt index 2cd1a458a..8f3f64c8f 100644 --- a/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt +++ b/projects/sdk/core/gradle-plugin/src/main/kotlin/com/tencent/shadow/core/gradle/ShadowPlugin.kt @@ -30,6 +30,8 @@ import com.tencent.shadow.core.transform_kit.ClassPoolBuilder import org.gradle.api.* import org.gradle.api.tasks.compile.JavaCompile import java.io.File +import java.net.URLClassLoader +import java.util.zip.ZipFile class ShadowPlugin : Plugin { @@ -65,6 +67,8 @@ class ShadowPlugin : Plugin { createPackagePluginTasks(project) + addLocateApkanalyzerTask(project) + onEachPluginVariant(project) { pluginVariant -> checkAaptPackageIdConfig(pluginVariant) @@ -77,6 +81,44 @@ class ShadowPlugin : Plugin { checkKotlinAndroidPluginForPluginManifestTask(project) } + private fun addLocateApkanalyzerTask(project: Project) { + val appExtension: AppExtension = + project.extensions.getByType(AppExtension::class.java) + val sdkDirectory = appExtension.sdkDirectory + val outputFile = project.locateApkanalyzerResultPath() + + project.tasks.register(locateApkanalyzerTaskName) { + it.inputs.property("sdkPath", sdkDirectory.path) + it.outputs.file(outputFile).withPropertyName("locateApkanalyzerResultPath") + + it.doLast { + // 如果其他project的此任务执行过了,就不用再查找了 + if (outputFile.exists() && File(outputFile.readText()).exists()) { + return@doLast + } + + // 找出apkanalyzer.jar.它是build tool的一部分,但位置随着版本有变化,所以这里用搜索文件确定位置 + // 如果有多个版本,随机取第一个,因为只用decodeXml方法,预期不同版本没什么区别。 + val apkanalyzerJarFile = + try { + sdkDirectory.walk().filter { it.name.equals("apkanalyzer.jar") } + .first() + } catch (e: NoSuchElementException) { + // https://developer.android.com/studio/command-line/apkanalyzer + // https://developer.android.com/studio/releases/sdk-tools + throw Error( + "找不到apkanalyzer.jar.它来自:" + + "SDK Tools, Revision 26.1.1 (September 2017)," + + "如果高版本SDK也找不到这个文件,Shadow就需要更新了。" + ) + } + + outputFile.parentFile.mkdirs() + outputFile.writeText(apkanalyzerJarFile.absolutePath) + } + } + } + /** * GeneratePluginManifestTask会向android DSL添加新的java源码目录, * 而kotlin-android会在syncKotlinAndAndroidSourceSets中接管java的源码目录, @@ -124,6 +166,7 @@ class ShadowPlugin : Plugin { /** * 创建生成PluginManifest.java的任务 */ + @Suppress("PrivateApi")// for use BinaryXmlParser(apkanalyzer) private fun createGeneratePluginManifestTasks( project: Project, appExtension: AppExtension, @@ -131,34 +174,80 @@ class ShadowPlugin : Plugin { ) { val output = pluginVariant.outputs.first() - val processManifestTask = agpCompat.getProcessManifestTask(output) - val manifestFile = agpCompat.getManifestFile(processManifestTask) val variantName = pluginVariant.name - val outputDir = File(project.buildDir, "generated/source/pluginManifest/$variantName") + val capitalizeVariantName = variantName.capitalize() + + // 找出ap_文件 + val processResourcesTask = agpCompat.getProcessResourcesTask(output) + val processedResFile = File( + processResourcesTask.outputs.files.files.first { it.name.equals("out") }, + "resources-$variantName.ap_" + ) + + // decodeBinaryManifestTask输出的apkanalyzer manifest print结果文件 + val decodeXml = File( + project.buildDir, + "intermediates/decodeBinaryManifest/$variantName/AndroidManifest.xml" + ) + + // 添加decodeXml任务 + val decodeBinaryManifestTask = + project.tasks.register("decode${capitalizeVariantName}BinaryManifest") { + it.dependsOn(locateApkanalyzerTaskName) + it.dependsOn(processResourcesTask) + it.inputs.file(processedResFile) + it.outputs.file(decodeXml).withPropertyName("decodeXml") + + it.doLast { + val jarPath = File(project.locateApkanalyzerResultPath().readText()) + val tempCL = URLClassLoader(arrayOf(jarPath.toURL()), contextClassLoader) + val binaryXmlParserClass = + tempCL.loadClass("com.android.tools.apk.analyzer.BinaryXmlParser") + val decodeXmlMethod = binaryXmlParserClass.getDeclaredMethod( + "decodeXml", + String::class.java, + ByteArray::class.java + ) + + val zipFile = ZipFile(processedResFile) + val binaryXml = zipFile.getInputStream( + zipFile.getEntry("AndroidManifest.xml") + ).readBytes() + + val outputXmlBytes = decodeXmlMethod.invoke( + null, + "AndroidManifest.xml", + binaryXml + ) as ByteArray + decodeXml.parentFile.mkdirs() + decodeXml.writeBytes(outputXmlBytes) + } + } + // 添加生成PluginManifest.java任务 + val pluginManifestSourceDir = + File(project.buildDir, "generated/source/pluginManifest/$variantName") val generatePluginManifestTask = - project.tasks.register("generate${variantName.capitalize()}PluginManifest") { - it.dependsOn(processManifestTask) - it.inputs.file(manifestFile) - it.outputs.dir(outputDir).withPropertyName("outputDir") - - val packageForR = agpCompat.getPackageForR(project, variantName) + project.tasks.register("generate${capitalizeVariantName}PluginManifest") { + it.dependsOn(decodeBinaryManifestTask) + it.inputs.file(decodeXml) + it.outputs.dir(pluginManifestSourceDir).withPropertyName("pluginManifestSourceDir") it.doLast { generatePluginManifest( - manifestFile, - outputDir, - "com.tencent.shadow.core.manifest_parser", - packageForR + decodeXml, + pluginManifestSourceDir, + "com.tencent.shadow.core.manifest_parser" ) } } - val javacTask = project.tasks.getByName("compile${variantName.capitalize()}JavaWithJavac") + val javacTask = project.tasks.getByName("compile${capitalizeVariantName}JavaWithJavac") javacTask.dependsOn(generatePluginManifestTask) // 把PluginManifest.java添加为源码 - val relativePath = project.projectDir.toPath().relativize(outputDir.toPath()).toString() + val relativePath = + project.projectDir.toPath().relativize(pluginManifestSourceDir.toPath()).toString() (javacTask as JavaCompile).source(project.fileTree(relativePath)) } @@ -288,6 +377,10 @@ class ShadowPlugin : Plugin { } companion object { + const val locateApkanalyzerTaskName = "locateApkanalyzer" + private fun Project.locateApkanalyzerResultPath() = + File(rootProject.buildDir, "shadow/ApkanalyzerPath.txt") + private fun buildAgpCompat(project: Project): AGPCompat { return AGPCompatImpl() } diff --git a/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/ManifestParser.kt b/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/ManifestParser.kt index be7fc0c5b..0b389ce2e 100644 --- a/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/ManifestParser.kt +++ b/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/ManifestParser.kt @@ -9,15 +9,13 @@ import java.io.File * 一般位于apk工程的build/intermediates/merged_manifest目录中。 * @param outputDir 生成文件的输出目录 * @param packageName 生成类的包名 - * @param packageForR 生成对R.java引用时需要的R文件的包名 */ fun generatePluginManifest( xmlFile: File, outputDir: File, - packageName: String, - packageForR: String + packageName: String ) { val androidManifest = AndroidManifestReader().read(xmlFile) - val generator = PluginManifestGenerator(packageForR) + val generator = PluginManifestGenerator() generator.generate(androidManifest, outputDir, packageName) } \ No newline at end of file diff --git a/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGenerator.kt b/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGenerator.kt index 3497bd0b3..b6a7c5b8a 100644 --- a/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGenerator.kt +++ b/projects/sdk/core/manifest-parser/src/main/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGenerator.kt @@ -11,10 +11,8 @@ import javax.lang.model.element.Modifier * * 将Loader所需的插件Manifest信息生成为Java文件, * 添加runtime中PluginManifest接口的实现方法 - * - * @param packageForR 生成对R.java引用时需要的R文件的包名 */ -class PluginManifestGenerator(private val packageForR: String) { +class PluginManifestGenerator { /** * 生成器入口方法 * @@ -25,7 +23,7 @@ class PluginManifestGenerator(private val packageForR: String) { * @param packageName 生成类的包名 */ fun generate(manifestMap: ManifestMap, outputDir: File, packageName: String) { - val pluginManifestBuilder = PluginManifestBuilder(manifestMap, packageForR) + val pluginManifestBuilder = PluginManifestBuilder(manifestMap) val pluginManifest = pluginManifestBuilder.build() JavaFile.builder(packageName, pluginManifest) .build() @@ -33,10 +31,7 @@ class PluginManifestGenerator(private val packageForR: String) { } } -private class PluginManifestBuilder( - val manifestMap: ManifestMap, - val packageForR: String -) { +private class PluginManifestBuilder(val manifestMap: ManifestMap) { val classBuilder: TypeSpec.Builder = TypeSpec.classBuilder("PluginManifest") .addSuperinterface(ClassName.get(PluginManifest::class.java)) @@ -177,7 +172,7 @@ private class PluginManifestBuilder( manifestValue: Any, ): FieldSpec { - val resIdLiteral = themeStringToResId(manifestValue, packageForR) + val resIdLiteral = themeStringToResId(manifestValue) return privateStaticFinalIntFieldBuilder(fieldName) .initializer( CodeBlock.of("$1L", resIdLiteral) @@ -200,13 +195,13 @@ private class PluginManifestBuilder( } val themeLiteral = makeResIdLiteral(AndroidManifestKeys.theme) { - themeStringToResId(it, packageForR) + themeStringToResId(it) } val configChangesLiteral = makeResIdLiteral(AndroidManifestKeys.configChanges) { - configChangesToInt(it) + it } val softInputModeLiteral = makeResIdLiteral(AndroidManifestKeys.windowSoftInputMode) { - windowSoftInputModeToInt(it) + it } return "new com.tencent.shadow.core.runtime.PluginManifest" + @@ -278,87 +273,14 @@ private class PluginManifestBuilder( fun nullCodeBlock() = CodeBlock.of("null")!! - fun themeStringToResId(manifestValue: Any, packageForR: String): String { - val resName = manifestValue as String // for example: @style/TestPluginTheme - val split = resName.split('/') - val packagePart = split[0] // for example: @style - val namePart = split[1] // for example: TestPluginTheme - - val isSystemResource = packagePart.startsWith("@android:") - val packageNameOfRClass = if (isSystemResource) { - "android" - } else { - packageForR - } - - val innerClassName = if (isSystemResource) { // for example: style - packagePart.removePrefix("@android:") + fun themeStringToResId(manifestValue: Any): String { + val formatValue = manifestValue as String // for example: @ref/0x7e0b009e + if (formatValue.startsWith("@ref/")) { + return formatValue.removePrefix("@ref/") } else { - packagePart.removePrefix("@") + // 其余格式:https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:apkparser/analyzer/src/main/java/com/android/tools/apk/analyzer/BinaryXmlParser.java;l=193 + throw TODO("不支持其他格式") } - - val resIdFieldName = namePart.replace('.', '_') - return "${packageNameOfRClass}.R.${innerClassName}.${resIdFieldName}" } - - private fun flagsToInt( - stringValue: String, - className: String, - fieldMap: (String) -> String, - ): String = - stringValue.split('|') - .map(String::trim) - .map(fieldMap) - .map { "${className}.${it}" } - .reduce { acc, i -> "$acc|$i" } - - private fun configChangesToInt(configChangesValue: String): String = - flagsToInt( - configChangesValue, - "android.content.pm.ActivityInfo" - ) { - when (it) { - "mcc" -> "CONFIG_MCC" - "mnc" -> "CONFIG_MNC" - "locale" -> "CONFIG_LOCALE" - "touchscreen" -> "CONFIG_TOUCHSCREEN" - "keyboard" -> "CONFIG_KEYBOARD" - "keyboardHidden" -> "CONFIG_KEYBOARD_HIDDEN" - "navigation" -> "CONFIG_NAVIGATION" - "orientation" -> "CONFIG_ORIENTATION" - "screenLayout" -> "CONFIG_SCREEN_LAYOUT" - "uiMode" -> "CONFIG_UI_MODE" - "screenSize" -> "CONFIG_SCREEN_SIZE" - "smallestScreenSize" -> "CONFIG_SMALLEST_SCREEN_SIZE" - "density" -> "CONFIG_DENSITY" - "layoutDirection" -> "CONFIG_LAYOUT_DIRECTION" - "colorMode" -> "CONFIG_COLOR_MODE" - "assetsPaths" -> "CONFIG_ASSETS_PATHS" - "fontScale" -> "CONFIG_FONT_SCALE" - "windowConfiguration" -> "CONFIG_WINDOW_CONFIGURATION" - else -> throw IllegalArgumentException("不认识$it") - } - } - - private fun windowSoftInputModeToInt(windowSoftInputModeValue: String): String = - flagsToInt( - windowSoftInputModeValue, - "android.view.WindowManager.LayoutParams" - ) { - when (it) { - "stateUnspecified" -> "SOFT_INPUT_STATE_UNSPECIFIED" - "stateUnchanged" -> "SOFT_INPUT_STATE_UNCHANGED" - "stateHidden" -> "SOFT_INPUT_STATE_HIDDEN" - "stateAlwaysHidden" -> "SOFT_INPUT_STATE_ALWAYS_HIDDEN" - "stateVisible" -> "SOFT_INPUT_STATE_VISIBLE" - "stateAlwaysVisible" -> "SOFT_INPUT_STATE_ALWAYS_VISIBLE" - "adjustUnspecified" -> "SOFT_INPUT_ADJUST_UNSPECIFIED" - "adjustResize" -> "SOFT_INPUT_ADJUST_RESIZE" - "adjustPan" -> "SOFT_INPUT_ADJUST_PAN" - "adjustNothing" -> "SOFT_INPUT_ADJUST_NOTHING" - "isForwardNavigation" -> "SOFT_INPUT_IS_FORWARD_NAVIGATION" - else -> throw IllegalArgumentException("不认识$it") - } - } } } diff --git a/projects/sdk/core/manifest-parser/src/test/java/android/R.java b/projects/sdk/core/manifest-parser/src/test/java/android/R.java deleted file mode 100644 index 71954adcf..000000000 --- a/projects/sdk/core/manifest-parser/src/test/java/android/R.java +++ /dev/null @@ -1,7 +0,0 @@ -package android; - -public final class R { - public static final class style { - public static final int Theme_NoTitleBar = 0x01030006; - } -} diff --git a/projects/sdk/core/manifest-parser/src/test/java/android/content/pm/ActivityInfo.java b/projects/sdk/core/manifest-parser/src/test/java/android/content/pm/ActivityInfo.java deleted file mode 100644 index feade0592..000000000 --- a/projects/sdk/core/manifest-parser/src/test/java/android/content/pm/ActivityInfo.java +++ /dev/null @@ -1,42 +0,0 @@ -package android.content.pm; - -/** - * mock for test - */ -public interface ActivityInfo { - int CONFIG_MCC = 0x0001; - - int CONFIG_MNC = 0x0002; - - int CONFIG_LOCALE = 0x0004; - - int CONFIG_TOUCHSCREEN = 0x0008; - - int CONFIG_KEYBOARD = 0x0010; - - int CONFIG_KEYBOARD_HIDDEN = 0x0020; - - int CONFIG_NAVIGATION = 0x0040; - - int CONFIG_ORIENTATION = 0x0080; - - int CONFIG_SCREEN_LAYOUT = 0x0100; - - int CONFIG_UI_MODE = 0x0200; - - int CONFIG_SCREEN_SIZE = 0x0400; - - int CONFIG_SMALLEST_SCREEN_SIZE = 0x0800; - - int CONFIG_DENSITY = 0x1000; - - int CONFIG_LAYOUT_DIRECTION = 0x2000; - - int CONFIG_COLOR_MODE = 0x4000; - - int CONFIG_ASSETS_PATHS = 0x80000000; - - int CONFIG_FONT_SCALE = 0x40000000; - - int CONFIG_WINDOW_CONFIGURATION = 0x20000000; -} diff --git a/projects/sdk/core/manifest-parser/src/test/java/android/view/WindowManager.java b/projects/sdk/core/manifest-parser/src/test/java/android/view/WindowManager.java deleted file mode 100644 index 3e5686e33..000000000 --- a/projects/sdk/core/manifest-parser/src/test/java/android/view/WindowManager.java +++ /dev/null @@ -1,21 +0,0 @@ -package android.view; - -/** - * mock for test - */ -public interface WindowManager { - interface LayoutParams { - int SOFT_INPUT_STATE_UNSPECIFIED = 0; - int SOFT_INPUT_STATE_UNCHANGED = 1; - int SOFT_INPUT_STATE_HIDDEN = 2; - int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3; - int SOFT_INPUT_STATE_VISIBLE = 4; - int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5; - int SOFT_INPUT_MASK_ADJUST = 0xf0; - int SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00; - int SOFT_INPUT_ADJUST_RESIZE = 0x10; - int SOFT_INPUT_ADJUST_PAN = 0x20; - int SOFT_INPUT_ADJUST_NOTHING = 0x30; - int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100; - } -} diff --git a/projects/sdk/core/manifest-parser/src/test/java/com/tencent/shadow/sample/plugin/app/lib/R.java b/projects/sdk/core/manifest-parser/src/test/java/com/tencent/shadow/sample/plugin/app/lib/R.java deleted file mode 100644 index 9780277ca..000000000 --- a/projects/sdk/core/manifest-parser/src/test/java/com/tencent/shadow/sample/plugin/app/lib/R.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tencent.shadow.sample.plugin.app.lib; - -public final class R { - public static final class style { - public static final int TestPluginTheme = 0x7f030001; - } -} diff --git a/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/AndroidManifestReaderTest.kt b/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/AndroidManifestReaderTest.kt index 1201fa1d5..3684447a3 100644 --- a/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/AndroidManifestReaderTest.kt +++ b/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/AndroidManifestReaderTest.kt @@ -22,7 +22,7 @@ class AndroidManifestReaderTest { androidManifest[AndroidManifestKeys.appComponentFactory] ) Assert.assertEquals( - "@android:style/Theme.NoTitleBar", + "@ref/0x01030006", androidManifest[AndroidManifestKeys.theme] ) } diff --git a/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGeneratorTest.kt b/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGeneratorTest.kt index f1795e39c..1a6ab3cd9 100644 --- a/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGeneratorTest.kt +++ b/projects/sdk/core/manifest-parser/src/test/kotlin/com/tencent/shadow/core/manifest_parser/PluginManifestGeneratorTest.kt @@ -8,23 +8,23 @@ class PluginManifestGeneratorTest { @Test fun testCompileCaseAsLittleAsPossible() { - testCompile("case_as_little_as_possible.xml", "") + testCompile("case_as_little_as_possible.xml") } @Test fun testNoAppComponentFactory() { - testCompile("noAppComponentFactory.xml", "") + testCompile("noAppComponentFactory.xml") } @Test fun testCompileSampleApp() { - testCompile("sample-app.xml", "com.tencent.shadow.sample.plugin.app.lib") + testCompile("sample-app.xml") } - private fun testCompile(case: String, packageForR: String) { + private fun testCompile(case: String) { val testFile = File(javaClass.classLoader.getResource(case)!!.toURI()) val androidManifest = AndroidManifestReader().read(testFile) - val generator = PluginManifestGenerator(packageForR) + val generator = PluginManifestGenerator() val tempBuildDir = File("build", "PluginManifestGeneratorTest") val outputDir = File(tempBuildDir, case) diff --git a/projects/sdk/core/manifest-parser/src/test/resources/sample-app.xml b/projects/sdk/core/manifest-parser/src/test/resources/sample-app.xml index ac4789f54..37d90bf1f 100644 --- a/projects/sdk/core/manifest-parser/src/test/resources/sample-app.xml +++ b/projects/sdk/core/manifest-parser/src/test/resources/sample-app.xml @@ -1,20 +1,22 @@ - + + android:versionName="local" android:compileSdkVersion="31" + android:compileSdkVersionCodename="12" package="com.tencent.shadow.sample.host" + platformBuildVersionCode="31" platformBuildVersionName="12"> - + - + android:name="com.tencent.shadow.sample.plugin.app.lib.UseCaseApplication" + android:debuggable="true"> - - + android:configChanges="0x40000480" android:windowSoftInputMode="0x10" /> + android:windowSoftInputMode="0x4" /> @@ -41,8 +43,7 @@ android:name="com.tencent.shadow.sample.plugin.app.lib.usecases.activity.TestActivityReCreateBySystem" /> + android:name="com.tencent.shadow.sample.plugin.app.lib.usecases.receiver.TestReceiverActivity" /> @@ -65,9 +66,7 @@ - - /> - + - -