[开发笔记] [Android][Update Kotlin Version] [Update SDK Version]

前言

每个 Android Developer 都会遇到要升级 Android SDKKotlin Language VersionLibrary 的时候,
而当升级完毕尝试 Build 一下
没事就安然度过一天 有事就冷静处理等升天
当你认爲某个 Error 是这个的关係,尝试更新 Library Version 后又出现其他 Error,这算还好!
当处理一系列的 Error 后,殊不知又回到一开始的 Error 时,这时脑中就开始想起胡夏 又回到最初的起点~
光这次升级,胡夏就在我脑袋中唱了3、4次那些年,我带同事作一次又再唱好几次 ....

再看下去之前先来回顾一下 胡夏的那些年吧 (Yt)!


需求

Update Stripe Library Version
16.0.0 --> 20.8.0

我做过一些 research 如果要升级到20.5.0 - 20.8.0 最基本要同时升级的问题:

Android SDK 31
GradleVersion 5.4.1
KotlinVersion 1.6.0
coding 上修改语法配合API 31

build.gradle新增插件
implementation ‘com.google.dagger:dagger:2.27’
annotationProcessor “com.google.dagger:dagger-compiler:2.27”

升级build.gradle插件:
implementation ‘com.stripe:stripe-android:20.5.0’


Step

更新 Stripe

Maven


Build Exception : The minCompileSdk (31) specified in a dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties) is greater than this module's compileSdkVersion (android-30).

The minCompileSdk (31) specified in adependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)is greater than this module's compileSdkVersion (android-30).Dependency: androidx.appcompat:appcompat:1.4.1.AAR metadata file: /Users/username/.gradle/caches/transforms-2/files-2.1/5c1f32c78a72902c36b66aa50e7efafb/appcompat-1.4.1/META-INF/com/android/build/gradle/aar-metadata.properties.

更新 SdkVersion

compileSdkVersion = 31minSdkVersion = 23targetSdkVersion = 31

Build Exception : Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed

Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed/Users/username/app-name/app/src/main/res/layout/fragment_address_add.xml:107: AAPT: error: resource drawable/ic_arrow (aka com.packageName.appId.uat:drawable/ic_arrow) not found.    /Users/username/app-name/app/src/main/res/layout/fragment_address_add.xml:125: AAPT: error: resource drawable/ic_arrow (aka com.packageName.appId.uat:drawable/ic_arrow) not found.    /Users/username/app-name/app/src/main/res/layout/fragment_cart_delivery.xml:170: AAPT: error: resource drawable/ic_arrow (aka com.packageName.appId.uat:drawable/ic_arrow) not found.    /Users/username/app-name/app/src/main/res/layout/fragment_cart_delivery.xml:187: AAPT: error: resource drawable/ic_arrow (aka com.packageName.appId.uat:drawable/ic_arrow) not found.    /Users/username/app-name/app/src/main/res/layout/fragment_cart_delivery.xml:251: AAPT: error: resource drawable/ic_arrow (aka com.packageName.appId.uat:drawable/ic_arrow) not found.    

更改 drawableId

ic_arrow --> ic_arrow_down

Build Exception


w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:

类路径中的运行时 JAR 文件应该具有相同的版本。 这些文件在类路径中找到:

    /Users/username/.gradle/caches/transforms-2/files-2.1/ed1791edcdff7f9300e8883e6f10ce2c/jetified-kotlin-stdlib-jdk8-1.6.10.jar (version 1.6)    /Users/username/.gradle/caches/transforms-2/files-2.1/d943c03d26b2a6908c45cb49e800fc6d/jetified-kotlin-stdlib-jdk7-1.6.10.jar (version 1.6)    /Users/username/.gradle/caches/transforms-2/files-2.1/581b1a3ffda168a8ea92dfef7cdb0d9b/jetified-kotlin-reflect-1.4.0.jar (version 1.4)    /Users/username/.gradle/caches/transforms-2/files-2.1/755fb8ca5be53840e3926c4769461a40/jetified-kotlin-stdlib-1.6.21.jar (version 1.6)    /Users/username/.gradle/caches/transforms-2/files-2.1/b9f335f68f3f6214cb85ac89109d4285/jetified-kotlin-stdlib-common-1.6.21.jar (version 1.6)
/jetified-kotlin-stdlib-jdk8-1.6.10.jar (version 1.6)/jetified-kotlin-stdlib-jdk7-1.6.10.jar (version 1.6)/jetified-kotlin-reflect-1.4.0.jar (version 1.4)/jetified-kotlin-stdlib-1.6.21.jar (version 1.6)/jetified-kotlin-stdlib-common-1.6.21.jar (version 1.6)

w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath

类路径中的某些运行时 JAR 文件的版本不兼容。 考虑将它们从类路径中删除

/jetified-paymentsheet-20.5.0-api.jar!/META-INF/paymentsheet_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-payments-core-20.5.0-api.jar!/META-INF/payments-core_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-stripe-core-20.5.0-api.jar!/META-INF/stripe-core_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-kotlin-stdlib-1.6.21.jar!/META-INF/kotlin-stdlib.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-payments-model-20.5.0-api.jar!/META-INF/payments-model_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./navigation-runtime-2.4.2-api.jar!/META-INF/navigation-runtime_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-kotlinx-coroutines-core-jvm-1.6.1.jar!/META-INF/kotlinx-coroutines-core.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-kotlin-stdlib-common-1.6.21.jar!/META-INF/kotlin-stdlib-common.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-kotlinx-coroutines-android-1.6.1.jar!/META-INF/kotlinx-coroutines-android.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./navigation-common-2.4.2-api.jar!/META-INF/navigation-common_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-kotlin-stdlib-jdk7-1.6.10.jar!/META-INF/kotlin-stdlib-jdk7.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-kotlin-android-extensions-runtime-1.6.10.jar!/META-INF/kotlin-android-extensions-runtime.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1./jetified-kotlin-stdlib-jdk8-1.6.10.jar!/META-INF/kotlin-stdlib-jdk8.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1.

更新 Kotlin Version

The binary version of its metadata is 1.6.0, expected version is 1.4.1.

尝试将 Kotlin 版本更新至 1.6 版本

而使用 Depedencies 有使用 kotlin version 的插件为

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

Maven

ext.kotlin_version = '1.4.21'

尝试改为

ext.kotlin_version = '1.6.21'

Build Exception : A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction

> Task :app:kaptUatDebugKotlin/Users/username/app-name/app/build/tmp/kapt3/stubs/uatDebug/com/packageName/appId/di/AssistedInjectModule.java:7: error: cannot find symbol@dagger.Module(includes = {AssistedInject_AssistedInjectModule.class})                           ^  symbol: class AssistedInject_AssistedInjectModuleNote: [1] Wrote GeneratedAppGlideModule with: [com.bumptech.glide.integration.okhttp3.OkHttpLibraryGlideModule]> Task :app:kaptUatDebugKotlin FAILEDExecution failed for task ':app:kaptUatDebugKotlin'.> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction   > java.lang.reflect.InvocationTargetException (no error message)* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

AssistedInjectModule

package com.packageName.appId.di;import java.lang.System;@com.squareup.inject.assisted.dagger2.AssistedModule()@kotlin.Metadata(mv = {1, 6, 0}, k = 1, d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\b\'\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002\u00a8\u0006\u0003"}, d2 = {"Lcom/packageName/appId/di/AssistedInjectModule;", "", "()V", "app_uatDebug"})@dagger.Module(includes = {AssistedInject_AssistedInjectModule.class})public abstract class AssistedInjectModule {        public AssistedInjectModule() {        super();    }}

AssistedInjectModule 跟 com.squareup.inject.assisted.dagger2.AssistedModule 有关係

//  Dependency InjectioncompileOnly "com.squareup.inject:assisted-inject-annotations-dagger2:$rootProject.assistedInjectVersion"kapt "com.squareup.inject:assisted-inject-processor-dagger2:$rootProject.assistedInjectVersion"

更新 Assisted Inject Dagger 2

assistedInjectVersion = '0.5.2'
更新为

assistedInjectVersion = '0.7.0'

Maven

Rebuild

> Task :app:kaptUatDebugKotlin FAILED/Users/username/app-name/app/build/tmp/kapt3/stubs/uatDebug/com/packageName/appId/di/AssistedInjectModule.java:7: error: cannot find symbol@dagger.Module(includes = {AssistedInject_AssistedInjectModule.class})                           ^  symbol: class AssistedInject_AssistedInjectModuleNote: [1] Wrote GeneratedAppGlideModule with: [com.bumptech.glide.integration.okhttp3.OkHttpLibraryGlideModule]Execution failed for task ':app:kaptUatDebugKotlin'.> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction   > java.lang.reflect.InvocationTargetException (no error message)* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

恢复 Assisted Inject Dagger 2

assistedInjectVersion = '0.7.0'

恢复为

assistedInjectVersion = '0.5.2'

comment

//    implementation('com.github.bumptech.glide:glide:$rootProject.glideVersion') {//        exclude group: "com.android.support"//    }

更新 Glide

跟这个没关係

glideVersion = '4.11.0'

更新为

glideVersion = '4.12.0'

Rebulid

没有了

Note: [1] Wrote GeneratedAppGlideModule with: [com.bumptech.glide.integration.okhttp3.OkHttpLibraryGlideModule]

但还是报错

/Users/username/app-name/app/build/tmp/kapt3/stubs/uatDebug/com/packageName/appId/di/AssistedInjectModule.java:7: error: cannot find symbol@dagger.Module(includes = {AssistedInject_AssistedInjectModule.class})                           ^  symbol: class AssistedInject_AssistedInjectModuleFAILURE: Build completed with 3 failures.

Build Exception : Caused by: java.lang.IllegalStateException: Could not parse metadata! This should only happen if you're using Kotlin <1.1.

Caused by: java.lang.IllegalStateException: Could not parse metadata! This should only happen if you're using Kotlin <1.1.at com.squareup.moshi.kotlinpoet.metadata.KotlinPoetMetadata.readKotlinClassMetadata(KotlinPoetMetadata.kt:83)at com.squareup.moshi.kotlinpoet.metadata.KotlinPoetMetadata.toImmutableKmClass(KotlinPoetMetadata.kt:113)at com.squareup.moshi.kotlin.codegen.MoshiCachedClassInspector.toImmutableKmClass(MoshiCachedClassInspector.kt:22)Caused by: java.lang.IllegalStateException: Could not parse metadata! This should only happen if you're using Kotlin <1.1.at com.squareup.moshi.kotlin.codegen.MetadataKt.targetType(metadata.kt:126)at com.squareup.moshi.kotlin.codegen.JsonClassCodegenProcessor.adapterGenerator(JsonClassCodegenProcessor.kt:146)at com.squareup.moshi.kotlin.codegen.JsonClassCodegenProcessor.process(JsonClassCodegenProcessor.kt:115)at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:188)at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)... 38 more

有可能是 Dagger 的问题

This is due to Dagger's use of older version of kotlinx-metadata-jvm. See https://youtrack.jetbrains.com/issue/KT-45885Update your dagger to 2.34

更新 Moshi Version

目前为 MoshiVersion = 1.10.0

Maven

MoshiVersion 更新为 1.3.0


Build Exception : ailed to transform moshi-1.13.0.jar to match attributes

Execution failed for task ':app:checkDevDebugDuplicateClasses'.> Could not resolve all files for configuration ':app:devDebugRuntimeClasspath'.   > Failed to transform moshi-1.13.0.jar (com.squareup.moshi:moshi:1.13.0) to match attributes {artifactType=enumerated-runtime-classes, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.jvm.environment=standard-jvm, org.gradle.jvm.version=8, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-runtime, org.jetbrains.kotlin.platform.type=jvm}.      > Execution failed for JetifyTransform: /Users/username/.gradle/caches/modules-2/files-2.1/com.squareup.moshi/moshi/1.13.0/da685586facab9eb5c4fb630ce248be14e7da21b/moshi-1.13.0.jar.         > Failed to transform '/Users/username/.gradle/caches/modules-2/files-2.1/com.squareup.moshi/moshi/1.13.0/da685586facab9eb5c4fb630ce248be14e7da21b/moshi-1.13.0.jar' using Jetifier. Reason: IllegalArgumentException, message: Unsupported class file major version 60. (Run with --stacktrace for more details.)           Suggestions:            - Check out existing issues at https://issuetracker.google.com/issues?q=componentid:460323&s=modified_time:desc, it's possible that this issue has already been filed there.            - If this issue has not been filed, please report it at https://issuetracker.google.com/issues/new?component=460323 (run with --stacktrace and provide a stack trace if possible).

app:checkDevDebugDuplicateClasses


更新 Gradle 版本

Maven


AndroidLintAnalysisTask IllegalArgumentException warning because unsupported class files in META-INF


Build Exception : Manifest merger failed with multiple errors, see logs

Execution failed for task ':app:processDevDebugMainManifest'.> Manifest merger failed with multiple errors, see logs
Merging Errors: Warning uses-permission#com.google.android.gms.permission.AD_ID was tagged at AndroidManifest.xml:17 to remove other declarations but no other declaration present android.app main manifest (this file), line 16 Error: android:exported needs to be explicitly specified for element <activity#com.onesignal.NotificationOpenedActivityHMS>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 77 Error: android:exported needs to be explicitly specified for element <receiver#com.onesignal.GcmBroadcastReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 56 Error: android:exported needs to be explicitly specified for element <receiver#com.onesignal.BootUpReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 108 Error: android:exported needs to be explicitly specified for element <receiver#com.onesignal.UpgradeReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 114

新增 android:exported 在 Manifests 的 activity 中

Error: android:exported needs to be explicitly specified for element <activity#com.onesignal.NotificationOpenedActivityHMS>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 77 Error: android:exported needs to be explicitly specified for element <receiver#com.onesignal.GcmBroadcastReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 56 Error: android:exported needs to be explicitly specified for element <receiver#com.onesignal.BootUpReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 108 Error: android:exported needs to be explicitly specified for element <receiver#com.onesignal.UpgradeReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. android.app main manifest (this file), line 114 

更新 oneSignal

Android 版本

oneSignal 版本

更新为 4.6.7


Build Exception : Caused by: java.lang.IllegalStateException: Unsupported metadata version. Check that your Kotlin version is >= 1.0

/Users/username/app-name/app/build/tmp/kapt3/stubs/uatDebug/com/packageName/appId/di/AssistedInjectModule.java:7: error: cannot find symbol@dagger.Module(includes = {AssistedInject_AssistedInjectModule.class})                           ^  symbol: class AssistedInject_AssistedInjectModuleNote: [1] Wrote GeneratedAppGlideModule with: [com.bumptech.glide.integration.okhttp3.OkHttpLibraryGlideModule]FAILURE: Build completed with 3 failures.
Caused by: java.lang.IllegalStateException: Unsupported metadata version. Check that your Kotlin version is >= 1.0at com.google.common.collect.SingletonImmutableBiMap.forEach(SingletonImmutableBiMap.java:66)at dagger.internal.codegen.validation.TypeCheckingProcessingStep.process(TypeCheckingProcessingStep.java:48)at dagger.internal.codegen.ModuleProcessingStep.process(ModuleProcessingStep.java:104)at dagger.internal.codegen.ModuleProcessingStep.process(ModuleProcessingStep.java:59)at dagger.internal.codegen.statistics.DaggerStatisticsCollectingProcessingStep.process(DaggerStatisticsCollectingProcessingStep.java:52)at dagger.shaded.auto.common.BasicAnnotationProcessor$ProcessingStepAsStep.process(BasicAnnotationProcessor.java:495)at dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:228)at dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:208)at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:188)at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)... 41 more

更新 Dagger

dependencies {    ...    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.0"    classpath "com.google.dagger:hilt-android-gradle-plugin:2.42"}

com.google.dagger Maven


更新为 2.42

更新完 Build


Build Exception : ModuleProcessingStep was unable to process 'com.packageName.appId.viewmodels.MainViewModel' because '' could not be resolved.

> Task :app:kaptUatDebugKotlin/Users/username/app-name/app/build/tmp/kapt3/stubs/uatDebug/com/packageName/appId/viewmodels/MainViewModel.java:5: error: cannot find symbol@dagger.hilt.InstallIn(value = {ApplicationComponent.class})                                ^  symbol: class ApplicationComponent/Users/username/app-name/app/build/tmp/kapt3/stubs/uatDebug/com/packageName/appId/di/AssistedInjectModule.java:7: error: cannot find symbol@dagger.Module(includes = {AssistedInject_AssistedInjectModule.class})                           ^  symbol: class AssistedInject_AssistedInjectModuleerror: [Hilt]  @InstallIn, 'value' class is invalid or missing: @dagger.hilt.InstallIn({<error>})  [Hilt] Processing did not complete. See error above for details.Note: [1] Wrote GeneratedAppGlideModule with: [com.bumptech.glide.integration.okhttp3.OkHttpLibraryGlideModule][Hilt]/Users/username/app-name/app/build/tmp/kapt3/stubs/uatDebug/com/packageName/appId/di/AssistedInjectModule.java:8: error: @AssistedModule's @Module must include AssistedInject_AssistedInjectModulepublic abstract class AssistedInjectModule {                ^error: ModuleProcessingStep was unable to process 'com.packageName.appId.viewmodels.MainViewModel' because '<error>' could not be resolved.    Dependency trace:      => element (CLASS): com.packageName.appId.viewmodels.MainViewModel      => annotation: @dagger.hilt.InstallIn("<error>")ModuleProcessingStep was unable to process 'com.packageName.appId.viewmodels.MainViewModel' because '<error>' could not be resolved.      => annotation method: java.lang.Class<?>[] value()      => annotation value (ARRAY): value '<error>' with expected type java.lang.Class<?>[]      => annotation value (STRING): value '<error>' with expected type java.lang.Class<?>    If type '<error>' is a generated type, check above for compilation errors that may have prevented the type from being generated. Otherwise, ensure that type '<error>' is on your classpath.error: ModuleProcessingStep was unable to process 'com.packageName.appId.di.AssistedInjectModule' because '<error>' could not be resolved.  ModuleProcessingStep was unable to process 'com.packageName.appId.di.AssistedInjectModule' because '<error>' could not be resolved.  Dependency trace:      => element (CLASS): com.packageName.appId.di.AssistedInjectModule      => annotation: @dagger.Module(includes = "<error>")      => annotation method: java.lang.Class<?>[] includes()      => annotation value (ARRAY): value '<error>' with expected type java.lang.Class<?>[]      => annotation value (STRING): value '<error>' with expected type java.lang.Class<?>    If type '<error>' is a generated type, check above for compilation errors that may have prevented the type from being generated. Otherwise, ensure that type '<error>' is on your classpath.

更新 androidx.hilt

就没有然后了

tags: Development Note Android Update Kotlin Update SDK Update Library

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章