forked from qt-creator/qt-creator
Android: AndroidManager code cosmetics
Change-Id: I228c29fb7dcf5d919bea3633ea235b5ae5a51a42 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -68,63 +68,59 @@
|
||||
#include <QRegularExpression>
|
||||
#include <QVersionNumber>
|
||||
|
||||
namespace {
|
||||
const QLatin1String AndroidManifestName("AndroidManifest.xml");
|
||||
const QLatin1String AndroidDefaultPropertiesName("project.properties");
|
||||
const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber");
|
||||
const QLatin1String AndroidDeviceAbis("AndroidDeviceAbis");
|
||||
const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel");
|
||||
const QString packageNameRegEx("(?<token>package: )(.*?)(name=)'(?<target>.*?)'");
|
||||
const QString activityRegEx("(?<token>launchable-activity: )(.*?)(name=)'(?<target>.*?)'");
|
||||
const QString apkVersionRegEx("(?<token>package: )(.*?)(versionCode=)'(?<target>.*?)'");
|
||||
const QString versionCodeRegEx("(?<token>versionCode=)(?<version>\\d*)");
|
||||
const QString qtcSignature("This file is generated by QtCreator to be read by androiddeployqt and should not be modified by hand.");
|
||||
|
||||
static Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager", QtWarningMsg)
|
||||
|
||||
QString parseAaptOutput(const QString &output, const QString ®Ex) {
|
||||
const QRegularExpression regRx(regEx,
|
||||
QRegularExpression::CaseInsensitiveOption |
|
||||
QRegularExpression::MultilineOption);
|
||||
QRegularExpressionMatch match = regRx.match(output);
|
||||
if (match.hasMatch())
|
||||
return match.captured("target");
|
||||
return QString();
|
||||
};
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
using namespace ProjectExplorer;
|
||||
using namespace Utils;
|
||||
|
||||
using namespace Android::Internal;
|
||||
|
||||
namespace Android {
|
||||
|
||||
using namespace Internal;
|
||||
const QLatin1String AndroidManifestName("AndroidManifest.xml");
|
||||
const QLatin1String AndroidDefaultPropertiesName("project.properties");
|
||||
const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber");
|
||||
const QLatin1String AndroidDeviceAbis("AndroidDeviceAbis");
|
||||
const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel");
|
||||
const QString packageNameRegEx("(?<token>package: )(.*?)(name=)'(?<target>.*?)'");
|
||||
const QString activityRegEx("(?<token>launchable-activity: )(.*?)(name=)'(?<target>.*?)'");
|
||||
const QString apkVersionRegEx("(?<token>package: )(.*?)(versionCode=)'(?<target>.*?)'");
|
||||
const QString versionCodeRegEx("(?<token>versionCode=)(?<version>\\d*)");
|
||||
const QString qtcSignature("This file is generated by QtCreator to be read by androiddeployqt and should not be modified by hand.");
|
||||
|
||||
static Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager", QtWarningMsg)
|
||||
|
||||
static QString parseAaptOutput(const QString &output, const QString ®Ex)
|
||||
{
|
||||
const QRegularExpression regRx(regEx,
|
||||
QRegularExpression::CaseInsensitiveOption |
|
||||
QRegularExpression::MultilineOption);
|
||||
QRegularExpressionMatch match = regRx.match(output);
|
||||
if (match.hasMatch())
|
||||
return match.captured("target");
|
||||
return QString();
|
||||
}
|
||||
|
||||
class Library
|
||||
{
|
||||
public:
|
||||
Library()
|
||||
{ level = -1; }
|
||||
int level;
|
||||
int level = -1;
|
||||
QStringList dependencies;
|
||||
QString name;
|
||||
};
|
||||
|
||||
using LibrariesMap = QMap<QString, Library>;
|
||||
|
||||
static bool openXmlFile(QDomDocument &doc, const Utils::FilePath &fileName);
|
||||
static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc);
|
||||
static bool openXmlFile(QDomDocument &doc, const FilePath &fileName);
|
||||
static bool openManifest(const Target *target, QDomDocument &doc);
|
||||
static int parseMinSdk(const QDomElement &manifestElem);
|
||||
|
||||
static const ProjectNode *currentProjectNode(Target *target)
|
||||
static const ProjectNode *currentProjectNode(const Target *target)
|
||||
{
|
||||
if (RunConfiguration *rc = target->activeRunConfiguration())
|
||||
return target->project()->findNodeForBuildKey(rc->buildKey());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QString AndroidManager::packageName(ProjectExplorer::Target *target)
|
||||
QString AndroidManager::packageName(const Target *target)
|
||||
{
|
||||
QDomDocument doc;
|
||||
if (!openManifest(target, doc))
|
||||
@@ -133,7 +129,7 @@ QString AndroidManager::packageName(ProjectExplorer::Target *target)
|
||||
return manifestElem.attribute(QLatin1String("package"));
|
||||
}
|
||||
|
||||
QString AndroidManager::packageName(const Utils::FilePath &manifestFile)
|
||||
QString AndroidManager::packageName(const FilePath &manifestFile)
|
||||
{
|
||||
QDomDocument doc;
|
||||
if (!openXmlFile(doc, manifestFile))
|
||||
@@ -178,10 +174,10 @@ int AndroidManager::packageVersionCode(const QString &deviceSerial,
|
||||
return -1;
|
||||
}
|
||||
|
||||
void AndroidManager::apkInfo(const Utils::FilePath &apkPath,
|
||||
QString *packageName,
|
||||
int *version,
|
||||
QString *activityPath)
|
||||
void AndroidManager::apkInfo(const FilePath &apkPath,
|
||||
QString *packageName,
|
||||
int *version,
|
||||
QString *activityPath)
|
||||
{
|
||||
SdkToolResult result;
|
||||
result = runAaptCommand({"dump", "badging", apkPath.toString()});
|
||||
@@ -205,7 +201,7 @@ void AndroidManager::apkInfo(const Utils::FilePath &apkPath,
|
||||
}
|
||||
}
|
||||
|
||||
QString AndroidManager::activityName(ProjectExplorer::Target *target)
|
||||
QString AndroidManager::activityName(const Target *target)
|
||||
{
|
||||
QDomDocument doc;
|
||||
if (!openManifest(target, doc))
|
||||
@@ -219,7 +215,7 @@ QString AndroidManager::activityName(ProjectExplorer::Target *target)
|
||||
of the kit is returned if the manifest file of the APK cannot be found
|
||||
or parsed.
|
||||
*/
|
||||
int AndroidManager::minimumSDK(ProjectExplorer::Target *target)
|
||||
int AndroidManager::minimumSDK(const Target *target)
|
||||
{
|
||||
QDomDocument doc;
|
||||
if (!openXmlFile(doc, AndroidManager::manifestSourcePath(target)))
|
||||
@@ -231,12 +227,12 @@ int AndroidManager::minimumSDK(ProjectExplorer::Target *target)
|
||||
Returns the minimum Android API level required by the kit to compile. -1 is
|
||||
returned if the kit does not support Android.
|
||||
*/
|
||||
int AndroidManager::minimumSDK(const ProjectExplorer::Kit *kit)
|
||||
int AndroidManager::minimumSDK(const Kit *kit)
|
||||
{
|
||||
int minSDKVersion = -1;
|
||||
QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(kit);
|
||||
if (version && version->targetDeviceTypes().contains(Constants::ANDROID_DEVICE_TYPE)) {
|
||||
Utils::FilePath stockManifestFilePath = Utils::FilePath::fromUserInput(
|
||||
FilePath stockManifestFilePath = FilePath::fromUserInput(
|
||||
version->prefix().toString() + "/src/android/templates/AndroidManifest.xml");
|
||||
QDomDocument doc;
|
||||
if (openXmlFile(doc, stockManifestFilePath)) {
|
||||
@@ -246,7 +242,7 @@ int AndroidManager::minimumSDK(const ProjectExplorer::Kit *kit)
|
||||
return minSDKVersion;
|
||||
}
|
||||
|
||||
QString AndroidManager::buildTargetSDK(ProjectExplorer::Target *target)
|
||||
QString AndroidManager::buildTargetSDK(const Target *target)
|
||||
{
|
||||
if (auto bc = target->activeBuildConfiguration()) {
|
||||
if (auto androidBuildApkStep = bc->buildSteps()->firstOfType<AndroidBuildApkStep>())
|
||||
@@ -318,23 +314,23 @@ bool AndroidManager::isQtCreatorGenerated(const FilePath &deploymentFile)
|
||||
return QJsonDocument::fromJson(f.readAll()).object()["_description"].toString() == qtcSignature;
|
||||
}
|
||||
|
||||
Utils::FilePath AndroidManager::dirPath(const ProjectExplorer::Target *target)
|
||||
FilePath AndroidManager::dirPath(const Target *target)
|
||||
{
|
||||
if (auto *bc = target->activeBuildConfiguration())
|
||||
return bc->buildDirectory() / Constants::ANDROID_BUILDDIRECTORY;
|
||||
return Utils::FilePath();
|
||||
return {};
|
||||
}
|
||||
|
||||
Utils::FilePath AndroidManager::apkPath(const ProjectExplorer::Target *target)
|
||||
FilePath AndroidManager::apkPath(const Target *target)
|
||||
{
|
||||
QTC_ASSERT(target, return Utils::FilePath());
|
||||
QTC_ASSERT(target, return {});
|
||||
|
||||
auto bc = target->activeBuildConfiguration();
|
||||
if (!bc)
|
||||
return {};
|
||||
auto buildApkStep = bc->buildSteps()->firstOfType<AndroidBuildApkStep>();
|
||||
if (!buildApkStep)
|
||||
return Utils::FilePath();
|
||||
return {};
|
||||
|
||||
QString apkPath("build/outputs/apk/android-build-");
|
||||
if (buildApkStep->signPackage())
|
||||
@@ -398,7 +394,7 @@ Abi AndroidManager::androidAbi2Abi(const QString &androidAbi)
|
||||
}
|
||||
}
|
||||
|
||||
Utils::FilePath AndroidManager::manifestSourcePath(ProjectExplorer::Target *target)
|
||||
FilePath AndroidManager::manifestSourcePath(const Target *target)
|
||||
{
|
||||
if (const ProjectNode *node = currentProjectNode(target)) {
|
||||
const QString packageSource
|
||||
@@ -412,7 +408,7 @@ Utils::FilePath AndroidManager::manifestSourcePath(ProjectExplorer::Target *targ
|
||||
return manifestPath(target);
|
||||
}
|
||||
|
||||
Utils::FilePath AndroidManager::manifestPath(ProjectExplorer::Target *target)
|
||||
FilePath AndroidManager::manifestPath(const Target *target)
|
||||
{
|
||||
QVariant manifest = target->namedSettings(AndroidManifestName);
|
||||
if (manifest.isValid())
|
||||
@@ -425,17 +421,17 @@ void AndroidManager::setManifestPath(Target *target, const FilePath &path)
|
||||
target->setNamedSettings(AndroidManifestName, QVariant::fromValue(path));
|
||||
}
|
||||
|
||||
Utils::FilePath AndroidManager::defaultPropertiesPath(ProjectExplorer::Target *target)
|
||||
FilePath AndroidManager::defaultPropertiesPath(const Target *target)
|
||||
{
|
||||
return dirPath(target).pathAppended(AndroidDefaultPropertiesName);
|
||||
}
|
||||
|
||||
QString AndroidManager::deviceSerialNumber(ProjectExplorer::Target *target)
|
||||
QString AndroidManager::deviceSerialNumber(const Target *target)
|
||||
{
|
||||
return target->namedSettings(AndroidDeviceSn).toString();
|
||||
}
|
||||
|
||||
void AndroidManager::setDeviceSerialNumber(ProjectExplorer::Target *target, const QString &deviceSerialNumber)
|
||||
void AndroidManager::setDeviceSerialNumber(Target *target, const QString &deviceSerialNumber)
|
||||
{
|
||||
qCDebug(androidManagerLog) << "Device serial for the target changed"
|
||||
<< target->displayName() << deviceSerialNumber;
|
||||
@@ -462,17 +458,17 @@ QString AndroidManager::apkDevicePreferredAbi(const Target *target)
|
||||
return preferredAbi(apkAbis, target);
|
||||
}
|
||||
|
||||
void AndroidManager::setDeviceAbis(ProjectExplorer::Target *target, const QStringList &deviceAbis)
|
||||
void AndroidManager::setDeviceAbis(Target *target, const QStringList &deviceAbis)
|
||||
{
|
||||
target->setNamedSettings(AndroidDeviceAbis, deviceAbis);
|
||||
}
|
||||
|
||||
int AndroidManager::deviceApiLevel(ProjectExplorer::Target *target)
|
||||
int AndroidManager::deviceApiLevel(const Target *target)
|
||||
{
|
||||
return target->namedSettings(ApiLevelKey).toInt();
|
||||
}
|
||||
|
||||
void AndroidManager::setDeviceApiLevel(ProjectExplorer::Target *target, int level)
|
||||
void AndroidManager::setDeviceApiLevel(Target *target, int level)
|
||||
{
|
||||
qCDebug(androidManagerLog) << "Device API level for the target changed"
|
||||
<< target->displayName() << level;
|
||||
@@ -542,7 +538,7 @@ QString AndroidManager::androidNameForApiLevel(int x)
|
||||
case 30:
|
||||
return QLatin1String("Android 11");
|
||||
default:
|
||||
return tr("Unknown Android version. API Level: %1").arg(QString::number(x));
|
||||
return tr("Unknown Android version. API Level: %1").arg(x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -551,7 +547,7 @@ static void raiseError(const QString &reason)
|
||||
QMessageBox::critical(nullptr, AndroidManager::tr("Error creating Android templates."), reason);
|
||||
}
|
||||
|
||||
static bool openXmlFile(QDomDocument &doc, const Utils::FilePath &fileName)
|
||||
static bool openXmlFile(QDomDocument &doc, const FilePath &fileName)
|
||||
{
|
||||
QFile f(fileName.toString());
|
||||
if (!f.open(QIODevice::ReadOnly))
|
||||
@@ -564,7 +560,7 @@ static bool openXmlFile(QDomDocument &doc, const Utils::FilePath &fileName)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc)
|
||||
static bool openManifest(const Target *target, QDomDocument &doc)
|
||||
{
|
||||
return openXmlFile(doc, AndroidManager::manifestPath(target));
|
||||
}
|
||||
@@ -583,7 +579,7 @@ static int parseMinSdk(const QDomElement &manifestElem)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const QString &packagePath)
|
||||
void AndroidManager::installQASIPackage(Target *target, const QString &packagePath)
|
||||
{
|
||||
const QStringList appAbis = AndroidManager::applicationAbis(target);
|
||||
if (appAbis.isEmpty())
|
||||
@@ -616,7 +612,7 @@ bool AndroidManager::checkKeystorePassword(const QString &keystorePath, const QS
|
||||
SynchronousProcess proc;
|
||||
proc.setTimeoutS(10);
|
||||
SynchronousProcessResponse response = proc.run(cmd);
|
||||
return (response.result == Utils::SynchronousProcessResponse::Finished && response.exitCode == 0);
|
||||
return (response.result == SynchronousProcessResponse::Finished && response.exitCode == 0);
|
||||
}
|
||||
|
||||
bool AndroidManager::checkCertificatePassword(const QString &keystorePath, const QString &keystorePasswd, const QString &alias, const QString &certificatePasswd)
|
||||
@@ -712,7 +708,7 @@ static bool mergeGradleProperties(const QString &path, GradleProperties properti
|
||||
}
|
||||
|
||||
|
||||
bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target, const QString &buildKey)
|
||||
bool AndroidManager::updateGradleProperties(Target *target, const QString &buildKey)
|
||||
{
|
||||
QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(target->kit());
|
||||
if (!version)
|
||||
@@ -770,10 +766,10 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target, con
|
||||
return mergeGradleProperties(gradlePropertiesPath, gradleProperties);
|
||||
}
|
||||
|
||||
int AndroidManager::findApiLevel(const Utils::FilePath &platformPath)
|
||||
int AndroidManager::findApiLevel(const FilePath &platformPath)
|
||||
{
|
||||
int apiLevel = -1;
|
||||
const Utils::FilePath propertiesPath = platformPath / "/source.properties";
|
||||
const FilePath propertiesPath = platformPath / "/source.properties";
|
||||
if (propertiesPath.exists()) {
|
||||
QSettings sdkProperties(propertiesPath.toString(), QSettings::IniFormat);
|
||||
bool validInt = false;
|
||||
@@ -812,13 +808,13 @@ SdkToolResult AndroidManager::runCommand(const CommandLine &command,
|
||||
const QByteArray &writeData, int timeoutS)
|
||||
{
|
||||
Android::SdkToolResult cmdResult;
|
||||
Utils::SynchronousProcess cmdProc;
|
||||
SynchronousProcess cmdProc;
|
||||
cmdProc.setTimeoutS(timeoutS);
|
||||
qCDebug(androidManagerLog) << "Running command (sync):" << command.toUserOutput();
|
||||
SynchronousProcessResponse response = cmdProc.run(command, writeData);
|
||||
cmdResult.m_stdOut = response.stdOut().trimmed();
|
||||
cmdResult.m_stdErr = response.stdErr().trimmed();
|
||||
cmdResult.m_success = response.result == Utils::SynchronousProcessResponse::Finished;
|
||||
cmdResult.m_success = response.result == SynchronousProcessResponse::Finished;
|
||||
qCDebug(androidManagerLog) << "Running command (sync) finshed:" << command.toUserOutput()
|
||||
<< "Success:" << cmdResult.m_success
|
||||
<< "Output:" << response.allRawOutput();
|
||||
|
@@ -70,7 +70,7 @@ class ANDROID_EXPORT AndroidManager : public QObject
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
static QString packageName(ProjectExplorer::Target *target);
|
||||
static QString packageName(const ProjectExplorer::Target *target);
|
||||
static QString packageName(const Utils::FilePath &manifestFile);
|
||||
static bool packageInstalled(const QString &deviceSerial, const QString &packageName);
|
||||
static int packageVersionCode(const QString &deviceSerial, const QString &packageName);
|
||||
@@ -78,30 +78,30 @@ public:
|
||||
QString *packageName = nullptr,
|
||||
int *version = nullptr,
|
||||
QString *activityPath = nullptr);
|
||||
static QString activityName(ProjectExplorer::Target *target);
|
||||
static QString activityName(const ProjectExplorer::Target *target);
|
||||
|
||||
static QString deviceSerialNumber(ProjectExplorer::Target *target);
|
||||
static QString deviceSerialNumber(const ProjectExplorer::Target *target);
|
||||
static void setDeviceSerialNumber(ProjectExplorer::Target *target, const QString &deviceSerialNumber);
|
||||
|
||||
static QString apkDevicePreferredAbi(const ProjectExplorer::Target *target);
|
||||
static void setDeviceAbis(ProjectExplorer::Target *target, const QStringList &deviceAbis);
|
||||
|
||||
static int deviceApiLevel(ProjectExplorer::Target *target);
|
||||
static int deviceApiLevel(const ProjectExplorer::Target *target);
|
||||
static void setDeviceApiLevel(ProjectExplorer::Target *target, int level);
|
||||
|
||||
static QString buildTargetSDK(ProjectExplorer::Target *target);
|
||||
static QString buildTargetSDK(const ProjectExplorer::Target *target);
|
||||
|
||||
static int minimumSDK(ProjectExplorer::Target *target);
|
||||
static int minimumSDK(const ProjectExplorer::Target *target);
|
||||
static int minimumSDK(const ProjectExplorer::Kit *kit);
|
||||
|
||||
static QStringList applicationAbis(const ProjectExplorer::Target *target);
|
||||
static QString archTriplet(const QString &abi);
|
||||
|
||||
static Utils::FilePath dirPath(const ProjectExplorer::Target *target);
|
||||
static Utils::FilePath manifestPath(ProjectExplorer::Target *target);
|
||||
static Utils::FilePath manifestPath(const ProjectExplorer::Target *target);
|
||||
static void setManifestPath(ProjectExplorer::Target *target, const Utils::FilePath &path);
|
||||
static Utils::FilePath manifestSourcePath(ProjectExplorer::Target *target);
|
||||
static Utils::FilePath defaultPropertiesPath(ProjectExplorer::Target *target);
|
||||
static Utils::FilePath manifestSourcePath(const ProjectExplorer::Target *target);
|
||||
static Utils::FilePath defaultPropertiesPath(const ProjectExplorer::Target *target);
|
||||
static Utils::FilePath apkPath(const ProjectExplorer::Target *target);
|
||||
static bool matchedAbis(const QStringList &deviceAbis, const QStringList &appAbis);
|
||||
static QString devicePreferredAbi(const QStringList &deviceAbis, const QStringList &appAbis);
|
||||
@@ -113,7 +113,8 @@ public:
|
||||
static void installQASIPackage(ProjectExplorer::Target *target, const QString &packagePath);
|
||||
|
||||
static bool checkKeystorePassword(const QString &keystorePath, const QString &keystorePasswd);
|
||||
static bool checkCertificatePassword(const QString &keystorePath, const QString &keystorePasswd, const QString &alias, const QString &certificatePasswd);
|
||||
static bool checkCertificatePassword(const QString &keystorePath, const QString &keystorePasswd,
|
||||
const QString &alias, const QString &certificatePasswd);
|
||||
static bool checkCertificateExists(const QString &keystorePath, const QString &keystorePasswd,
|
||||
const QString &alias);
|
||||
static bool updateGradleProperties(ProjectExplorer::Target *target, const QString &buildKey);
|
||||
|
Reference in New Issue
Block a user