Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f61fb541 authored by Yohann Roussel's avatar Yohann Roussel Committed by Android Git Automerger
Browse files

am 900224af: Merge "A stress test for concurent multidex extraction."

* commit '900224af':
  A stress test for concurent multidex extraction.
parents b2bd0044 900224af
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
# Copyright (C) 2014 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := tests

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_SDK_VERSION := 9

LOCAL_PACKAGE_NAME := MultiDexLegacyTestServices

LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex

mainDexList:= \
	$(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),$(LOCAL_IS_HOST_MODULE),common)/maindex.list

LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex

include $(BUILD_PACKAGE)

$(mainDexList): $(full_classes_proguard_jar) | $(HOST_OUT_EXECUTABLES)/mainDexClasses
	$(HOST_OUT_EXECUTABLES)/mainDexClasses $< 1>$@

$(built_dex_intermediate): $(mainDexList)
+129 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.framework.multidexlegacytestservices"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="19" />

    <application
        android:label="MultiDexLegacyTestServices">

        <service android:name=".Service1" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices1">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service1" />
            </intent-filter>
        </service>

        <service android:name=".Service2" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices2">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service2" />
            </intent-filter>
        </service>

        <service android:name=".Service3" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices3">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service3" />
            </intent-filter>
        </service>

        <service android:name=".Service4" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices4">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service4" />
            </intent-filter>
        </service>

        <service android:name=".Service5" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices5">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service5" />
            </intent-filter>
        </service>

        <service android:name=".Service6" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices6">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service6" />
            </intent-filter>
        </service>

        <service android:name=".Service7" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices7">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service7" />
            </intent-filter>
        </service>

        <service android:name=".Service8" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices8">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service8" />
            </intent-filter>
        </service>

        <service android:name=".Service9" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices9">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service9" />
            </intent-filter>
        </service>

        <service android:name=".Service10" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices10">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service10" />
            </intent-filter>
        </service>

        <service android:name=".Service11" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices11">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service11" />
            </intent-filter>
        </service>

        <service android:name=".Service12" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices12">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service12" />
            </intent-filter>
        </service>

        <service android:name=".Service13" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices13">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service13" />
            </intent-filter>
        </service>

        <service android:name=".Service14" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices14">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service14" />
            </intent-filter>
        </service>

        <service android:name=".Service15" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices15">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service15" />
            </intent-filter>
        </service>

        <service android:name=".Service16" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices16">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service16" />
            </intent-filter>
        </service>

        <service android:name=".Service17" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices17">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service17" />
            </intent-filter>
        </service>

        <service android:name=".Service18" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices18">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service18" />
            </intent-filter>
        </service>

        <service android:name=".Service19" android:exported="true" android:process=":com.android.framework.multidexlegacytestservices19">
            <intent-filter>
                <action android:name="com.android.framework.multidexlegacytestservices.action.Service19" />
            </intent-filter>
        </service>
        </application>

</manifest>
+167 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.framework.multidexlegacytestservices;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.multidex.MultiDex;
import android.util.Log;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * Empty service for testing legacy multidex. Access more than 64k methods but some are required at
 * init, some only at verification and others during execution.
 */
public abstract class AbstractService extends Service {
    private final String TAG = "MultidexLegacyTestService" + getId();

    private int instanceFieldNotInited;
    private int instanceFieldInited =
            new com.android.framework.multidexlegacytestservices.manymethods.Big043().get43();
    private static int staticField =
            new com.android.framework.multidexlegacytestservices.manymethods.Big044().get44();

    public AbstractService() {
        instanceFieldNotInited = new com.android.framework.multidexlegacytestservices.manymethods.Big042().get42();
    }

    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate");
        Context applicationContext = getApplicationContext();
        File resultFile = new File(applicationContext.getFilesDir(), getId());
        try {
            // Append a constant value in result file, if services crashed and is relaunched, size
            // of the result file will be too big.
            RandomAccessFile raf = new RandomAccessFile(resultFile, "rw");
            raf.seek(raf.length());
            Log.i(TAG, "Writing 0x42434445 at " + raf.length() + " in " + resultFile.getPath());
            raf.writeInt(0x42434445);
            raf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        MultiDex.install(applicationContext);
        Log.i(TAG, "Multi dex installation done.");

        int value = getValue();
        Log.i(TAG, "Saving the result (" + value + ") to " + resultFile.getPath());
        try {
            // Append the check value in result file, keeping the constant values already written.
            RandomAccessFile raf = new RandomAccessFile(resultFile, "rw");
            raf.seek(raf.length());
            Log.i(TAG, "Writing result at " + raf.length() + " in " + resultFile.getPath());
            raf.writeInt(value);
            raf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            // Writing end of processing flags, the existence of the file is the criteria
            RandomAccessFile raf = new RandomAccessFile(new File(applicationContext.getFilesDir(), getId() + ".complete"), "rw");
            Log.i(TAG, "creating complete file " + resultFile.getPath());
            raf.writeInt(0x32333435);
            raf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("Service" + getId(), "Received start id " + startId + ": " + intent);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

    private String getId() {
        return this.getClass().getSimpleName();
    }

    @Override
    public void onDestroy() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public int getValue() {
        int intermediate = -1;
        try {
            intermediate = ReflectIntermediateClass.get(45, 80, 20 /* 5 seems enough on a nakasi,
                using 20 to get some margin */);
        } catch (Exception e) {
            e.printStackTrace();
        }
        int value = new com.android.framework.multidexlegacytestservices.manymethods.Big001().get1() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big002().get2() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big003().get3() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big004().get4() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big005().get5() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big006().get6() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big007().get7() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big008().get8() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big009().get9() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big010().get10() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big011().get11() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big012().get12() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big013().get13() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big014().get14() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big015().get15() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big016().get16() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big017().get17() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big018().get18() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big019().get19() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big020().get20() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big021().get21() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big022().get22() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big023().get23() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big024().get24() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big025().get25() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big026().get26() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big027().get27() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big028().get28() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big029().get29() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big030().get30() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big031().get31() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big032().get32() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big033().get33() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big034().get34() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big035().get35() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big036().get36() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big037().get37() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big038().get38() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big039().get39() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big040().get40() +
                new com.android.framework.multidexlegacytestservices.manymethods.Big041().get41() +
                instanceFieldNotInited +
                instanceFieldInited +
                staticField +
                intermediate;
        return value;
    }

}
+46 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.framework.multidexlegacytestservices;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Offer an indirection to some Big0xx classes and have their initialization
 * spread along a period of time.
 */
public class ReflectIntermediateClass {

    public static int get(int from, int to, int sleepMillis) throws ClassNotFoundException,
            SecurityException, NoSuchMethodException, IllegalArgumentException,
            IllegalAccessException, InvocationTargetException, InstantiationException {
        int value = 0;
        for (int i = from; i <= to; i++) {
            Class<?> bigClass = Class.forName(
                    "com.android.framework.multidexlegacytestservices.manymethods.Big0" + i);
            Method get = bigClass.getMethod("get" + i);
            value += ((Integer) get.invoke(bigClass.newInstance())).intValue();
            try {
                Thread.sleep(sleepMillis);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return value;
    }

}
+24 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.framework.multidexlegacytestservices;


/**
 * Empty service for testing legacy multidex
 */
public class Service1 extends AbstractService {
}
Loading