仪器化Android单元测试和ProGuard



我有一个应用程序,我正在为它编写单元测试用例。
我的测试用例给出了一个巨大的警告列表和一个错误
遵循以下链接和子页面构建仪器化单元测试

错误和一些警告

警告:有10个未解析的类或接口引用。您可能需要添加缺失的库jar或更新它们的版本。如果您的代码在没有丢失类的情况下运行良好,则可以进行抑制带有'- donwarn '选项的警告。(http://proguard.sourceforge.net/manual/troubleshooting.html # unresolvedclass)警告:根据程序类有5个库类实例。您必须避免这种依赖关系,因为程序类会这样做被处理,而库类将保持不变。(http://proguard.sourceforge.net/manual/troubleshooting.html依赖)警告:有3个未解析的程序类成员引用。您的输入类似乎不一致。您可能需要重新编译代码。(http://proguard.sourceforge.net/manual/troubleshooting.html # unresolvedprogramclassmember)java.io.IOException:请先纠正以上警告。应用:transformClassesAndResourcesWithProguardForDebugAndroidTest失败

错误:执行任务":app:transformClassesAndResourcesWithProguardForDebugAndroidTest"失败。java.io.IOException: Please correct the above warnings .

如果我从调试中删除proguard,我得到64K错误!

错误:.dex文件中的方法引用数不能超过64K。在https://developer.android.com/tools/building/multidex.html

了解如何解决此问题。

我做错了什么?

应用build.gradle

android {
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig {
    applicationId "com.tyagiabhinav.xyz"
    minSdkVersion 16
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),   'proguard-rules.pro'
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies 
{
   compile fileTree(dir: 'libs', include: ['*.jar'])
   testCompile 'junit:junit:4.12'
   compile 'com.android.support:appcompat-v7:24.2.0'
   compile 'com.android.support:design:24.2.0'
   compile 'com.android.support:support-annotations:24.2.0'
   ......
   androidTestCompile 'com.android.support:support-annotations:24.2.0'
   androidTestCompile 'com.android.support.test:runner:0.5'
   androidTestCompile 'com.android.support.test:rules:0.5'
}

测试Java类

package com.tyagiabhinav.xyz;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import com.tyagiabhinav.xyz.Util.PrefHelper;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
 * Created by abhinavtyagi on 24/08/16.
 */

@RunWith(AndroidJUnit4.class)
public class PrefTester {
    Context mMockContext;
    private PrefTester() {
        super();
    }
    @Before
    public void setUp() {
        mMockContext = InstrumentationRegistry.getTargetContext();
        PrefHelper.init(mMockContext);
    }
    @Test
    public void testSharedPref(){
        Assert.assertEquals(false,PrefHelper.isLoggedIn());
    }
}

您正在调试构建中运行proguard。Proguard可以从java代码中删除类。通过在构建中设置"minifyEnabled false"来关闭proguard。gradle文件

buildTypes {
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),   'proguard-rules.pro'
    }

做了一些改变,问题得到了解决!

<

测试代码/strong>
修改了通过打开闪屏获取上下文的方式

@RunWith(AndroidJUnit4.class)
public class PrefTester {
    Context mMockContext;
    @Rule
    public ActivityTestRule<SplashActivity> mActivityRule = new ActivityTestRule<>(SplashActivity.class);
    @Before
    public void setUp() {
        mMockContext = mActivityRule.getActivity().getApplicationContext();
        PrefHelper.init(mMockContext);
    }
    @Test
    public void testSharedPref(){
        Assert.assertEquals(false,PrefHelper.isLoggedIn());
    }
}

build.gradle (app)
在调试中设置proguard false -> minifyEnabled false
启用multidex -> multiDexEnabled true
添加依赖项-> compile 'com.android.support:multidex:1.0.1'

我已经测试了构建。gradle方法之前张贴这个问题,我认为我是抓取上下文错误的方式。以上的改变对我来说已经奏效了。

您的proguard-rules中有什么?支持文件?你可以试着删除它,并简单地使用默认的android规则。

作为一个提示,我认为你可能需要重新评估你的依赖关系。从您所展示的gradle文件片段来看,仅使用这些依赖项似乎不太可能达到64K索引限制。你是否包含了更多上面没有列出的库?在您的项目中有jar文件中的库吗?(这很容易解释方法的数量)

Multidex是一种黑客——除非你别无选择,否则你真的不应该使用它。使用它会有性能影响等,并且会意外地出现一些奇怪的问题,比如哪些类存在于哪个索引文件中。例如,从清单中引用的任何类都必须在主索引文件中结束,这可能会给您带来奇怪的约束。

最新更新