diff options
42 files changed, 366 insertions, 356 deletions
diff --git a/Android.mk b/Android.mk index c12f74ac84ce..9bfbab54d2c7 100644 --- a/Android.mk +++ b/Android.mk @@ -680,6 +680,7 @@ framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES := \ bouncycastle \ okhttp \ ext \ + icu4j \ framework \ telephony-common \ voip-common diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk index 2ee586f2c3ca..7c8842ca0231 100644 --- a/cmds/bootanimation/Android.mk +++ b/cmds/bootanimation/Android.mk @@ -27,6 +27,8 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_MODULE:= bootanimation +LOCAL_INIT_RC := bootanim.rc + ifdef TARGET_32_BIT_SURFACEFLINGER LOCAL_32_BIT_ONLY := true endif diff --git a/cmds/bootanimation/bootanim.rc b/cmds/bootanimation/bootanim.rc new file mode 100644 index 000000000000..ee0d0b8c042f --- /dev/null +++ b/cmds/bootanimation/bootanim.rc @@ -0,0 +1,6 @@ +service bootanim /system/bin/bootanimation + class core + user graphics + group graphics audio + disabled + oneshot diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 3b6c9bd2479c..9b1a490869cf 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -492,12 +492,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** * String retrieved from the seinfo tag found in selinux policy. This value - * is useful in setting an SELinux security context on the process as well - * as its data directory. + * can be overridden with a value set through the mac_permissions.xml policy + * construct. This value is useful in setting an SELinux security context on + * the process as well as its data directory. The String default is being used + * here to represent a catchall label when no policy matches. * * {@hide} */ - public String seinfo; + public String seinfo = "default"; /** * Paths to all shared libraries this application is linked against. This diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 52b10be0e53e..2a2ad266fcb5 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -68,7 +68,7 @@ public class RecoverySystem { /** Send progress to listeners no more often than this (in ms). */ private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500; - /** Used to communicate with recovery. See bootable/recovery/recovery.c. */ + /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ private static File RECOVERY_DIR = new File("/cache/recovery"); private static File COMMAND_FILE = new File(RECOVERY_DIR, "command"); private static File UNCRYPT_FILE = new File(RECOVERY_DIR, "uncrypt_file"); @@ -506,18 +506,32 @@ public class RecoverySystem { String[] names = RECOVERY_DIR.list(); for (int i = 0; names != null && i < names.length; i++) { if (names[i].startsWith(LAST_PREFIX)) continue; - File f = new File(RECOVERY_DIR, names[i]); - if (!f.delete()) { - Log.e(TAG, "Can't delete: " + f); - } else { - Log.i(TAG, "Deleted: " + f); - } + recursiveDelete(new File(RECOVERY_DIR, names[i])); } return log; } /** + * Internally, delete a given file or directory recursively. + */ + private static void recursiveDelete(File name) { + if (name.isDirectory()) { + String[] files = name.list(); + for (int i = 0; files != null && i < files.length; i++) { + File f = new File(name, files[i]); + recursiveDelete(f); + } + } + + if (!name.delete()) { + Log.e(TAG, "Can't delete: " + name); + } else { + Log.i(TAG, "Deleted: " + name); + } + } + + /** * Internally, recovery treats each line of the command file as a separate * argv, so we only need to protect against newlines and nulls. */ diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 2bfeadb18e20..adb19be94a98 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -356,8 +356,8 @@ static void DetachDescriptors(JNIEnv* env, jintArray fdsToClose) { return; } jsize count = env->GetArrayLength(fdsToClose); - jint *ar = env->GetIntArrayElements(fdsToClose, 0); - if (!ar) { + ScopedIntArrayRO ar(env, fdsToClose); + if (ar.get() == NULL) { ALOGE("Bad fd array"); RuntimeAbort(env); } diff --git a/docs/html/guide/topics/renderscript/compute.jd b/docs/html/guide/topics/renderscript/compute.jd index 2e7ce5632224..b6a6cd77f2df 100644 --- a/docs/html/guide/topics/renderscript/compute.jd +++ b/docs/html/guide/topics/renderscript/compute.jd @@ -215,7 +215,7 @@ import android.support.v8.renderscript.*; <ul> <li>{@code renderscript.target} - Specifies the bytecode version to be generated. We - recommend you set this value the highest available API level and set {@code + recommend you set this value to your minimum required API level and set {@code renderscript.support.mode} to {@code true}. Valid values for this setting are any integer value from 11 to the most recently released API level. If your minimum SDK version specified in your application manifest is set to a higher value, this value is ignored and the target value is set diff --git a/libs/androidfw/Android.mk b/libs/androidfw/Android.mk index 2f287000f746..f682fb8684e8 100644 --- a/libs/androidfw/Android.mk +++ b/libs/androidfw/Android.mk @@ -40,10 +40,9 @@ hostSources := $(commonSources) # For the host # ===================================================== include $(CLEAR_VARS) -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_MODULE:= libandroidfw -LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_HOST_OS := darwin linux windows LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code LOCAL_SRC_FILES:= $(hostSources) @@ -56,13 +55,10 @@ include $(BUILD_HOST_STATIC_LIBRARY) # ===================================================== include $(CLEAR_VARS) -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_MODULE:= libandroidfw -LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES:= $(deviceSources) LOCAL_C_INCLUDES := \ - external/zlib \ system/core/include LOCAL_STATIC_LIBRARIES := libziparchive libbase LOCAL_SHARED_LIBRARIES := \ diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 1c39ffef6fd4..623ea896626b 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -34,7 +34,7 @@ #include <utils/String8.h> #include <utils/threads.h> #include <utils/Timers.h> -#ifdef HAVE_ANDROID_OS +#ifdef __ANDROID__ #include <cutils/trace.h> #endif @@ -54,7 +54,7 @@ _rc; }) #endif -#ifdef HAVE_ANDROID_OS +#ifdef __ANDROID__ #define MY_TRACE_BEGIN(x) ATRACE_BEGIN(x) #define MY_TRACE_END() ATRACE_END() #else @@ -229,7 +229,7 @@ bool AssetManager::addAssetPath(const String8& path, int32_t* cookie) *cookie = static_cast<int32_t>(mAssetPaths.size()); } -#ifdef HAVE_ANDROID_OS +#ifdef __ANDROID__ // Load overlays, if any asset_path oap; for (size_t idx = 0; mZipSet.getOverlay(ap.path, idx, &oap); idx++) { @@ -657,7 +657,7 @@ bool AssetManager::appendPathToResTable(const asset_path& ap) const { ALOGV("Creating shared resources for %s", ap.path.string()); sharedRes = new ResTable(); sharedRes->add(ass, idmap, nextEntryIdx + 1, false); -#ifdef HAVE_ANDROID_OS +#ifdef __ANDROID__ const char* data = getenv("ANDROID_DATA"); LOG_ALWAYS_FATAL_IF(data == NULL, "ANDROID_DATA not set"); String8 overlaysListPath(data); diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 83638104de54..6c9b5297508f 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -721,7 +721,7 @@ const char16_t* ResStringPool::stringAt(size_t idx, size_t* u16len) const AutoMutex lock(mDecodeLock); if (mCache == NULL) { -#ifndef HAVE_ANDROID_OS +#ifndef __ANDROID__ if (kDebugStringPoolNoisy) { ALOGI("CREATING STRING CACHE OF %zu bytes", mHeader->stringCount*sizeof(char16_t**)); diff --git a/libs/androidfw/tests/BackupData_test.cpp b/libs/androidfw/tests/BackupData_test.cpp index 92af7fe790bd..e25b616dcbd9 100644 --- a/libs/androidfw/tests/BackupData_test.cpp +++ b/libs/androidfw/tests/BackupData_test.cpp @@ -108,7 +108,7 @@ TEST_F(BackupDataTest, WriteAndReadSingle) { EXPECT_EQ(DATA1[i], dataBytes[i]) << "data character " << i << " should be equal"; } - delete dataBytes; + delete[] dataBytes; delete writer; delete reader; } diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index c1b50c108c2f..bc75daba44c0 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -773,7 +773,7 @@ void FontRenderer::blurImage(uint8_t** image, int32_t width, int32_t height, flo #endif float *gaussian = new float[2 * intRadius + 1]; - Blur::generateGaussianWeights(gaussian, intRadius); + Blur::generateGaussianWeights(gaussian, radius); uint8_t* scratch = new uint8_t[width * height]; Blur::horizontal(gaussian, intRadius, *image, scratch, width, height); diff --git a/libs/hwui/utils/Blur.cpp b/libs/hwui/utils/Blur.cpp index 877a42216c27..e66cecccd284 100644 --- a/libs/hwui/utils/Blur.cpp +++ b/libs/hwui/utils/Blur.cpp @@ -60,7 +60,9 @@ static float legacyConvertRadiusToSigma(float radius) { return radius > 0 ? 0.3f * radius + 0.6f : 0.0f; } -void Blur::generateGaussianWeights(float* weights, int32_t radius) { +void Blur::generateGaussianWeights(float* weights, float radius) { + int32_t intRadius = convertRadiusToInt(radius); + // Compute gaussian weights for the blur // e is the euler's number static float e = 2.718281828459045f; @@ -68,7 +70,7 @@ void Blur::generateGaussianWeights(float* weights, int32_t radius) { // g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 ) // x is of the form [-radius .. 0 .. radius] // and sigma varies with radius. - float sigma = legacyConvertRadiusToSigma((float) radius); + float sigma = legacyConvertRadiusToSigma(radius); // Now compute the coefficints // We will store some redundant values to save some math during @@ -78,16 +80,16 @@ void Blur::generateGaussianWeights(float* weights, int32_t radius) { float coeff2 = - 1.0f / (2.0f * sigma * sigma); float normalizeFactor = 0.0f; - for (int32_t r = -radius; r <= radius; r ++) { + for (int32_t r = -intRadius; r <= intRadius; r ++) { float floatR = (float) r; - weights[r + radius] = coeff1 * pow(e, floatR * floatR * coeff2); - normalizeFactor += weights[r + radius]; + weights[r + intRadius] = coeff1 * pow(e, floatR * floatR * coeff2); + normalizeFactor += weights[r + intRadius]; } //Now we need to normalize the weights because all our coefficients need to add up to one normalizeFactor = 1.0f / normalizeFactor; - for (int32_t r = -radius; r <= radius; r ++) { - weights[r + radius] *= normalizeFactor; + for (int32_t r = -intRadius; r <= intRadius; r ++) { + weights[r + intRadius] *= normalizeFactor; } } diff --git a/libs/hwui/utils/Blur.h b/libs/hwui/utils/Blur.h index b14533312719..3f21832bf2b5 100644 --- a/libs/hwui/utils/Blur.h +++ b/libs/hwui/utils/Blur.h @@ -34,7 +34,7 @@ public: // accounts for that error and snaps to the appropriate integer boundary. static uint32_t convertRadiusToInt(float radius); - static void generateGaussianWeights(float* weights, int32_t radius); + static void generateGaussianWeights(float* weights, float radius); static void horizontal(float* weights, int32_t radius, const uint8_t* source, uint8_t* dest, int32_t width, int32_t height); static void vertical(float* weights, int32_t radius, const uint8_t* source, diff --git a/packages/WallpaperCropper/AndroidManifest.xml b/packages/WallpaperCropper/AndroidManifest.xml index 81d108589b46..e558d7e257d1 100644 --- a/packages/WallpaperCropper/AndroidManifest.xml +++ b/packages/WallpaperCropper/AndroidManifest.xml @@ -21,7 +21,10 @@ <uses-permission android:name="android.permission.SET_WALLPAPER" /> <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" /> - <application android:requiredForAllUsers="true"> + <application + android:requiredForAllUsers="true" + android:largeHeap="true"> + <activity android:name="WallpaperCropActivity" android:theme="@style/Theme.WallpaperCropper" diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java index d5176424c093..376ed02f711c 100644 --- a/services/core/java/com/android/server/pm/SELinuxMMAC.java +++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java @@ -139,9 +139,6 @@ public final class SELinuxMMAC { case "signer": policies.add(readSignerOrThrow(parser)); break; - case "default": - policies.add(readDefaultOrThrow(parser)); - break; default: skip(parser); } @@ -236,45 +233,6 @@ public final class SELinuxMMAC { } /** - * Loop over a default element looking for seinfo child tags. A {@link Policy} - * instance will be created and returned in the process. All other tags encountered - * will be skipped. - * - * @param parser an XmlPullParser object representing a default element. - * @return the constructed {@link Policy} instance - * @throws IOException - * @throws XmlPullParserException - * @throws IllegalArgumentException if any of the validation checks fail while - * parsing tag values. - * @throws IllegalStateException if any of the invariants fail when constructing - * the {@link Policy} instance. - */ - private static Policy readDefaultOrThrow(XmlPullParser parser) throws IOException, - XmlPullParserException { - - parser.require(XmlPullParser.START_TAG, null, "default"); - Policy.PolicyBuilder pb = new Policy.PolicyBuilder(); - pb.setAsDefaultPolicy(); - - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - - String tagName = parser.getName(); - if ("seinfo".equals(tagName)) { - String seinfo = parser.getAttributeValue(null, "value"); - pb.setGlobalSeinfoOrThrow(seinfo); - readSeinfo(parser); - } else { - skip(parser); - } - } - - return pb.build(); - } - - /** * Loop over a package element looking for seinfo child tags. If found return the * value attribute of the seinfo tag, otherwise return null. All other tags encountered * will be skipped. @@ -340,35 +298,28 @@ public final class SELinuxMMAC { /** * Applies a security label to a package based on an seinfo tag taken from a matched - * policy. All signature based policy stanzas are consulted first and, if no match - * is found, the default policy stanza is then consulted. The security label is - * attached to the ApplicationInfo instance of the package in the event that a matching - * policy was found. + * policy. All signature based policy stanzas are consulted and, if no match is + * found, the default seinfo label of 'default' (set in ApplicationInfo object) is + * used. The security label is attached to the ApplicationInfo instance of the package + * in the event that a matching policy was found. * * @param pkg object representing the package to be labeled. - * @return boolean which determines whether a non null seinfo label was assigned - * to the package. A null value simply represents that no policy matched. */ - public static boolean assignSeinfoValue(PackageParser.Package pkg) { + public static void assignSeinfoValue(PackageParser.Package pkg) { synchronized (sPolicies) { for (Policy policy : sPolicies) { String seinfo = policy.getMatchedSeinfo(pkg); if (seinfo != null) { pkg.applicationInfo.seinfo = seinfo; - if (DEBUG_POLICY_INSTALL) { - Slog.i(TAG, "package (" + pkg.packageName + ") labeled with " + - "seinfo=" + seinfo); - } - return true; + break; } } } if (DEBUG_POLICY_INSTALL) { - Slog.i(TAG, "package (" + pkg.packageName + ") doesn't match any policy; " + - "seinfo will remain null"); + Slog.i(TAG, "package (" + pkg.packageName + ") labeled with " + + "seinfo=" + pkg.applicationInfo.seinfo); } - return false; } /** @@ -509,30 +460,16 @@ public final class SELinuxMMAC { * .build(); * } * </pre> - * <p> - * The following is an example of how to use {@link Policy.PolicyBuilder} to create a - * default based Policy instance. - * </p> - * <pre> - * {@code - * Policy policy = new Policy.PolicyBuilder() - * .setAsDefaultPolicy() - * .setGlobalSeinfoOrThrow("default") - * .build(); - * } - * </pre> */ final class Policy { private final String mSeinfo; - private final boolean mDefaultStanza; private final Set<Signature> mCerts; private final Map<String, String> mPkgMap; // Use the PolicyBuilder pattern to instantiate private Policy(PolicyBuilder builder) { mSeinfo = builder.mSeinfo; - mDefaultStanza = builder.mDefaultStanza; mCerts = Collections.unmodifiableSet(builder.mCerts); mPkgMap = Collections.unmodifiableMap(builder.mPkgMap); } @@ -548,15 +485,6 @@ final class Policy { } /** - * Return whether this policy object represents a default stanza. - * - * @return A boolean indicating if this object represents a default policy stanza. - */ - public boolean isDefaultStanza() { - return mDefaultStanza; - } - - /** * Return whether this policy object contains package name mapping refinements. * * @return A boolean indicating if this object has inner package name mappings. @@ -587,10 +515,6 @@ final class Policy { @Override public String toString() { StringBuilder sb = new StringBuilder(); - if (mDefaultStanza) { - sb.append("defaultStanza=true "); - } - for (Signature cert : mCerts) { sb.append("cert=" + cert.toCharsString().substring(0, 11) + "... "); } @@ -612,22 +536,15 @@ final class Policy { * is determined using the following steps: * </p> * <ul> - * <li> If this Policy instance is defined as a default stanza: - * <ul><li>Return the global seinfo value</li></ul> + * <li> All certs used to sign the apk and all certs stored with this policy + * instance are tested for set equality. If this fails then null is returned. + * </li> + * <li> If all certs match then an appropriate inner package stanza is + * searched based on package name alone. If matched, the stored seinfo + * value for that mapping is returned. * </li> - * <li> If this Policy instance is defined as a signer stanza: - * <ul> - * <li> All certs used to sign the apk and all certs stored with this policy - * instance are tested for set equality. If this fails then null is returned. - * </li> - * <li> If all certs match then an appropriate inner package stanza is - * searched based on package name alone. If matched, the stored seinfo - * value for that mapping is returned. - * </li> - * <li> If all certs matched and no inner package stanza matches then return - * the global seinfo value. The returned value can be null in this case. - * </li> - * </ul> + * <li> If all certs matched and no inner package stanza matches then return + * the global seinfo value. The returned value can be null in this case. * </li> * </ul> * <p> @@ -639,37 +556,34 @@ final class Policy { * A value of null can also be returned if no match occured. */ public String getMatchedSeinfo(PackageParser.Package pkg) { - if (!mDefaultStanza) { - // Check for exact signature matches across all certs. - Signature[] certs = mCerts.toArray(new Signature[0]); - if (!Signature.areExactMatch(certs, pkg.mSignatures)) { - return null; - } + // Check for exact signature matches across all certs. + Signature[] certs = mCerts.toArray(new Signature[0]); + if (!Signature.areExactMatch(certs, pkg.mSignatures)) { + return null; + } - // Check for inner package name matches given that the - // signature checks already passed. - String seinfoValue = mPkgMap.get(pkg.packageName); - if (seinfoValue != null) { - return seinfoValue; - } + // Check for inner package name matches given that the + // signature checks already passed. + String seinfoValue = mPkgMap.get(pkg.packageName); + if (seinfoValue != null) { + return seinfoValue; } - // Return the global seinfo value (even if it's null). + // Return the global seinfo value. return mSeinfo; } /** * A nested builder class to create {@link Policy} instances. A {@link Policy} * class instance represents one valid policy stanza found in a mac_permissions.xml - * file. A valid policy stanza is defined to be either a signer or default stanza - * which obeys the rules outlined in external/sepolicy/mac_permissions.xml. The - * {@link #build} method ensures a set of invariants are upheld enforcing the correct - * stanza structure before returning a valid Policy object. + * file. A valid policy stanza is defined to be a signer stanza which obeys the rules + * outlined in external/sepolicy/mac_permissions.xml. The {@link #build} method + * ensures a set of invariants are upheld enforcing the correct stanza structure + * before returning a valid Policy object. */ public static final class PolicyBuilder { private String mSeinfo; - private boolean mDefaultStanza; private final Set<Signature> mCerts; private final Map<String, String> mPkgMap; @@ -679,19 +593,6 @@ final class Policy { } /** - * Sets this stanza as a default stanza. All policy stanzas are assumed to - * be signer stanzas unless this method is explicitly called. Default stanzas - * are treated differently with respect to allowable child tags, ordering and - * when and how policy decisions are enforced. - * - * @return The reference to this PolicyBuilder. - */ - public PolicyBuilder setAsDefaultPolicy() { - mDefaultStanza = true; - return this; - } - - /** * Adds a signature to the set of certs used for validation checks. The purpose * being that all contained certs will need to be matched against all certs * contained with an apk. @@ -713,11 +614,8 @@ final class Policy { /** * Set the global seinfo tag for this policy stanza. The global seinfo tag - * represents the seinfo element that is used in one of two ways depending on - * its context. When attached to a signer tag the global seinfo represents an - * assignment when there isn't a further inner package refinement in policy. - * When used with a default tag, it represents the only allowable assignment - * value. + * when attached to a signer tag represents the assignment when there isn't a + * further inner package refinement in policy. * * @param seinfo the seinfo value given as a String. * @return The reference to this PolicyBuilder. @@ -743,9 +641,7 @@ final class Policy { /** * Create a package name to seinfo value mapping. Each mapping represents * the seinfo value that will be assigned to the described package name. - * These localized mappings allow the global seinfo to be overriden. This - * mapping provides no value when used in conjunction with a default stanza; - * enforced through the {@link #build} method. + * These localized mappings allow the global seinfo to be overriden. * * @param pkgName the android package name given to the app * @param seinfo the seinfo value that will be assigned to the passed pkgName @@ -802,51 +698,25 @@ final class Policy { * about the expected structure of a policy stanza. * Those invariants are: * </p> - * <ul> - * <li> If a default stanza - * <ul> - * <li> an attached global seinfo tag must be present </li> - * <li> no signatures and no package names can be present </li> - * </ul> - * </li> - * <li> If a signer stanza - * <ul> - * <li> at least one cert must be found </li> - * <li> either a global seinfo value is present OR at least one - * inner package mapping must be present BUT not both. </li> - * </ul> - * </li> - * </ul> - * + * <ul> + * <li> at least one cert must be found </li> + * <li> either a global seinfo value is present OR at least one + * inner package mapping must be present BUT not both. </li> + * </ul> * @return an instance of {@link Policy} with the options set from this builder * @throws IllegalStateException if an invariant is violated. */ public Policy build() { Policy p = new Policy(this); - if (p.mDefaultStanza) { - if (p.mSeinfo == null) { - String err = "Missing global seinfo tag with default stanza."; - throw new IllegalStateException(err); - } - if (p.mCerts.size() != 0) { - String err = "Certs not allowed with default stanza."; - throw new IllegalStateException(err); - } - if (!p.mPkgMap.isEmpty()) { - String err = "Inner package mappings not allowed with default stanza."; - throw new IllegalStateException(err); - } - } else { - if (p.mCerts.size() == 0) { - String err = "Missing certs with signer tag. Expecting at least one."; - throw new IllegalStateException(err); - } - if (!(p.mSeinfo == null ^ p.mPkgMap.isEmpty())) { - String err = "Only seinfo tag XOR package tags are allowed within " + - "a signer stanza."; - throw new IllegalStateException(err); - } + if (p.mCerts.isEmpty()) { + String err = "Missing certs with signer tag. Expecting at least one."; + throw new IllegalStateException(err); + } + if (!(p.mSeinfo == null ^ p.mPkgMap.isEmpty())) { + String err = "Only seinfo tag XOR package tags are allowed within " + + "a signer stanza."; + throw new IllegalStateException(err); } return p; @@ -861,7 +731,6 @@ final class Policy { * <ul> * <li> signer stanzas with inner package mappings </li> * <li> signer stanzas with global seinfo tags </li> - * <li> default stanza </li> * </ul> * This comparison also checks for duplicate entries on the input selectors. Any * found duplicates will be flagged and can be checked with {@link #foundDuplicate}. @@ -878,11 +747,6 @@ final class PolicyComparator implements Comparator<Policy> { @Override public int compare(Policy p1, Policy p2) { - // Give precedence to signature stanzas over default stanzas - if (p1.isDefaultStanza() != p2.isDefaultStanza()) { - return p1.isDefaultStanza() ? 1 : -1; - } - // Give precedence to stanzas with inner package mappings if (p1.hasInnerPackages() != p2.hasInnerPackages()) { return p1.hasInnerPackages() ? -1 : 1; @@ -890,7 +754,7 @@ final class PolicyComparator implements Comparator<Policy> { // Check for duplicate entries if (p1.getSignatures().equals(p2.getSignatures())) { - // Checks if default stanza or a signer w/o inner package names + // Checks if signer w/o inner package names if (p1.hasGlobalSeinfo()) { duplicateFound = true; Slog.e(SELinuxMMAC.TAG, "Duplicate policy entry: " + p1.toString()); diff --git a/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java b/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java index 04774d404288..1ac2622e2276 100644 --- a/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java +++ b/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java @@ -37,7 +37,7 @@ public class SELinuxPolicyInstallReceiver extends ConfigUpdateInstallReceiver { private static final String TAG = "SELinuxPolicyInstallReceiver"; private static final String sepolicyPath = "sepolicy"; - private static final String fileContextsPath = "file_contexts"; + private static final String fileContextsPath = "file_contexts.bin"; private static final String propertyContextsPath = "property_contexts"; private static final String seappContextsPath = "seapp_contexts"; private static final String versionPath = "selinux_version"; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 85b2a41f6c5f..97a38925a8ab 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -639,6 +639,7 @@ public class WindowManagerService extends IWindowManager.Stub final InputManagerService mInputManager; final DisplayManagerInternal mDisplayManagerInternal; final DisplayManager mDisplayManager; + final Display[] mDisplays; // Who is holding the screen on. Session mHoldingScreenOn; @@ -851,8 +852,8 @@ public class WindowManagerService extends IWindowManager.Stub mFxSession = new SurfaceSession(); mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); - Display[] displays = mDisplayManager.getDisplays(); - for (Display display : displays) { + mDisplays = mDisplayManager.getDisplays(); + for (Display display : mDisplays) { createDisplayContentLocked(display); } @@ -7599,7 +7600,9 @@ public class WindowManagerService extends IWindowManager.Stub } public void displayReady() { - displayReady(Display.DEFAULT_DISPLAY); + for (Display display : mDisplays) { + displayReady(display.getDisplayId()); + } synchronized(mWindowMap) { final DisplayContent displayContent = getDefaultDisplayContentLocked(); diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk index 94a74c4ca987..92eb26221905 100644 --- a/tools/aapt/Android.mk +++ b/tools/aapt/Android.mk @@ -53,7 +53,6 @@ aaptTests := \ tests/Pseudolocales_test.cpp \ tests/ResourceFilter_test.cpp -aaptHostLdLibs := aaptHostStaticLibs := \ libandroidfw \ libpng \ @@ -67,17 +66,13 @@ aaptHostStaticLibs := \ aaptCFlags := -DAAPT_VERSION=\"$(BUILD_NUMBER_FROM_FILE)\" aaptCFlags += -Wall -Werror -ifeq ($(HOST_OS),linux) - aaptHostLdLibs += -lrt -ldl -lpthread -endif +aaptHostLdLibs_linux := -lrt -ldl -lpthread # Statically link libz for MinGW (Win SDK under Linux), # and dynamically link for all others. -ifneq ($(strip $(USE_MINGW)),) - aaptHostStaticLibs += libz -else - aaptHostLdLibs += -lz -endif +aaptHostStaticLibs_windows := libz +aaptHostLdLibs_linux += -lz +aaptHostLdLibs_darwin := -lz # ========================================================== @@ -86,13 +81,13 @@ endif include $(CLEAR_VARS) LOCAL_MODULE := libaapt -LOCAL_CFLAGS += -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags) -LOCAL_CPPFLAGS += $(aaptCppFlags) -ifeq (darwin,$(HOST_OS)) -LOCAL_CFLAGS += -D_DARWIN_UNLIMITED_STREAMS -endif +LOCAL_MODULE_HOST_OS := darwin linux windows +LOCAL_CFLAGS := -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags) +LOCAL_CPPFLAGS := $(aaptCppFlags) +LOCAL_CFLAGS_darwin := -D_DARWIN_UNLIMITED_STREAMS LOCAL_SRC_FILES := $(aaptSources) -LOCAL_STATIC_LIBRARIES += $(aaptHostStaticLibs) +LOCAL_STATIC_LIBRARIES := $(aaptHostStaticLibs) +LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows) include $(BUILD_HOST_STATIC_LIBRARY) @@ -102,11 +97,14 @@ include $(BUILD_HOST_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := aapt -LOCAL_CFLAGS += $(aaptCFlags) -LOCAL_CPPFLAGS += $(aaptCppFlags) -LOCAL_LDLIBS += $(aaptHostLdLibs) +LOCAL_MODULE_HOST_OS := darwin linux windows +LOCAL_CFLAGS := $(aaptCFlags) +LOCAL_CPPFLAGS := $(aaptCppFlags) +LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin) +LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux) LOCAL_SRC_FILES := $(aaptMain) -LOCAL_STATIC_LIBRARIES += libaapt $(aaptHostStaticLibs) +LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs) +LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows) include $(BUILD_HOST_EXECUTABLE) @@ -115,15 +113,16 @@ include $(BUILD_HOST_EXECUTABLE) # Build the host tests: libaapt_tests # ========================================================== include $(CLEAR_VARS) -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_MODULE := libaapt_tests -LOCAL_CFLAGS += $(aaptCFlags) -LOCAL_CPPFLAGS += $(aaptCppFlags) -LOCAL_LDLIBS += $(aaptHostLdLibs) -LOCAL_SRC_FILES += $(aaptTests) -LOCAL_C_INCLUDES += $(LOCAL_PATH) -LOCAL_STATIC_LIBRARIES += libaapt $(aaptHostStaticLibs) +LOCAL_CFLAGS := $(aaptCFlags) +LOCAL_CPPFLAGS := $(aaptCppFlags) +LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin) +LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux) +LOCAL_SRC_FILES := $(aaptTests) +LOCAL_C_INCLUDES := $(LOCAL_PATH) +LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs) +LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows) include $(BUILD_HOST_NATIVE_TEST) diff --git a/tools/aapt/CacheUpdater.h b/tools/aapt/CacheUpdater.h index fade53ac2629..10a1bbc2f4aa 100644 --- a/tools/aapt/CacheUpdater.h +++ b/tools/aapt/CacheUpdater.h @@ -12,7 +12,7 @@ #include <sys/stat.h> #include <stdio.h> #include "Images.h" -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 #include <direct.h> #endif @@ -81,7 +81,7 @@ public: // Advance to the next segment of the path existsPath.appendPath(toCreate.walkPath(&remains)); toCreate = remains; -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 _mkdir(existsPath.string()); #else mkdir(existsPath.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index 8a0a39cfb445..d12ab3b725c8 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -215,7 +215,7 @@ int doList(Bundle* bundle) goto bail; } -#ifdef HAVE_ANDROID_OS +#ifdef __ANDROID__ static const bool kHaveAndroidOs = true; #else static const bool kHaveAndroidOs = false; @@ -633,7 +633,7 @@ int doDump(Bundle* bundle) Asset* asset = NULL; if (strcmp("resources", option) == 0) { -#ifndef HAVE_ANDROID_OS +#ifndef __ANDROID__ res.print(bundle->getValues()); #endif diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index beb94fdbcfc5..aa7778f9114d 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -2682,7 +2682,7 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, if (s > last && (*s == '.' || *s == 0)) { String8 part(last, s-last); dest.appendPath(part); -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 _mkdir(dest.string()); #else mkdir(dest.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp index bf31bc137fa8..1860147dc2ee 100644 --- a/tools/aapt/XMLNode.cpp +++ b/tools/aapt/XMLNode.cpp @@ -12,7 +12,7 @@ #include <errno.h> #include <string.h> -#ifndef HAVE_MS_C_RUNTIME +#ifndef _WIN32 #define O_BINARY 0 #endif diff --git a/tools/aidl/AST.h b/tools/aidl/AST.h index ead5e7ae3439..0640b2a6a591 100644 --- a/tools/aidl/AST.h +++ b/tools/aidl/AST.h @@ -1,5 +1,5 @@ -#ifndef AIDL_AST_H -#define AIDL_AST_H +#ifndef AIDL_AST_H_ +#define AIDL_AST_H_ #include <string> #include <vector> @@ -7,7 +7,9 @@ #include <stdarg.h> #include <stdio.h> -using namespace std; +using std::set; +using std::string; +using std::vector; class Type; @@ -368,4 +370,4 @@ struct Document virtual void Write(FILE* to); }; -#endif // AIDL_AST_H +#endif // AIDL_AST_H_ diff --git a/tools/aidl/Android.mk b/tools/aidl/Android.mk index efd60a2cda99..354563ae48bc 100644 --- a/tools/aidl/Android.mk +++ b/tools/aidl/Android.mk @@ -6,24 +6,65 @@ ifeq ($(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)),) LOCAL_PATH:= $(call my-dir) + +# Logic shared between aidl and its unittests include $(CLEAR_VARS) +LOCAL_MODULE := libaidl-common + +LOCAL_CLANG_CFLAGS := -Wall -Werror +# Tragically, the code is riddled with unused parameters. +LOCAL_CLANG_CFLAGS += -Wno-unused-parameter +# yacc dumps a lot of code *just in case*. +LOCAL_CLANG_CFLAGS += -Wno-unused-function +LOCAL_CLANG_CFLAGS += -Wno-unneeded-internal-declaration +# yacc is a tool from a more civilized age. +LOCAL_CLANG_CFLAGS += -Wno-deprecated-register +# yacc also has a habit of using char* over const char*. +LOCAL_CLANG_CFLAGS += -Wno-writable-strings LOCAL_SRC_FILES := \ - aidl_language_l.l \ - aidl_language_y.y \ - aidl.cpp \ - aidl_language.cpp \ - options.cpp \ - search_path.cpp \ - AST.cpp \ - Type.cpp \ - generate_java.cpp \ - generate_java_binder.cpp \ - generate_java_rpc.cpp - -LOCAL_CFLAGS := -g + AST.cpp \ + Type.cpp \ + aidl.cpp \ + aidl_language.cpp \ + aidl_language_l.l \ + aidl_language_y.y \ + generate_java.cpp \ + generate_java_binder.cpp \ + generate_java_rpc.cpp \ + options.cpp \ + search_path.cpp \ + +include $(BUILD_HOST_STATIC_LIBRARY) + + +# aidl executable +include $(CLEAR_VARS) LOCAL_MODULE := aidl +LOCAL_MODULE_HOST_OS := darwin linux windows +LOCAL_CFLAGS := -Wall -Werror +LOCAL_SRC_FILES := main.cpp +LOCAL_STATIC_LIBRARIES := libaidl-common include $(BUILD_HOST_EXECUTABLE) + +# Unit tests +include $(CLEAR_VARS) +LOCAL_MODULE := aidl_unittests + +LOCAL_CFLAGS := -g -DUNIT_TEST -Wall -Werror +LOCAL_SRC_FILES := \ + options_unittest.cpp \ + test_main.cpp \ + tests/test.cpp \ + +LOCAL_STATIC_LIBRARIES := \ + libaidl-common \ + libgmock_host \ + libgtest_host \ + +LOCAL_LDLIBS := -lrt +include $(BUILD_HOST_NATIVE_TEST) + endif # No TARGET_BUILD_APPS or TARGET_BUILD_PDK diff --git a/tools/aidl/Type.h b/tools/aidl/Type.h index ae12720142e8..cf6eaff556c4 100644 --- a/tools/aidl/Type.h +++ b/tools/aidl/Type.h @@ -1,11 +1,12 @@ -#ifndef AIDL_TYPE_H -#define AIDL_TYPE_H +#ifndef AIDL_TYPE_H_ +#define AIDL_TYPE_H_ #include "AST.h" #include <string> #include <vector> -using namespace std; +using std::string; +using std::vector; class Type { @@ -539,4 +540,4 @@ extern Expression* FALSE_VALUE; void register_base_types(); -#endif // AIDL_TYPE_H +#endif // AIDL_TYPE_H_ diff --git a/tools/aidl/aidl.cpp b/tools/aidl/aidl.cpp index 368e73d05f18..d77f2b13dd97 100644 --- a/tools/aidl/aidl.cpp +++ b/tools/aidl/aidl.cpp @@ -15,7 +15,7 @@ #include <string.h> #include <map> -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 #include <io.h> #include <direct.h> #include <sys/stat.h> @@ -31,7 +31,10 @@ #define MIN_USER_SET_METHOD_ID 0 #define MAX_USER_SET_METHOD_ID 16777214 -using namespace std; +using std::map; +using std::set; +using std::string; +using std::vector; static void test_document(document_item_type* d) @@ -162,11 +165,6 @@ import_import_parsed(buffer_type* statement) { } -static ParserCallbacks g_importCallbacks = { - &main_document_parsed, - &import_import_parsed -}; - // ========================================================== static int check_filename(const char* filename, const char* package, buffer_type* name) @@ -754,7 +752,7 @@ check_outputFilePath(const string& path) { if (path[i] == OS_PATH_SEPARATOR) { string p = path.substr(0, i); if (access(path.data(), F_OK) != 0) { -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 _mkdir(p.data()); #else mkdir(p.data(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); @@ -938,7 +936,7 @@ check_and_assign_method_ids(const char * filename, interface_item_type* first_it } // ========================================================== -static int +int compile_aidl(Options& options) { int err = 0, N; @@ -1068,7 +1066,7 @@ compile_aidl(Options& options) return err; } -static int +int preprocess_aidl(const Options& options) { vector<string> lines; @@ -1113,7 +1111,7 @@ preprocess_aidl(const Options& options) // write preprocessed file int fd = open( options.outputFileName.c_str(), O_RDWR|O_CREAT|O_TRUNC|O_BINARY, -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 _S_IREAD|_S_IWRITE); #else S_IRUSR|S_IWUSR|S_IRGRP); @@ -1140,24 +1138,3 @@ preprocess_aidl(const Options& options) close(fd); return 0; } - -// ========================================================== -int -main(int argc, const char **argv) -{ - Options options; - int result = parse_options(argc, argv, &options); - if (result) { - return result; - } - - switch (options.task) - { - case COMPILE_AIDL: - return compile_aidl(options); - case PREPROCESS_AIDL: - return preprocess_aidl(options); - } - fprintf(stderr, "aidl: internal error\n"); - return 1; -} diff --git a/tools/aidl/aidl.h b/tools/aidl/aidl.h new file mode 100644 index 000000000000..98b15f36c21a --- /dev/null +++ b/tools/aidl/aidl.h @@ -0,0 +1,9 @@ +#ifndef AIDL_AIDL_H_ +#define AIDL_AIDL_H_ + +#include "options.h" + +int compile_aidl(Options& options); +int preprocess_aidl(const Options& options); + +#endif // AIDL_AIDL_H_ diff --git a/tools/aidl/aidl_language.cpp b/tools/aidl/aidl_language.cpp index cd6a3bd5dfc1..5fab6c26431a 100644 --- a/tools/aidl/aidl_language.cpp +++ b/tools/aidl/aidl_language.cpp @@ -3,7 +3,7 @@ #include <string.h> #include <stdlib.h> -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 int isatty(int fd) { return (fd == 0); diff --git a/tools/aidl/aidl_language.h b/tools/aidl/aidl_language.h index de1370c086f5..1be5a9bbeb6d 100644 --- a/tools/aidl/aidl_language.h +++ b/tools/aidl/aidl_language.h @@ -1,5 +1,5 @@ -#ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H -#define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H +#ifndef AIDL_AIDL_LANGUAGE_H_ +#define AIDL_AIDL_LANGUAGE_H_ typedef enum { @@ -169,4 +169,4 @@ void init_buffer_type(buffer_type* buf, int lineno); #endif -#endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H +#endif // AIDL_AIDL_LANGUAGE_H_ diff --git a/tools/aidl/generate_java.h b/tools/aidl/generate_java.h index 4bfcfeba07c8..413a5b379c6d 100644 --- a/tools/aidl/generate_java.h +++ b/tools/aidl/generate_java.h @@ -1,12 +1,13 @@ -#ifndef GENERATE_JAVA_H -#define GENERATE_JAVA_H +#ifndef AIDL_GENERATE_JAVA_H_ +#define AIDL_GENERATE_JAVA_H_ #include "aidl_language.h" #include "AST.h" #include <string> -using namespace std; +using std::string; +using std::vector; int generate_java(const string& filename, const string& originalSrc, interface_type* iface); @@ -29,5 +30,5 @@ private: int m_index; }; -#endif // GENERATE_JAVA_H +#endif // AIDL_GENERATE_JAVA_H_ diff --git a/tools/aidl/main.cpp b/tools/aidl/main.cpp new file mode 100644 index 000000000000..7cc2198bb5df --- /dev/null +++ b/tools/aidl/main.cpp @@ -0,0 +1,23 @@ +#include "aidl.h" +#include "options.h" + +#include <stdio.h> + +int +main(int argc, const char **argv) +{ + Options options; + int result = parse_options(argc, argv, &options); + if (result) { + return result; + } + + switch (options.task) { + case COMPILE_AIDL: + return compile_aidl(options); + case PREPROCESS_AIDL: + return preprocess_aidl(options); + } + fprintf(stderr, "aidl: internal error\n"); + return 1; +} diff --git a/tools/aidl/options.cpp b/tools/aidl/options.cpp index 7b2daebec09e..52b0972a89ee 100644 --- a/tools/aidl/options.cpp +++ b/tools/aidl/options.cpp @@ -48,10 +48,6 @@ parse_options(int argc, const char* const* argv, Options *options) return 0; } - options->task = COMPILE_AIDL; - options->failOnParcelable = false; - options->autoDepFile = false; - // OPTIONS while (i < argc) { const char* s = argv[i]; diff --git a/tools/aidl/options.h b/tools/aidl/options.h index 387e37d08732..65d0961d27fc 100644 --- a/tools/aidl/options.h +++ b/tools/aidl/options.h @@ -1,11 +1,12 @@ -#ifndef DEVICE_TOOLS_AIDL_H -#define DEVICE_TOOLS_AIDL_H +#ifndef AIDL_OPTIONS_H_ +#define AIDL_OPTIONS_H_ #include <string.h> #include <string> #include <vector> -using namespace std; +using std::string; +using std::vector; enum { COMPILE_AIDL, @@ -15,15 +16,15 @@ enum { // This struct is the parsed version of the command line options struct Options { - int task; - bool failOnParcelable; + int task{COMPILE_AIDL}; + bool failOnParcelable{false}; vector<string> importPaths; vector<string> preprocessedFiles; string inputFileName; string outputFileName; string outputBaseFolder; string depFileName; - bool autoDepFile; + bool autoDepFile{false}; vector<string> filesToPreprocess; }; @@ -33,4 +34,4 @@ struct Options // It also prints the usage statement on failure. int parse_options(int argc, const char* const* argv, Options *options); -#endif // DEVICE_TOOLS_AIDL_H +#endif // AIDL_OPTIONS_H_ diff --git a/tools/aidl/options_test.cpp b/tools/aidl/options_test.cpp index bd106ce54f2d..7ac527dc9e4f 100644 --- a/tools/aidl/options_test.cpp +++ b/tools/aidl/options_test.cpp @@ -3,7 +3,8 @@ const bool VERBOSE = false; -using namespace std; +using std::string; +using std::vector; struct Answer { const char* argv[8]; diff --git a/tools/aidl/options_unittest.cpp b/tools/aidl/options_unittest.cpp new file mode 100644 index 000000000000..fec7f877d02a --- /dev/null +++ b/tools/aidl/options_unittest.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015, 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. + */ + +#include <string> +#include <vector> + +#include <gtest/gtest.h> + +#include "options.h" + +using std::vector; +using std::string; + +const char kPreprocessCommandOutputFile[] = "output_file_name"; +const char kPreprocessCommandInput1[] = "input1"; +const char kPreprocessCommandInput2[] = "input2"; +const char kPreprocessCommandInput3[] = "input3"; +const char* kPreprocessCommand[] = { + "aidl", "--preprocess", + kPreprocessCommandOutputFile, + kPreprocessCommandInput1, + kPreprocessCommandInput2, + kPreprocessCommandInput3, +}; + +TEST(OptionsTests, ParsesPreprocess) { + Options options; + const int argc = sizeof(kPreprocessCommand) / sizeof(*kPreprocessCommand); + EXPECT_EQ(parse_options(argc, kPreprocessCommand, &options), 0); + EXPECT_EQ(options.task, PREPROCESS_AIDL); + EXPECT_EQ(options.failOnParcelable, false); + EXPECT_EQ(options.importPaths.size(), 0u); + EXPECT_EQ(options.preprocessedFiles.size(), 0u); + EXPECT_EQ(options.inputFileName, string{""}); + EXPECT_EQ(options.outputFileName, string{kPreprocessCommandOutputFile}); + EXPECT_EQ(options.autoDepFile, false); + const vector<string> expected_input{kPreprocessCommandInput1, + kPreprocessCommandInput2, + kPreprocessCommandInput3}; + EXPECT_EQ(options.filesToPreprocess, expected_input); +} diff --git a/tools/aidl/os.h b/tools/aidl/os.h index 79d2c35eea3d..752ed4777b0c 100644 --- a/tools/aidl/os.h +++ b/tools/aidl/os.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef _FRAMEWORKS_BASE_TOOLS_AIDL_OS_SEP_H_ -#define _FRAMEWORKS_BASE_TOOLS_AIDL_OS_SEP_H_ +#ifndef AIDL_OS_H_ +#define AIDL_OS_H_ #if defined(_WIN32) #define OS_PATH_SEPARATOR '\\' @@ -23,4 +23,4 @@ #define OS_PATH_SEPARATOR '/' #endif -#endif +#endif // AIDL_OS_H_ diff --git a/tools/aidl/search_path.cpp b/tools/aidl/search_path.cpp index 29dbe260c4f1..029e216b0abd 100644 --- a/tools/aidl/search_path.cpp +++ b/tools/aidl/search_path.cpp @@ -4,7 +4,7 @@ #include "os.h" #include <string.h> -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 #include <io.h> #endif @@ -42,7 +42,7 @@ find_import_file(const char* given) } f.append(expected); -#ifdef HAVE_MS_C_RUNTIME +#ifdef _WIN32 /* check that the file exists and is not write-only */ if (0 == _access(f.c_str(), 0) && /* mode 0=exist */ 0 == _access(f.c_str(), 4) ) { /* mode 4=readable */ diff --git a/tools/aidl/search_path.h b/tools/aidl/search_path.h index 2bf94b12bbf1..de10d9b8445b 100644 --- a/tools/aidl/search_path.h +++ b/tools/aidl/search_path.h @@ -1,12 +1,15 @@ -#ifndef DEVICE_TOOLS_AIDL_SEARCH_PATH_H -#define DEVICE_TOOLS_AIDL_SEARCH_PATH_H +#ifndef AIDL_SEARCH_PATH_H_ +#define AIDL_SEARCH_PATH_H_ #include <stdio.h> #if __cplusplus #include <vector> #include <string> -using namespace std; + +using std::string; +using std::vector; + extern "C" { #endif @@ -19,5 +22,4 @@ char* find_import_file(const char* given); void set_import_paths(const vector<string>& importPaths); #endif -#endif // DEVICE_TOOLS_AIDL_SEARCH_PATH_H - +#endif // AIDL_SEARCH_PATH_H_ diff --git a/tools/aidl/test_main.cpp b/tools/aidl/test_main.cpp new file mode 100644 index 000000000000..4d820af774e1 --- /dev/null +++ b/tools/aidl/test_main.cpp @@ -0,0 +1,6 @@ +#include <gtest/gtest.h> + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tools/aidl/tests/test.cpp b/tools/aidl/tests/test.cpp new file mode 100644 index 000000000000..15ae294138a8 --- /dev/null +++ b/tools/aidl/tests/test.cpp @@ -0,0 +1,3 @@ +#include <gtest/gtest.h> + +TEST(DummyCase, DummyTest) {} diff --git a/tools/split-select/Android.mk b/tools/split-select/Android.mk index d9ddf08862b3..239bed589412 100644 --- a/tools/split-select/Android.mk +++ b/tools/split-select/Android.mk @@ -43,7 +43,6 @@ cIncludes := \ external/zlib \ frameworks/base/tools -hostLdLibs := hostStaticLibs := \ libaapt \ libandroidfw \ @@ -57,17 +56,13 @@ hostStaticLibs := \ cFlags := -Wall -Werror -ifeq ($(HOST_OS),linux) - hostLdLibs += -lrt -ldl -lpthread -endif +hostLdLibs_linux := -lrt -ldl -lpthread # Statically link libz for MinGW (Win SDK under Linux), # and dynamically link for all others. -ifneq ($(strip $(USE_MINGW)),) - hostStaticLibs += libz -else - hostLdLibs += -lz -endif +hostStaticLibs_windows := libz +hostLdLibs_darwin := -lz +hostLdLibs_linux += -lz # ========================================================== @@ -75,11 +70,12 @@ endif # ========================================================== include $(CLEAR_VARS) LOCAL_MODULE := libsplit-select +LOCAL_MODULE_HOST_OS := darwin linux windows LOCAL_SRC_FILES := $(sources) -LOCAL_C_INCLUDES += $(cIncludes) -LOCAL_CFLAGS += $(cFlags) -D_DARWIN_UNLIMITED_STREAMS +LOCAL_C_INCLUDES := $(cIncludes) +LOCAL_CFLAGS := $(cFlags) -D_DARWIN_UNLIMITED_STREAMS include $(BUILD_HOST_STATIC_LIBRARY) @@ -93,10 +89,12 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(testSources) -LOCAL_C_INCLUDES += $(cIncludes) -LOCAL_STATIC_LIBRARIES += libsplit-select $(hostStaticLibs) -LOCAL_LDLIBS += $(hostLdLibs) -LOCAL_CFLAGS += $(cFlags) +LOCAL_C_INCLUDES := $(cIncludes) +LOCAL_STATIC_LIBRARIES := libsplit-select $(hostStaticLibs) +LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows) +LOCAL_LDLIBS_darwin := $(hostLdLibs_darwin) +LOCAL_LDLIBS_linux := $(hostLdLibs_linux) +LOCAL_CFLAGS := $(cFlags) include $(BUILD_HOST_NATIVE_TEST) @@ -105,13 +103,16 @@ include $(BUILD_HOST_NATIVE_TEST) # ========================================================== include $(CLEAR_VARS) LOCAL_MODULE := split-select +LOCAL_MODULE_HOST_OS := darwin linux windows LOCAL_SRC_FILES := $(main) -LOCAL_C_INCLUDES += $(cIncludes) -LOCAL_STATIC_LIBRARIES += libsplit-select $(hostStaticLibs) -LOCAL_LDLIBS += $(hostLdLibs) -LOCAL_CFLAGS += $(cFlags) +LOCAL_C_INCLUDES := $(cIncludes) +LOCAL_STATIC_LIBRARIES := libsplit-select $(hostStaticLibs) +LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows) +LOCAL_LDLIBS_darwin := $(hostLdLibs_darwin) +LOCAL_LDLIBS_linux := $(hostLdLibs_linux) +LOCAL_CFLAGS := $(cFlags) include $(BUILD_HOST_EXECUTABLE) |