GVKun编程网logo

重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class]

1

如果您想了解重复的zip条目[classes.jar:android/support/v4/app/INotificationSideChannel$Stub$Proxy.class]的相关知识,那么

如果您想了解重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class]的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于"Class does not support Automation or does not support expected interface" 数据库连接错误问题分析与解决、@SpringBootTest(classes = SomeController.class) 和 @WebMvcTest(SomeController.class) 的区别、actionbarsherlock – Android Studio和ProGuard – 无法写入资源[META-INF / MANIFEST.MF](重复的zip条目[volley.jar:META-INF / MANIFEST.MF])、Android AIDL proxy/stub 分析的有价值的信息。

本文目录一览:

重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class]

重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class]

如何解决重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class]?

在Android项目中使用react-native 0.55.3进行工作,在构建或发布项目后,我得到重复类的消息:

警告:处理任务java.io.IO时发生异常:无法编写[/home/hamed/src/DigitalPos/digitalpos/android/app/build/intermediates/transforms/proguard/release/0.jar](无法读取[/root/.gradle/caches/transforms-1/files-1.1/core-1.0.0.aar/aaf85f5113156ead949fc46be782001c/jars/classes.jar(;;;;;;**.class)](重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class])) 线程(任务限制器_2):销毁 :app:transformClassesAndResourcesWithProguardForRelease(线程['','',5,main]的任务处理程序)已完成。花了14.201秒。

这是我的应用程序级别build.gradle(moduale:app)配置:

apply plugin: "com.android.application"

import com.android.build.OutputFile



project.ext.react = [
    entryFile: "index.js"
]

apply from: "../../node_modules/react-native/react.gradle"

 /**
  * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
* the correct one based on the cpu architecture of their device.
 */
def enableSeparateBuildPercpuArchitecture = false

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
 def enableProguardInReleaseBuilds = true

android {
compileSdkVersion 28

buildToolsversion "27.0.3"

defaultConfig {
    applicationId "com.digitalpos"
    minSdkVersion 16
    targetSdkVersion 27
   
    versionCode 2
    versionName "2.2.0.5"
    setProperty("archivesBaseName",applicationId + "-v" + versionCode + "(" + versionName + ")")
    vectorDrawables.useSupportLibrary = true
    ndk {
        abiFilters "armeabi-v7a","x86"
    }
    multiDexEnabled true

}
splits {
    abi {
        reset()
        enable enableSeparateBuildPercpuArchitecture
        universalApk false  // If true,also generate a universal APK
        include "armeabi-v7a","x86"
    }
}

signingConfigs {
    release {


        if (project.hasProperty(''MYAPP_RELEASE_STORE_FILE'')) {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }
}
buildTypes {
    release {
        minifyEnabled enableProguardInReleaseBuilds
        useProguard enableProguardInReleaseBuilds
        zipAlignEnabled enableProguardInReleaseBuilds

        debuggable false
        shrinkResources enableProguardInReleaseBuilds
        proguardFiles getDefaultProguardFile("proguard-android.txt"),"proguard-rules.pro"
        signingConfig signingConfigs.release
    }
    debug{
        minifyEnabled enableProguardInReleaseBuilds
        useProguard enableProguardInReleaseBuilds
        zipAlignEnabled enableProguardInReleaseBuilds
       proguardFiles getDefaultProguardFile("proguard-android.txt"),"proguard-rules.pro"

    }
}


// applicationVariants are e.g. debug,release
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        // For each separate APK per architecture,set a unique version code as described here:
        // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
        def versionCodes = ["armeabi-v7a": 1,"x86": 2]
        def abi = output.getFilter(OutputFile.ABI)
        if (abi != null) {  // null for the universal-debug,universal-release variants
            output.versionCodeOverride =
                    versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
        }
    }
}

packagingOptions {
    exclude ''meta-inf/DEPENDENCIES''
    exclude ''meta-inf/LICENSE''
    exclude ''meta-inf/LICENSE.txt''
    exclude ''meta-inf/license.txt''
    exclude ''meta-inf/NOTICE''
    exclude ''meta-inf/NOTICE.txt''
    exclude ''meta-inf/notice.txt''
    exclude ''meta-inf/ASL2.0''
    exclude("meta-inf/*.kotlin_module")
    exclude("meta-inf/androidx.localbroadcastmanager_localbroadcastmanager.version")
    exclude("meta-inf/proguard/coroutines.pro")
    exclude ("meta-inf/proguard/androidx-annotations.pro")
    exclude ''meta-inf/androidx.customview_customview.version''
    exclude ''meta-inf/androidx.legacy_legacy-support-core-ui.version''
    exclude ''meta-inf/androidx.drawerlayout_drawerlayout.version''
    exclude ''meta-inf/androidx.interpolator_interpolator.version''
    exclude ''meta-inf/androidx.legacy_legacy-support-core-utils.version''
    exclude ''meta-inf/androidx.slidingpanelayout_slidingpanelayout.version''
    exclude ''meta-inf/androidx.swiperefreshlayout_swiperefreshlayout.version''
    exclude ''meta-inf/androidx.print_print.version''
    exclude ''meta-inf/androidx.documentfile_documentfile.version''
    exclude ''meta-inf/androidx.*.version''
}

dexOptions {
    javaMaxHeapSize "2g"
}
}

dependencies {
implementation ''com.scottyab:rootbeer-lib:0.0.7''
compile project('':react-native-file-viewer'')
compile project('':react-native-html-to-pdf'')
compile project('':react-native-fs'')
compile project('':react-native-image-crop-picker'')

compile project('':react-native-image-picker'')
compile project('':react-native-wheel-picker'')
compile project('':react-native-vector-icons'')
compile project('':react-native-uuid-generator'')
compile project('':react-native-svg'')
compile project('':react-native-smart-barcode'')

compile project('':react-native-restart'')
compile project('':react-native-linear-gradient'')
compile project('':react-native-image-base64'')
compile project('':react-native-i18n'')
compile (project('':react-native-camera'')) {
    exclude group: "com.google.android.gms"
    compile (''com.android.support:support-v4:26.1.0''){
        force=true
    }
  
compile ''com.android.support:exifinterface:27.1.1''
compile (''com.google.android.gms:play-services-vision:18.0.0'') {
        force = true
    }
}
compile (project('':react-native-signature-capture'')){
    compile (''com.android.support:appcompat-v7:23.0.0''){
        force = true
    }


}
compile (project('':react-native-smart-barcode'')){
    compile (''com.android.support:appcompat-v7:23.4.0''){
        force=true
    }

}
implementation ''com.android.support.constraint:constraint-layout:1.1.2''
compile filetree(include: [''*.jar''],dir: ''libs'')

compile ''com.facebook.react:react-native:0.55.3''
// From node_modules
  }
 task copyDownloadableDepsToLibs(type: copy) {
   from configurations.compile
  into ''libs''
    }
   preBuild.doFirst {
    ant.replaceregexp(match:''androidx.core.content.'',replace:''android.support.v4.content.'',flags:''g'',byline:true) {
      fileset(dir: ''../../node_modules/react-native-file- 
     viewer/android/src/main/java/com/vinzscam/reactnativefileviewer'',includes: ''*.java'')
           }
     }

这是我的应用程序级别build.gradle(模块:我的项目名称)配置:

// Top-level build file where you can add configuration options common to all sub- 
                projects/modules.

  buildscript {

  repositories {

  // jcenter()
   jcenter {
       url "https://jcenter.bintray.com/"
   }
   google()
   maven { url ''https://repo1.maven.org/maven2'' }

   maven {
               url ''https://maven.google.com''
           }
   maven { url "https://jitpack.io" }


        maven { url ''https://maven.fabric.io/public'' }

       mavenCentral()


  }
       dependencies {
     // classpath ''com.android.tools.build:gradle:3.1.3''
    classpath ''com.android.tools.build:gradle:3.1.3''
    // classpath ''com.android.tools.build:gradle:3.5.1''

       // NOTE: Do not place your application dependencies here; they belong
       // in the individual module build.gradle files
   }
    }

 allprojects {
    repositories {

    google()
   // jcenter()
    jcenter {
        url "https://jcenter.bintray.com/"
    }
    maven { url ''https://repo1.maven.org/maven2'' }

    maven { url "https://jitpack.io" }
    maven { url "https://maven.google.com" }

    mavenCentral()

    mavenLocal()


    maven {
        // All of React Native (JS,Obj-C sources,Android binaries) is installed from npm
        url "$rootDir/../node_modules/react-native/android"
    }
    // jitpack repo is necessary to fetch ucrop dependency




}

  configurations.all {
    resolutionStrategy{
        force ''com.android.support:support-v4:26.1.0''
       force ''com.facebook.react:react-native:0.55.3''
       force ''com.android.support:appcompat-v7:28.0.0''
      // force ''com.android.support:appcompat-v7:23.0.0''
        force ''com.android.support:support-annotations:26.1.0''
        force ''com.squareup.okhttp3:okhttp:3.6.0''
        force ''com.madgag.spongycastle:prov:1.54.0.0''
        force ''com.madgag.spongycastle:core:1.54.0.0''
        force ''com.google.zxing:core:3.2.1''
        force ''com.google.android.gms:play-services-vision-common:18.0.0''
        force ''com.android.support:exifinterface:26.1.0''







    }
}


}

subprojects {

if (project.name.contains(''react-native-vector-icons'')
) {
    buildscript {
        repositories {
            google()

           // jcenter()
            jcenter {
                url "https://jcenter.bintray.com/"
            }

            maven { url "https://dl.bintray.com/android/android-tools/"  }
            maven { url ''https://repo1.maven.org/maven2'' }

        }
    }
}else if (
        project.name.contains(''react-native-camera'')
) {
    buildscript {
        repositories {

            google()
            maven { url "https://jitpack.io"
            }

            maven {
                url ''https://maven.google.com''
            }
            maven { url ''https://repo1.maven.org/maven2'' }

            // jcenter()
            jcenter {
                url "https://jcenter.bintray.com/"
            }


            maven { url "https://dl.bintray.com/android/android-tools/"  }
        }
    }
}else {
    buildscript {
        repositories {

            google()
            maven { url "https://jitpack.io"
            }
            maven {
                url ''https://maven.google.com''
            }

           // jcenter()
            jcenter {
                url "https://jcenter.bintray.com/"
            }


            maven { url "https://dl.bintray.com/android/android-tools/"  }
        }
    }

}
    }
         ext {
            compileSdkVersion           = 26
         targetSdkVersion            = 26
         minSdkVersion=16
        buildToolsversion           = "26.0.2"
        googlePlayServicesversion   = "12.0.1"
         supportLibVersion           = "26.1.0"

     }

在我的gradle.properties中设置:

android.useDeprecatedndk=true
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=*
MYAPP_RELEASE_KEY_PASSWORD=*
android.enableAapt2=false
android.useandroidX = true
android.enableJetifier = true

这是proguard-rules.pro:

            -assumenosideeffects class android.util.Log {
            public static *** d(...);
            public static *** v(...);
            public static *** i(...);
            public static *** w(...);
            public static *** e(...);
            }


            # React Native

            
            -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
            -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
            -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip

            # Do not strip any method/class that is annotated with @DoNotStrip
            -keep @com.facebook.proguard.annotations.DoNotStrip class *
            -keep @com.facebook.common.internal.DoNotStrip class *
            -keepclassmembers class * {
                @com.facebook.proguard.annotations.DoNotStrip *;
                @com.facebook.common.internal.DoNotStrip *;
            }

            -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
            void set*(***);
            *** get*();
            }

            -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
            -keep class * extends com.facebook.react.bridge.NativeModule { *; }
            -keepclassmembers,includedescriptorclasses class * { native <methods>; }
            -keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; }
            -keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
            -keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }

            -dontwarn com.facebook.react.**
            -keep,includedescriptorclasses class com.facebook.react.bridge.** { *; }
            # hermes
            -keep class com.facebook.jni.** { *; }

            # TextLayoutBuilder uses a non-public Android constructor within StaticLayout.
            # See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details.
            -dontwarn android.text.StaticLayout

            # okhttp

            -keepattributes Signature
            -keepattributes *Annotation*
            -keep class okhttp3.** { *; }
            -keep interface okhttp3.** { *; }
            -dontwarn okhttp3.**



            # okio

            -keep class sun.misc.Unsafe { *; }
            -dontwarn java.nio.file.*
            -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
            -dontwarn okio.**


            # minifyEnabled true

            -ignorewarnings

            # Uncomment this to preserve the line number information for
            # debugging stack traces.
            -keepattributes SourceFile,LineNumberTable

            # If you keep the line number information,uncomment this to
            # hide the original source file name.
            -renamesourcefileattribute SourceFile

            -optimizationpasses 5
            -dontusemixedcaseclassnames
            -dontskipnonpubliclibraryclasses
            -dontskipnonpubliclibraryclassmembers
            -dontpreverify
            -verbose
            -optimizations !code/simplification/arithmetic,!field/,!class/merging/,!code/allocation/variable

            -keep public class * extends android.app.Activity
            -keep public class * extends android.app.Application
            -keep class android.support.** { *; }

            #React native

            -keep class com.facebook.react.devsupport.** { *; }
            -dontwarn com.facebook.react.devsupport.**
            -dontwarn com.

            #-keep class com.facebook.react.cxxbridge.ModuleRegistryHolder { *; }
            #-keep class com.facebook.react.cxxbridge.CatalystInstanceImpl { *; }
            #-keep class com.facebook.react.cxxbridge.JavaScriptExecutor { *; }
            -keep class com.facebook.react.bridge.queue.NativeRunnable { *; }
            -keep class com.facebook.react.bridge.ExecutorToken { *; }
            -keep class com.facebook.react.bridge.ReadableType { *; }


        
            -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
            -keep,allowobfuscation @interface com.facebook.jni.annotations.DoNotStrip


            # Do not strip any method/class that is annotated with @DoNotStrip
            -keep @com.facebook.proguard.annotations.DoNotStrip class *
            -keep @com.facebook.common.internal.DoNotStrip class *
            -keep @com.facebook.jni.annotations.DoNotStrip class *

            -keepclassmembers class * {
                @com.facebook.proguard.annotations.DoNotStrip *;
                @com.facebook.common.internal.DoNotStrip *;
                @com.facebook.jni.annotations.DoNotStrip *;

            }

            -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
            void set*(***);
            *** get*();
            }

            -keep class * implements com.facebook.react.bridge.JavaScriptModule { *; }
            -keep class * implements com.facebook.react.bridge.NativeModule { *; }



            -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
            -keep class * extends com.facebook.react.bridge.NativeModule { *; }
            -keepclassmembers,includedescriptorclasses class * { native <methods>; }
            -keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; }
            -keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
            -keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }



            ##########################################################################

            -dontwarn javax.annotation.**

            -dontwarn android.app.**
            -dontwarn android.support.**
            -dontwarn android.view.**
            -dontwarn android.widget.**

            -dontwarn com.google.common.primitives.**

            -dontwarn **CompatHoneycomb
            -dontwarn **CompatHoneycombMR2
            -dontwarn **CompatCreatorHoneycombMR2

            -keepclasseswithmembernames class * {
            native <methods>;
            }

            -keepclasseswithmembers class * {
            public <init>(android.content.Context,android.util.AttributeSet);
            }

            -keepclasseswithmembers class * {
            public <init>(android.content.Context,android.util.AttributeSet,int);
            }

            -keepclassmembers class * extends android.app.Activity {
            public void *(android.view.View);
            }

            -keepclassmembers enum * {
            public static **[] values();
            public static ** valueOf(java.lang.String);
            }

            -keep class * implements android.os.Parcelable {
            public static final android.os.Parcelable$Creator *;
            }

            -keepclassmembers class *.R$ {
            public static <fields>;
            }

            -keep public class net.sqlcipher.** {
            *;
            }

            -keep public class net.sqlcipher.database.** {
            *;
            }

如何避免React本机项目中包含的重复类?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

"Class does not support Automation or does not support expected interface" 数据库连接错误问题分析与解决

 

1,故障现象

本人编译的英文版程序在本机上运行 OK,换台电脑运行,发现启动时连接数据库出错。

错误信息如下:

---------------------------

Error start database

---------------------------

database testing error, error description as

Class does not support Automation or does not support expected interface

 

2,问题分析

https://blog.csdn.net/woolnil/article/details/7980534

https://blog.csdn.net/chaoguodong/article/details/38442527

http://www.bkill.com/download/175356.html

 

以上文章,特别是最后一篇,指出,

  1. 在 Windows 7 和早期版本的 Windows 中,_Connection IID 是 00000550-0000-0010-8000-00AA006D2EA4。
  2. 在 Windows 7 SP1 中,_Connection IID 是 00001550-0000-0010-8000-00AA006D2EA4,并且_Connection_Deprecated 的 IID 是 00000550-0000-0010-8000-00AA006D2EA4。
    如果您的应用程序使用_Connection 的早期绑定,则在编译期间新的 IID 将存储在应用程序二进制文件中。当应用程序在下层操作系统上运行时,这会导致错误,因为 IID 不存在。

一些 ADO API 在 ADO 2.7 和更高版本中依赖于平台。在 64 位版本的 Windows 上,这些 ADO API 通过使用 64 位数据类型(例如 LONGLONG 数据类型)来处理参数。但是,使用这些 API 的应用程序仍使用 LONG 数据类型。因此,当您尝试运行宏时收到 “类型不匹配” 错误消息。

 

在本人电脑中查询,结果符合第 2 条。

 

 

在故障电脑中查询,结果符合第 1 条。

注册项 “00001550-0000-0010-8000-00AA006D2EA4” 不存在

 

 

 ADO 注册项值为 “00000550-0000-0010-8000-00AA006D2EA4”,与 win7 SP1 不一致。

 

3,解决方案

https://blog.csdn.net/woolnil/article/details/7980534

上文给出的解决办法有:
1、所有客户端安装 KB983246 补丁!
2、卸载 Win7 的 SP1 补丁包
3、替换 Win7 的 C:\Program Files\Common Files\System\ado 下的对应 ado 组件为 XP SP3 下的对应文件。

 

为简单起见,采取方案 3.

 

 如上图,在开发环境打开工程,查看引用文件。发现工程使用了 ADO2.8 控件,文件位于 C:\Program Files (x86)\Common Files\System\ado\msado28.tlb

 

将原来的 msado28.tlb 改名为 msado28-new.tlb

然后将旧版 XP 的 msado28.tlb 复制到 ado 目录。

 

打开 VB 开发环境:

è       重新添加一遍 ADO 控件。作用是更新 IID 接口。

è       重新编译程序。

 

注意:Win7 的 ado 文件夹要先设置权限,否则其中的文件无法更改。

 

 

 

4,测试

在本机运行,正常。

在目标电脑运行,正常。

5,总结

本问题牵涉到操作系统版本、SP 补丁、KB 补丁、32 位 / 64 位系统等诸多因素。

编译环境应配置为兼容最低配置,即要兼容目标环境为 XP 系统、32 位、无补丁包。否则,可能出现系统组件的调用故障。

 

@SpringBootTest(classes = SomeController.class) 和 @WebMvcTest(SomeController.class) 的区别

@SpringBootTest(classes = SomeController.class) 和 @WebMvcTest(SomeController.class) 的区别

如何解决@SpringBootTest(classes = SomeController.class) 和 @WebMvcTest(SomeController.class) 的区别

我知道使用 @Springboottest 我在测试期间提升了整个 spring 上下文,或者在我的情况下使用 @SpringBoottest(classes = SomeController.class) 我只提升了一个 bean -> SomeController。如果这个控制器有一些依赖,我需要模拟它们。使用注释 @WebMvcTest(SoneController.class) 我将(根据我的知识)实现相同的目标。

问题是:提供的示例中使用的这两个注释之间有什么区别吗?

解决方法

我认为只要阅读这两个注释的 Javadoc 就足以回答您的问题:

1. @WebMvcTest

可用于仅关注 Spring MVC 组件的 Spring MVC 测试的注解。

使用此注解将禁用完全自动配置,而是仅应用与 MVC 测试相关的配置(即 @Controller@ControllerAdvice@JsonComponent、Converter/GenericConverter、Filter、WebMvcConfigurer 和 HandlerMethodArgumentResolver豆,但不是 @Component@Service@Repository 豆)。

默认情况下,使用 @WebMvcTest 注释的测试还将自动配置 Spring Security 和 MockMvc(包括对 HtmlUnit WebClient 和 Selenium WebDriver 的支持)。为了对 MockMVC 进行更细粒度的控制,可以使用 @AutoConfigureMockMvc 注释。

@SpringbootTest

可以在运行基于 Spring Boot 的测试的测试类上指定的注解。在常规 Spring TestContext 框架之上提供以下功能:

当没有定义特定的 @ContextConfiguration(loader=...) 时,使用 SpringBootContextLoader 作为默认的 ContextLoader。 当未使用嵌套的 @Configuration 且未指定显式类时,自动搜索 @SpringBootConfiguration。 允许使用 properties 属性定义自定义环境属性。

允许使用 args 属性定义应用程序参数。 提供对不同 webEnvironment 模式的支持,包括启动完全运行的 web 服务器侦听定义或随机端口的能力。 注册 TestRestTemplate 和/或 WebTestClient bean,以用于使用完全运行的 Web 服务器的 Web 测试。

,

@SpringBootTest(classes = SomeController.class)@WebMvcTest(SomeController.class) 之间存在明显区别。

  • @SpringBootTest(classes = SomeController.class) - 使用组件 SomeController.class 启动服务器(例如 Tomcat)+ spring 应用程序上下文。除了控制器之外,您通常应该指定上下文配置以成功启动整个应用程序(例如:当您不指定 classes 时,它会回退到 @SpringBootApplication)。

  • @WebMvcTest(SomeController.class) - 仅使用 SomeController.class 启动应用程序的网络层

有什么区别?

@SpringBootTest 测试通常是集成测试,您启动完整的 spring-boot 应用程序并针对该黑盒进行测试。您仍然可以通过在注释参数中提供配置、属性、Web 服务器类型等来调整应用程序启动。

但是 @WebMvcTest(SomeController.class) 通常是对控制器的单元测试。这些是轻量级和快速的。在此类测试中模拟 @Service 类等依赖项。

这是一个很好的起点 - https://spring.io/guides/gs/testing-web/

,

这两种方式有几个细微的区别。
但是当你在spring boot context init过程中遇到bean初始化异常或者测试执行过程中出现NullPointerException上升等问题时,你只会随机发现其中的一部分。
为了让事情更简单,专注于意图。
当你这样写时:

@SpringBootTest(classes = SomeController.class)

您将使 Spring 仅初始化 SomeController bean 实例。
测试控制器是否可取?
可能不需要,因为您需要一种使用控制器方法调用控制器的方法。
为此, MockMvc 实例会有所帮助。 使用 WebMvcTest,您可以在测试上下文中额外加载该 bean。
所以这种方式更可取:

@WebMvcTest(SomeController.class)
public class SomeControllerTest{
    
  @Autowired
  private MockMvc mvc;
...
}

当然,您可以使用 @SpringBootTest 和一些其他类获得类似的行为,但这只是开销:@WebMvcTest 专用注释就足够了。

最后为什么要让你的追随者更难阅读测试课程?
通过精心设计的使用 Spring Boot 测试注释的方法,很有可能实现这一目标。

actionbarsherlock – Android Studio和ProGuard – 无法写入资源[META-INF / MANIFEST.MF](重复的zip条目[volley.jar:META-INF / MANIFEST.MF])

actionbarsherlock – Android Studio和ProGuard – 无法写入资源[META-INF / MANIFEST.MF](重复的zip条目[volley.jar:META-INF / MANIFEST.MF])

我有一个 Android应用程序使用 actionbarsherlock和libs下的下一个jar
夹:

android-support-v4.jar
gson-2.2.4.jar
libGoogleAnalyticsV2.jar
volley.jar

我正在尝试使用Android Studio Build#AI-130.692269生成签名APK.我检查两个复选框“运行ProGuard”和“包含系统proguard文件”

我的ProGuard路径文件proguard-project.txt如下所示:

# To enable ProGuard in your project,edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default,the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details,see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS,uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

我编辑了project.properties,现在看起来像:

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties",and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code,uncomment this (available properties: sdk.dir,user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=/Applications/adt-bundle-mac-x86_64/sdk/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-17
android.library=false
android.library.reference.1=../AndroidBarSherlock/actionbarsherlock

这是我得到的输出:

information:ProGuard: [SocialPrice] ProGuard,version 4.7
information:ProGuard: [SocialPrice] Reading input...
information:ProGuard: [SocialPrice] Reading program jar [/Users/sdelamo/Library/Caches/AndroidStudioPreview/compile-server/_temp_/proguard_input4364141808943557175.jar]
information:ProGuard: [SocialPrice] Reading program jar [/Users/sdelamo/Documents/Developer/android/facebook-android-sdk-3.0.1/facebook/libs/android-support-v4.jar]
information:ProGuard: [SocialPrice] Reading program jar [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/libs/volley.jar]
information:ProGuard: [SocialPrice] Reading program jar [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/libs/libGoogleAnalyticsV2.jar]
information:ProGuard: [SocialPrice] Reading program jar [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/libs/gson-2.2.4.jar]
information:ProGuard: [SocialPrice] Reading library jar [/Applications/Android Studio.app/sdk/platforms/android-17/android.jar]
information:ProGuard: [SocialPrice] Initializing...
information:ProGuard: [SocialPrice] Note: com.google.analytics.tracking.android.AdHitIdGenerator: can''t find dynamically referenced class com.google.ads.AdRequest
information:ProGuard: [SocialPrice] Note: com.google.gson.internal.UnsafeAllocator: can''t find dynamically referenced class sun.misc.Unsafe
information:ProGuard: [SocialPrice] Note: the configuration refers to the unkNown class ''com.google.vending.licensing.ILicensingService''
information:ProGuard: [SocialPrice] Note: the configuration refers to the unkNown class ''com.android.vending.licensing.ILicensingService''
information:ProGuard: [SocialPrice] Note: there were 2 references to unkNown classes.
information:ProGuard: [SocialPrice]       You should check your configuration for typos.
information:ProGuard: [SocialPrice] Note: there were 2 unresolved dynamic references to classes or interfaces.
information:ProGuard: [SocialPrice] Ignoring unused library classes...
information:ProGuard: [SocialPrice]   Original number of library classes: 3259
information:ProGuard: [SocialPrice]   Final number of library classes:    841
information:ProGuard: [SocialPrice] Printing kept classes,fields,and methods...
information:ProGuard: [SocialPrice] Shrinking...
information:ProGuard: [SocialPrice] Printing usage to [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/proguard_logs/usage.txt]...
information:ProGuard: [SocialPrice] Removing unused program classes and class elements...
information:ProGuard: [SocialPrice]   Original number of program classes: 921
information:ProGuard: [SocialPrice]   Final number of program classes:    579
information:ProGuard: [SocialPrice] Obfuscating...
information:ProGuard: [SocialPrice] Printing mapping to [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/proguard_logs/mapping.txt]...
information:ProGuard: [SocialPrice] Writing output...
information:ProGuard: [SocialPrice] Preparing output jar [/Users/sdelamo/Library/Caches/AndroidStudioPreview/compile-server/socialprice_a27782ee/android/intermediate_artifacts/SocialPrice/obfuscated_sources.jar]
information:ProGuard: [SocialPrice]   copying resources from program jar [/Users/sdelamo/Library/Caches/AndroidStudioPreview/compile-server/_temp_/proguard_input4364141808943557175.jar]
information:ProGuard: [SocialPrice]   copying resources from program jar [/Users/sdelamo/Documents/Developer/android/facebook-android-sdk-3.0.1/facebook/libs/android-support-v4.jar]
information:ProGuard: [SocialPrice]   copying resources from program jar [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/libs/volley.jar]
information:ProGuard: [SocialPrice]   copying resources from program jar [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/libs/libGoogleAnalyticsV2.jar]
information:ProGuard: [SocialPrice]   copying resources from program jar [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/libs/gson-2.2.4.jar]
information:ProGuard: [SocialPrice] Printing classes to [/Users/sdelamo/Documents/workspaceAndroid/SocialPrice/proguard_logs/dump.txt]...
information:Compilation completed successfully with 4 warnings in 2 min 28 sec
information:0 errors
information:4 warnings
Warning:ProGuard: [SocialPrice]       You should check if you need to specify additional program jars.
Warning:ProGuard: [SocialPrice] Warning: can''t write resource [meta-inf/MANIFEST.MF] (Duplicate zip entry [volley.jar:meta-inf/MANIFEST.MF])
Warning:ProGuard: [SocialPrice] Warning: can''t write resource [meta-inf/MANIFEST.MF] (Duplicate zip entry [libGoogleAnalyticsV2.jar:meta-inf/MANIFEST.MF])
Warning:ProGuard: [SocialPrice] Warning: can''t write resource [meta-inf/MANIFEST.MF] (Duplicate zip entry [gson-2.2.4.jar:meta-inf/MANIFEST.MF])

我是ProGuard的新手,所以欢迎任何反馈.

解决方法

在尝试使用joda-time库时,我遇到了类似的问题.

通过增加

packagingOptions {
    exclude ''meta-inf/DEPENDENCIES''
    exclude ''meta-inf/NOTICE''
    exclude ''meta-inf/LICENSE''
    exclude ''meta-inf/LICENSE.txt''
    exclude ''meta-inf/NOTICE.txt''
}

到build.gradle中的android部分,错误消失了.

找到了解决方案
Duplicate files copied (Android Studio 0.4.0)

Android AIDL proxy/stub 分析

Android AIDL proxy/stub 分析

AIDL 的作用
    由于每个应用程序都运行在自己的进程空间,并且可以从应用程序 UI 运行另一个服务进程,而且经常会在不同的进程间传递对象。在 Android 平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。
    通过代码来实现这个数据传输过程是冗长乏味的,Android 提供了 AIDL 工具来处理这项工作。
 
    AIDL (Android Interface Definition Language) 是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信 (interprocess communication, IPC) 的代码。如果在一个进程中(例如 Activity)要调用另一个进程中(例如 Service)对象的操作,就可以使用 AIDL 生成可序列化的参数。
    AIDL IPC 机制是面向接口的,像 COM 或 Corba 一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
 

先介绍一下 COM 的一个概念 ---------Proxy/Stub 结构(代理 / 存根结构)


打个比方,你到自动取款机上去取款;你就是客户,取款机就是你的代理;你不会在乎钱具体放在那里,你只想看到足够或更多的钱从出口出来(这就是 com 的透明性)。你同银行之间的操作完全是取款机代理实现。你的取款请求通过取款机,传到另一头,银行的服务器,他也没有必要知道你在哪儿取钱,他所关心的是你的身份,和你取款多少。当他确认你的权限,就进行相应的操作,返回操作结果给取款机,取款机根据服务器返回结果,从保险柜里取出相应数量的钱给你。你取出卡后,操作完成。取款机不是直接同服务器连接的,他们之间还有一个 “存根”,取款机与存根通信,服务器与存根通信。从某种意义上说存根就是服务器的代理。(参考 COM 代理与存根)

AIDLFramework 层的架构,如下图:


换而言之,Android 就是在传统的 C/S 架构中加入了一层,实现 IPC。图中表明,AIDL 类似 COM 的 Proxy/Stub 架构。不过是现在 android 自己的序列化类 Pacel。
 

今天关于重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class]的分享就到这里,希望大家有所收获,若想了解更多关于"Class does not support Automation or does not support expected interface" 数据库连接错误问题分析与解决、@SpringBootTest(classes = SomeController.class) 和 @WebMvcTest(SomeController.class) 的区别、actionbarsherlock – Android Studio和ProGuard – 无法写入资源[META-INF / MANIFEST.MF](重复的zip条目[volley.jar:META-INF / MANIFEST.MF])、Android AIDL proxy/stub 分析等相关知识,可以在本站进行查询。

本文标签: