Java源码示例:com.android.sdklib.IAndroidTarget

示例1
/**
 * Returns the targets (platforms & addons) that are available in the SDK.
 * The target list is created on demand the first time then cached.
 * It will not refreshed unless {@link #clearLocalPkg} is called to clear platforms
 * and/or add-ons.
 * <p/>
 * The array can be empty but not null.
 */
@NonNull
public IAndroidTarget[] getTargets() {
    synchronized (mLocalPackages) {
        if (mReloadTargets) {
            LocalPkgInfo[] pkgsInfos = getPkgsInfos(EnumSet.of(PkgType.PKG_PLATFORM,
                                                               PkgType.PKG_ADDON));
            int n = pkgsInfos.length;
            mCachedTargets.clear();
            for (int i = 0; i < n; i++) {
                LocalPkgInfo info = pkgsInfos[i];
                assert info instanceof LocalPlatformPkgInfo;
                if (info instanceof LocalPlatformPkgInfo) {
                    IAndroidTarget target = ((LocalPlatformPkgInfo) info).getAndroidTarget();
                    if (target != null) {
                        mCachedTargets.add(target);
                    }
                }
            }
        }
        return mCachedTargets.toArray(new IAndroidTarget[mCachedTargets.size()]);
    }
}
 
示例2
/**
 * Installs the project icons.
 * @param resourceFolder the resource folder
 * @param target the target of the project.
 * @return true if any icon was installed.
 */
private boolean installIcons(File resourceFolder, IAndroidTarget target)
        throws ProjectCreateException {
    // query the target for its template directory
    String templateFolder = target.getPath(IAndroidTarget.TEMPLATES);

    boolean installedIcon = false;

    installedIcon |= installIcon(templateFolder, "ic_launcher_xhdpi.png", resourceFolder,
            "drawable-xhdpi");
    installedIcon |= installIcon(templateFolder, "ic_launcher_hdpi.png", resourceFolder,
            "drawable-hdpi");
    installedIcon |= installIcon(templateFolder, "ic_launcher_mdpi.png", resourceFolder,
            "drawable-mdpi");
    installedIcon |= installIcon(templateFolder, "ic_launcher_ldpi.png", resourceFolder,
            "drawable-ldpi");

    return installedIcon;
}
 
示例3
@Nullable
@Override
public File getDefaultSkin() {
    // only one skin? easy.
    if (mSkins.length == 1) {
        return mSkins[0];
    }

    // look for the skin name in the platform props
    String skinName = mProperties.get(SdkConstants.PROP_SDK_DEFAULT_SKIN);
    if (skinName == null) {
        // otherwise try to find a good default.
        if (mVersion.getApiLevel() >= 4) {
            // at this time, this is the default skin for all older platforms that had 2+ skins.
            skinName = "WVGA800";                                       //$NON-NLS-1$
        } else {
            skinName = "HVGA"; // this is for 1.5 and earlier.          //$NON-NLS-1$
        }
    }

    return new File(getFile(IAndroidTarget.SKINS), skinName);
}
 
示例4
@Override
public int compareTo(IAndroidTarget target) {
    // quick check.
    if (this == target) {
        return 0;
    }

    int versionDiff = mVersion.compareTo(target.getVersion());

    // only if the version are the same do we care about add-ons.
    if (versionDiff == 0) {
        // platforms go before add-ons.
        if (target.isPlatform() == false) {
            return -1;
        }
    }

    return versionDiff;
}
 
示例5
private SamplePackage(IAndroidTarget target, Properties props) {
    super(  null,                                   //source
            props,                                  //properties
            0,                                      //revision will be taken from props
            null,                                   //license
            null,                                   //description
            null,                                   //descUrl
            target.getPath(IAndroidTarget.SAMPLES)  //archiveOsPath
            );

    mVersion = target.getVersion();

    mMinApiLevel = getPropertyInt(props, PkgProps.SAMPLE_MIN_API_LEVEL,
                                         MIN_API_LEVEL_NOT_SPECIFIED);

    mPkgDesc = PkgDesc.Builder
            .newSample(mVersion,
                      (MajorRevision) getRevision(),
                      getMinToolsRevision())
            .setDescriptions(this)
            .create();
}
 
示例6
@VisibleForTesting(visibility=Visibility.PRIVATE)
protected PlatformPackage(@Nullable SdkSource source,
                          @NonNull IAndroidTarget target,
                          @Nullable Properties props) {
    super(  source,                     //source
            props,                      //properties
            target.getRevision(),       //revision
            null,                       //license
            target.getDescription(),    //description
            null,                       //descUrl
            target.getLocation()        //archiveOsPath
            );

    mVersion = target.getVersion();
    mVersionName  = target.getVersionName();
    mLayoutlibVersion = new LayoutlibVersionMixin(props);
    mIncludedAbi = props == null ? null : props.getProperty(PkgProps.PLATFORM_INCLUDED_ABI);

    mPkgDesc = PkgDesc.Builder
            .newPlatform(mVersion,
                         (MajorRevision) getRevision(),
                         getMinToolsRevision())
            .setDescriptions(this)
            .create();
}
 
示例7
/**
 * Computes a potential installation folder if an archive of this package were
 * to be installed right away in the given SDK root.
 * <p/>
 * A platform package is typically installed in SDK/platforms/android-"version".
 * However if we can find a different directory under SDK/platform that already
 * has this platform version installed, we'll use that one.
 *
 * @param osSdkRoot The OS path of the SDK root folder.
 * @param sdkManager An existing SDK manager to list current platforms and addons.
 * @return A new {@link File} corresponding to the directory to use to install this package.
 */
@Override
public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {

    // First find if this platform is already installed. If so, reuse the same directory.
    for (IAndroidTarget target : sdkManager.getTargets()) {
        if (target.isPlatform() && target.getVersion().equals(mVersion)) {
            return new File(target.getLocation());
        }
    }

    File platforms = new File(osSdkRoot, SdkConstants.FD_PLATFORMS);
    File folder = new File(platforms,
            String.format("android-%s", getAndroidVersion().getApiString())); //$NON-NLS-1$

    return folder;
}
 
示例8
/**
 * Creates a new <em>invalid</em> AVD info. Values are immutable.
 * <p/>
 * Such an AVD is not complete and cannot be used.
 * The error string must be non-null.
 *
 * @param name The name of the AVD (for display or reference)
 * @param iniFile The path to the config.ini file
 * @param folderPath The path to the data directory
 * @param targetHash the target hash
 * @param target The target. Can be null, if the target was not resolved.
 * @param tag The tag id/display.
 * @param abiType Name of the abi.
 * @param properties The property map. If null, an empty map will be created.
 * @param status The {@link AvdStatus} of this AVD. Cannot be null.
 */
public AvdInfo(@NonNull  String name,
               @NonNull  File iniFile,
               @NonNull  String folderPath,
               @NonNull  String targetHash,
               @Nullable IAndroidTarget target,
               @NonNull  IdDisplay tag,
               @NonNull  String abiType,
               @Nullable Map<String, String> properties,
               @NonNull AvdStatus status) {
    mName       = name;
    mIniFile    = iniFile;
    mFolderPath = folderPath;
    mTargetHash = targetHash;
    mTarget     = target;
    mTag        = tag;
    mAbiType    = abiType;
    mProperties = properties == null ? Collections.<String, String>emptyMap()
                                     : Collections.unmodifiableMap(properties);
    mStatus     = status;
}
 
示例9
@Override
@NonNull
public TargetInfo getTargetInfo(
        @NonNull String targetHash,
        @NonNull FullRevision buildToolRevision,
        @NonNull ILogger logger) {
    init(logger);

    IAndroidTarget target = mSdkManager.getTargetFromHashString(targetHash);
    if (target == null) {
        throw new IllegalStateException("failed to find target with hash string '" + targetHash + "' in: " + mSdkLocation);
    }

    BuildToolInfo buildToolInfo = mSdkManager.getBuildTool(buildToolRevision);
    if (buildToolInfo == null) {
        throw new IllegalStateException("failed to find Build Tools revision "
                + buildToolRevision.toString());
    }

    return new TargetInfo(target, buildToolInfo);
}
 
示例10
/**
 * Converts a string representation of an hexadecimal ID into an int.
 * @param value the string to convert.
 * @return the int value, or {@link IAndroidTarget#NO_USB_ID} if the conversion failed.
 */
private int convertId(@Nullable String value) {
    if (value != null && !value.isEmpty()) {
        if (PATTERN_USB_IDS.matcher(value).matches()) {
            String v = value.substring(2);
            try {
                return Integer.parseInt(v, 16);
            } catch (NumberFormatException e) {
                // this shouldn't happen since we check the pattern above, but this is safer.
                // the method will return 0 below.
            }
        }
    }

    return IAndroidTarget.NO_USB_ID;
}
 
示例11
@NonNull
@Override
public TargetInfo getTargetInfo(@NonNull String targetHash,
        @NonNull FullRevision buildToolRevision, @NonNull ILogger logger) {
    init(logger);

    IAndroidTarget androidTarget = new FakeAndroidTarget(mTreeLocation.getPath(), targetHash);

    File hostTools = getHostToolsFolder();

    BuildToolInfo buildToolInfo = new BuildToolInfo(
            buildToolRevision,
            mTreeLocation,
            new File(hostTools, FN_AAPT),
            new File(hostTools, FN_AIDL),
            new File(mTreeLocation, "prebuilts/sdk/tools/dx"),
            new File(mTreeLocation, "prebuilts/sdk/tools/lib/dx.jar"),
            new File(hostTools, FN_BCC_COMPAT),
            new File(hostTools, "arm-linux-androideabi-ld"),
            new File(hostTools, "i686-linux-android-ld"),
            new File(hostTools, "mipsel-linux-android-ld"),
            new File(hostTools, FN_ZIPALIGN));

    return new TargetInfo(androidTarget, buildToolInfo);
}
 
示例12
/**
 * Returns the targets (platforms & addons) that are available in the SDK.
 * The target list is created on demand the first time then cached.
 * It will not refreshed unless {@link #clearLocalPkg} is called to clear platforms
 * and/or add-ons.
 * <p/>
 * The array can be empty but not null.
 */
@NonNull
public IAndroidTarget[] getTargets() {
    synchronized (mLocalPackages) {
        if (mCachedTargets == null) {
            List<IAndroidTarget> result = Lists.newArrayList();
            LocalPkgInfo[] pkgsInfos = getPkgsInfos(EnumSet.of(PkgType.PKG_PLATFORM,
                    PkgType.PKG_ADDON));
            for (LocalPkgInfo info : pkgsInfos) {
                assert info instanceof LocalPlatformPkgInfo;
                IAndroidTarget target = ((LocalPlatformPkgInfo) info).getAndroidTarget();
                if (target != null) {
                    result.add(target);
                }
            }
            mCachedTargets = result;
        }
        return mCachedTargets.toArray(new IAndroidTarget[mCachedTargets.size()]);
    }
}
 
示例13
@Nullable
@Override
public File getDefaultSkin() {
    // only one skin? easy.
    if (mSkins.length == 1) {
        return mSkins[0];
    }

    // look for the skin name in the platform props
    String skinName = mProperties.get(SdkConstants.PROP_SDK_DEFAULT_SKIN);
    if (skinName == null) {
        // otherwise try to find a good default.
        if (mVersion.getApiLevel() >= 4) {
            // at this time, this is the default skin for all older platforms that had 2+ skins.
            skinName = "WVGA800";                                       //$NON-NLS-1$
        } else {
            skinName = "HVGA"; // this is for 1.5 and earlier.          //$NON-NLS-1$
        }
    }

    return new File(getFile(IAndroidTarget.SKINS), skinName);
}
 
示例14
@Override
public boolean canRunOn(IAndroidTarget target) {
    // basic test
    if (target == this) {
        return true;
    }

    // if the platform has a codename (ie it's a preview of an upcoming platform), then
    // both platforms must be exactly identical.
    if (mVersion.getCodename() != null) {
        return mVersion.equals(target.getVersion());
    }

    // target is compatible wit the receiver as long as its api version number is greater or
    // equal.
    return target.getVersion().getApiLevel() >= mVersion.getApiLevel();
}
 
示例15
@Override
public int compareTo(IAndroidTarget target) {
    // quick check.
    if (this == target) {
        return 0;
    }

    int versionDiff = mVersion.compareTo(target.getVersion());

    // only if the version are the same do we care about add-ons.
    if (versionDiff == 0) {
        // platforms go before add-ons.
        if (target.isPlatform() == false) {
            return -1;
        }
    }

    return versionDiff;
}
 
示例16
private SamplePackage(IAndroidTarget target, Properties props) {
    super(  null,                                   //source
            props,                                  //properties
            0,                                      //revision will be taken from props
            null,                                   //license
            null,                                   //description
            null,                                   //descUrl
            target.getPath(IAndroidTarget.SAMPLES)  //archiveOsPath
            );

    mVersion = target.getVersion();

    mMinApiLevel = getPropertyInt(props, PkgProps.SAMPLE_MIN_API_LEVEL,
            MIN_API_LEVEL_NOT_SPECIFIED);

    mPkgDesc = setDescriptions(PkgDesc.Builder
            .newSample(mVersion, (MajorRevision) getRevision(), getMinToolsRevision()))
            .create();
}
 
示例17
@VisibleForTesting(visibility=Visibility.PRIVATE)
protected PlatformPackage(@Nullable SdkSource source,
                          @NonNull IAndroidTarget target,
                          @Nullable Properties props) {
    super(  source,                     //source
            props,                      //properties
            target.getRevision(),       //revision
            null,                       //license
            target.getDescription(),    //description
            null,                       //descUrl
            target.getLocation()        //archiveOsPath
            );

    mVersion = target.getVersion();
    mVersionName  = target.getVersionName();
    mLayoutlibVersion = new LayoutlibVersionMixin(props);
    mIncludedAbi = props == null ? null : props.getProperty(PkgProps.PLATFORM_INCLUDED_ABI);

    mPkgDesc = setDescriptions(PkgDesc.Builder
            .newPlatform(mVersion, (MajorRevision) getRevision(), getMinToolsRevision()))
            .create();
}
 
示例18
/**
 * Computes a potential installation folder if an archive of this package were
 * to be installed right away in the given SDK root.
 * <p/>
 * A platform package is typically installed in SDK/platforms/android-"version".
 * However if we can find a different directory under SDK/platform that already
 * has this platform version installed, we'll use that one.
 *
 * @param osSdkRoot The OS path of the SDK root folder.
 * @param sdkManager An existing SDK manager to list current platforms and addons.
 * @return A new {@link File} corresponding to the directory to use to install this package.
 */
@Override
public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {

    // First find if this platform is already installed. If so, reuse the same directory.
    for (IAndroidTarget target : sdkManager.getTargets()) {
        if (target.isPlatform() && target.getVersion().equals(mVersion)) {
            return new File(target.getLocation());
        }
    }

    File platforms = new File(osSdkRoot, SdkConstants.FD_PLATFORMS);
    File folder = new File(platforms,
            String.format("android-%s", getAndroidVersion().getApiString())); //$NON-NLS-1$

    return folder;
}
 
示例19
@Nullable
@Override
public IAndroidTarget getCompileTarget(@NonNull Project project) {
    IAndroidTarget compileTarget = super.getCompileTarget(project);
    if (compileTarget == null) {
        IAndroidTarget[] targets = getTargets();
        for (int i = targets.length - 1; i >= 0; i--) {
            IAndroidTarget target = targets[i];
            if (target.isPlatform()) {
                return target;
            }
        }
    }

    return compileTarget;
}
 
示例20
@Nullable
public IAndroidTarget getAndroidTarget() {
    if (!mLoaded) {
        mTarget = createAndroidTarget();
        mLoaded = true;
    }
    return mTarget;
}
 
示例21
/**
 * Creates a PlatformPackage wrapping the IAndroidTarget if defined.
 * Invoked by {@link #getPackage()}.
 *
 * @return A Package or null if target isn't available.
 */
@Nullable
protected Package createPackage() {
    IAndroidTarget target = getAndroidTarget();
    if (target != null) {
        return PlatformPackage.create(target, getSourceProperties());
    }
    return null;
}
 
示例22
/**
 * Returns a target from a hash that was generated by {@link IAndroidTarget#hashString()}.
 *
 * @param hash the {@link IAndroidTarget} hash string.
 * @return The matching {@link IAndroidTarget} or null.
 */
@Nullable
public IAndroidTarget getTargetFromHashString(@Nullable String hash) {
    if (hash != null) {
        IAndroidTarget[] targets = getTargets();
        for (IAndroidTarget target : targets) {
            if (target != null && hash.equals(AndroidTargetHash.getTargetHashString(target))) {
                return target;
            }
        }
    }
    return null;
}
 
示例23
@Override
public boolean canRunOn(IAndroidTarget target) {
    // basic test
    if (target == this) {
        return true;
    }

    /*
     * The method javadoc indicates:
     * Returns whether the given target is compatible with the receiver.
     * <p/>A target is considered compatible if applications developed for the receiver can
     * run on the given target.
     */

    // The receiver is an add-on. There are 2 big use cases: The add-on has libraries
    // or the add-on doesn't (in which case we consider it a platform).
    if (mLibraries == null || mLibraries.length == 0) {
        return mBasePlatform.canRunOn(target);
    } else {
        // the only targets that can run the receiver are the same add-on in the same or later
        // versions.
        // first check: vendor/name
        if (!mVendor.equals(target.getVendor()) || !mName.equals(target.getName())) {
            return false;
        }

        // now check the version. At this point since we checked the add-on part,
        // we can revert to the basic check on version/codename which are done by the
        // base platform already.
        return mBasePlatform.canRunOn(target);
    }

}
 
示例24
public LaunchCompatibility canRun(
    com.android.sdklib.AndroidVersion androidVersion,
    IAndroidTarget iAndroidTarget,
    EnumSet<HardwareFeature> enumSet,
    @Nullable Set<String> set) {
  return null;
}
 
示例25
/**
 * Returns the compilation target, if set.
 */
@Nullable
public IAndroidTarget getTarget() {
    checkState(mTargetInfo != null,
            "Cannot call getTarget() before setTargetInfo() is called.");
    return mTargetInfo.getTarget();
}
 
示例26
/**
 * Computes a potential installation folder if an archive of this package were
 * to be installed right away in the given SDK root.
 * <p/>
 * An add-on package is typically installed in SDK/add-ons/"addon-name"-"api-level".
 * The name needs to be sanitized to be acceptable as a directory name.
 * However if we can find a different directory under SDK/add-ons that already
 * has this add-ons installed, we'll use that one.
 *
 * @param osSdkRoot The OS path of the SDK root folder.
 * @param sdkManager An existing SDK manager to list current platforms and addons.
 * @return A new {@link File} corresponding to the directory to use to install this package.
 */
@Override
public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
    File addons = new File(osSdkRoot, SdkConstants.FD_ADDONS);

    // First find if this add-on is already installed. If so, reuse the same directory.
    for (IAndroidTarget target : sdkManager.getTargets()) {
        if (!target.isPlatform() && target.getVersion().equals(mVersion)) {
            // Starting with addon-4.xsd, the addon source.properties differentiate
            // between ids and display strings. However the addon target which relies
            // on the manifest.ini does not so we need to cover both cases.
            // TODO fix when we get rid of manifest.ini for addons
            if ((target.getName().equals(getNameId()) &&
                 target.getVendor().equals(getVendorId())) ||
                (target.getName().equals(getDisplayName()) &&
                 target.getVendor().equals(getDisplayVendor()))) {
                return new File(target.getLocation());
            }
        }
    }

    // Compute a folder directory using the addon declared name and vendor strings.
    String name = encodeAddonName();

    for (int i = 0; i < 100; i++) {
        String name2 = i == 0 ? name : String.format("%s-%d", name, i); //$NON-NLS-1$
        File folder = new File(addons, name2);
        if (!folder.exists()) {
            return folder;
        }
    }

    // We shouldn't really get here. I mean, seriously, we tried hard enough.
    return null;
}
 
示例27
public AndroidPlatformInfo(AndroidSdk sdk, IAndroidTarget target) throws FileNotFoundException {
    this.platformFolder = new File(target.getLocation());
    this.platformName = target.getFullName();
    androidVersion = target.getVersion();
    hashString = target.hashString();
    this.sdk = sdk;
    update(target);

}
 
示例28
/**
 * Returns the path to the skin, as a relative path to the SDK.
 * @param skinName The name of the skin to find. Case-sensitive.
 * @param target The target where to find the skin.
 * @param log the log object to receive action logs. Cannot be null.
 */
@Deprecated
private String getSkinRelativePath(@NonNull String skinName,
                                   @NonNull IAndroidTarget target,
                                   @NonNull ILogger log) {
    if (log == null) {
        throw new IllegalArgumentException("log cannot be null");
    }

    // first look to see if the skin is in the target
    File skin = getSkinFolder(skinName, target);

    // skin really does not exist!
    if (skin.exists() == false) {
        log.error(null, "Skin '%1$s' does not exist.", skinName);
        return null;
    }

    // get the skin path
    String path = skin.getAbsolutePath();

    // make this path relative to the SDK location

    String sdkLocation = myLocalSdk.getPath();
    if (path.startsWith(sdkLocation) == false) {
        // this really really should not happen.
        log.error(null, "Target location is not inside the SDK.");
        assert false;
        return null;
    }

    path = path.substring(sdkLocation.length());
    if (path.charAt(0) == File.separatorChar) {
        path = path.substring(1);
    }
    return path;
}
 
示例29
/**
 * Creates the ini file for an AVD.
 *
 * @param name of the AVD.
 * @param avdFolder path for the data folder of the AVD.
 * @param target of the AVD.
 * @param removePrevious True if an existing ini file should be removed.
 * @throws AndroidLocationException if there's a problem getting android root directory.
 * @throws IOException if {@link File#getAbsolutePath()} fails.
 */
private File createAvdIniFile(@NonNull String name,
        @NonNull File avdFolder,
        @NonNull IAndroidTarget target,
        boolean removePrevious)
        throws AndroidLocationException, IOException {
    File iniFile = AvdInfo.getDefaultIniFile(this, name);

    if (removePrevious) {
        if (iniFile.isFile()) {
            iniFile.delete();
        } else if (iniFile.isDirectory()) {
            deleteContentOf(iniFile);
            iniFile.delete();
        }
    }

    String absPath = avdFolder.getAbsolutePath();
    String relPath = null;
    String androidPath = AndroidLocation.getFolder();
    if (absPath.startsWith(androidPath)) {
        // Compute the AVD path relative to the android path.
        assert androidPath.endsWith(File.separator);
        relPath = absPath.substring(androidPath.length());
    }

    HashMap<String, String> values = new HashMap<String, String>();
    if (relPath != null) {
        values.put(AVD_INFO_REL_PATH, relPath);
    }
    values.put(AVD_INFO_ABS_PATH, absPath);
    values.put(AVD_INFO_TARGET, target.hashString());
    writeIniFile(iniFile, values, true);

    return iniFile;
}
 
示例30
/**
 * Sets the paths to the system images in a properties map.
 *
 * @param target the target in which to find the system images.
 * @param abiType the abi type of the avd to find
 *        the architecture-dependent system images.
 * @param properties the properties in which to set the paths.
 * @param log the log object to receive action logs. Cannot be null.
 * @return true if success, false if some path are missing.
 */
private boolean setImagePathProperties(IAndroidTarget target,
        IdDisplay tag,
        String abiType,
        Map<String, String> properties,
        ILogger log) {
    properties.remove(AVD_INI_IMAGES_1);
    properties.remove(AVD_INI_IMAGES_2);

    try {
        String property = AVD_INI_IMAGES_1;

        // First the image folders of the target itself
        String imagePath = getImageRelativePath(target, tag, abiType);
        if (imagePath != null) {
            properties.put(property, imagePath);
            property = AVD_INI_IMAGES_2;
        }

        // If the target is an add-on we need to add the Platform image as a backup.
        IAndroidTarget parent = target.getParent();
        if (parent != null) {
            imagePath = getImageRelativePath(parent, tag, abiType);
            if (imagePath != null) {
                properties.put(property, imagePath);
            }
        }

        // we need at least one path!
        return properties.containsKey(AVD_INI_IMAGES_1);
    } catch (InvalidTargetPathException e) {
        log.error(e, e.getMessage());
    }

    return false;
}