12
votes

I am trying to build a customized AOSP (on Android M, api 23) using Android Studio because I want to run instrumented tests on custom apps running on the hardware. This is on ubuntu 64. It is very frustrating for me as there is no clear cut path.

My goal: I want to follow the steps in this AS user guide for instrumented tests.


I ran the script

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

and opened MY_APP.iml in Android Studio.

Now I am trying to build the apk using gradle just for my project, and also the test apk.

The main myAOSP uses makefiles.

I followed the instructions here and also used the build.gradle as a template 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()
}

There was also a gradle error: Since Android M is being built with JDK 1.7 but Android Studio gradle uses 1.8, I followed the steps but had gradle error, Could not set unknown property 'sourceCompatibility' for root project 'MY_PROJECT' of `type org.gradle.api.Project. docs.gradle.org/current/userguide/building_java_projects.html # in $HOME/.gradle/gradle.properties javaHome=/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

targetJavaVersion=1.7 build.gradle sourceCompatibility = targetJavaVersion –`

I saw posts like Developing AOSP with Android Studio but they are out of date or not relevant. Also 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

I am looking for a working solution to the problem of building an instrumented test apk for an app in customized AOSP, and running instrumented tests on it, in Android Studio 3.1 (or later).

a) if it is possible to build the instrumented test apk in gradle AS 3.1 (or later), then please suggest a fix to the gradle error shown.

b) if gradle build in a) above is NOT possible, then do I need to build instrumented test apk using the current makefiles in the customized AOSP?

c) if I build the instrumented test apk using makefiles, then can I still use the instrumentation UI in AS to run the tests on the hardware?

1
In AS you need to add JDK as usual (pointing to existing one) and after creation remove all of the jar entries under the "Classpath" taby.bedrov
@y.bedrov I got it to work by running development/tools/idegen/intellij-gen.sh Does one have to use gradle to get AS to do instrumented tests? My version of AOSP uses makefiles.likejudo

1 Answers

4
votes

Yes, it's possible to build an app APK and a test app APK with Gradle in AOSP, but the difficulty depends on their dependencies, i.e. where the Makefile may refer to a pre-built binary or another module in AOSP, there may not be an equivalent dependency in the public Maven repos so you'll need to pull in those dependencies by other means. And if your app is a system app, you'll need to provide the platform signature for the signing step.

a) What is the Gradle error you're getting? And which Gradle task gives you that error?

b) You can set up a Makefile to just build the instrumented APK, for example see how it's done here. You can also use the Trade Federation framework to handle the execution and report generation - but you won't get the integration in AS.

c) By instrumentation UI, do you mean starting the tests with the "play button", or showing the test results live as the tests are running? If you mean showing the live results, then I don't believe that's possible - as far as I know it depends on the connectedAndroidTest task. If you just want to execute tests you can create a custom Gradle task that just runs the "adb shell am instrument ..." command.