使用 Android Studio 3.1 开发 AOSP 无法为插桩测试构建测试 apk

Developing AOSP with Android Studio 3.1 Cannot build test apk for instrumented tests

我正在尝试使用 Android Studio 构建自定义 AOSP(在 Android M,api 23 上),因为我想 运行 对自定义应用程序进行检测运行在硬件上。这是在 ubuntu 64 上。这让我非常沮丧,因为没有明确的路径。

我的目标: 我想按照 steps in this AS user guide 进行插桩测试。


我运行脚本

~/myAOSP/development/tools/idegen/intellij-gen.sh myApp company/apps/MY_APP

并在 Android Studio 中打开 MY_APP.iml。

现在我正在尝试使用 gradle 为我的项目构建 apk,以及测试 apk。

myAOSP主要使用makefiles

我按照此处的说明进行操作,还使用了 build.gradle 作为模板 https://developer.android.com/studio/intro/migrate#migrate-intellij

// This buildscript{} block configures the code driving the build
buildscript {
   /**
    * The nested repositories{} block declares that this build uses the
    * jcenter repository.
    */
    repositories {
        jcenter()
        google()
    }

   /**
    * This block declares a dependency on the 3.1.0 version
    * of the Gradle plugin for the buildscript.
    */
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
    }
}

/**
 * This line applies the com.android.application plugin. Note that you should
 * only apply the com.android.application plugin. Applying the Java plugin as
 * well will result in a build error.
 */
apply plugin: 'com.android.application'

/**
 * This dependencies block includes any dependencies for the project itself. The
 * following line includes all the JAR files in the libs directory.
 */
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    // Add other library dependencies here (see the next step)
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
}

/**
 * The android{} block configures all of the parameters for the Android build.
 * You must provide a value for at least the compilation target.
 */
android {
    compileSdkVersion 23
    buildToolsVersion '27.0.3'
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    /**
    * This nested sourceSets block points the source code directories to the
    * existing folders in the project, instead of using the default new
    * organization.
    */
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        androidTest.setRoot('tests')

       /**
        * Move the build types to build-types/<type>
        * For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        * This moves them out of them default location under src/<type>/... which would
        * conflict with src/ being used by the main source set.
        * Adding new build types or product flavors should be accompanied
        * by a similar customization.
        */
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
     }
}

repositories {
    jcenter()
    google()
}

还有一个 gradle 错误:因为 Android M 是用 JDK 1.7 构建的,但是 Android Studio gradle 使用 1.8,我跟着这些步骤但有 gradle 错误,无法为类型 org.gradle.api.Project 的根项目 'MY_PROJECT' 设置未知 属性 'sourceCompatibility'。 docs.gradle.org/current/userguide/building_java_projects.html # 在 $HOME/.gradle/gradle.properties javaHome=/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

targetJavaVersion=1.7 build.gradle sourceCompatibility = targetJavaVersion –`

我看到了像 Developing AOSP with Android Studio 这样的帖子,但它们已过时或不相关。 还有http://ronubo.blogspot.com/2016/01/debugging-aosp-platform-code-with.html?view=magazine and Error:(23, 17) Failed to resolve: junit:junit:4.12

我正在寻找一个可行的解决方案,以解决在自定义 AOSP 中为应用程序构建插桩测试 apk 的问题,并在 Android Studio 3.1(或稍后)。

a) 如果可以在 gradle AS 3.1(或更高版本)中构建插桩测试 apk,请建议修复显示的 gradle 错误。

b) 如果无法在上面的 a) 中构建 gradle,那么我是否需要使用自定义 AOSP 中的当前 makefile 来构建检测测试 apk?

c) 如果我使用 makefile 构建插桩测试 apk,那么我仍然可以在 AS 中使用插桩 UI 来 运行 硬件测试吗?

是的,可以在 AOSP 中使用 Gradle 构建应用 APK 和测试应用 APK,但难度取决于它们的依赖关系,即 Makefile 可能引用预构建二进制文件或其他文件的位置AOSP 中的模块,public Maven 存储库中可能没有等效的依赖项,因此您需要通过其他方式引入这些依赖项。如果您的应用是系统应用,您需要为签名步骤提供平台签名。

a) 您遇到的 Gradle 错误是什么?哪个 Gradle 任务给了你这个错误?

b) 您可以设置一个 Makefile 来构建经过检测的 APK,例如查看它是如何完成的 here. You can also use the Trade Federation framework 来处理执行和报告生成 - 但您不会在 AS 中获得集成。

c) 通过检测 UI,您是指使用 "play button" 开始测试,还是在测试 运行 时实时显示测试结果?如果你的意思是显示实时结果,那么我认为这是不可能的——据我所知,这取决于 connectedAndroidTest 任务。如果你只想执行测试,你可以创建一个自定义的 Gradle 任务来运行 "adb shell am instrument ..." 命令。