Android: AndroidManager code cosmetics

Change-Id: I228c29fb7dcf5d919bea3633ea235b5ae5a51a42
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2020-05-18 16:38:18 +02:00
parent f0fd6282d2
commit 5b2b8446b2
2 changed files with 74 additions and 77 deletions

View File

@@ -68,21 +68,28 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QVersionNumber> #include <QVersionNumber>
namespace { using namespace ProjectExplorer;
const QLatin1String AndroidManifestName("AndroidManifest.xml"); using namespace Utils;
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) using namespace Android::Internal;
QString parseAaptOutput(const QString &output, const QString &regEx) { namespace Android {
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 &regEx)
{
const QRegularExpression regRx(regEx, const QRegularExpression regRx(regEx,
QRegularExpression::CaseInsensitiveOption | QRegularExpression::CaseInsensitiveOption |
QRegularExpression::MultilineOption); QRegularExpression::MultilineOption);
@@ -90,41 +97,30 @@ namespace {
if (match.hasMatch()) if (match.hasMatch())
return match.captured("target"); return match.captured("target");
return QString(); return QString();
}; }
} // anonymous namespace
using namespace ProjectExplorer;
using namespace Utils;
namespace Android {
using namespace Internal;
class Library class Library
{ {
public: public:
Library() int level = -1;
{ level = -1; }
int level;
QStringList dependencies; QStringList dependencies;
QString name; QString name;
}; };
using LibrariesMap = QMap<QString, Library>; using LibrariesMap = QMap<QString, Library>;
static bool openXmlFile(QDomDocument &doc, const Utils::FilePath &fileName); static bool openXmlFile(QDomDocument &doc, const FilePath &fileName);
static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc); static bool openManifest(const Target *target, QDomDocument &doc);
static int parseMinSdk(const QDomElement &manifestElem); static int parseMinSdk(const QDomElement &manifestElem);
static const ProjectNode *currentProjectNode(Target *target) static const ProjectNode *currentProjectNode(const Target *target)
{ {
if (RunConfiguration *rc = target->activeRunConfiguration()) if (RunConfiguration *rc = target->activeRunConfiguration())
return target->project()->findNodeForBuildKey(rc->buildKey()); return target->project()->findNodeForBuildKey(rc->buildKey());
return nullptr; return nullptr;
} }
QString AndroidManager::packageName(ProjectExplorer::Target *target) QString AndroidManager::packageName(const Target *target)
{ {
QDomDocument doc; QDomDocument doc;
if (!openManifest(target, doc)) if (!openManifest(target, doc))
@@ -133,7 +129,7 @@ QString AndroidManager::packageName(ProjectExplorer::Target *target)
return manifestElem.attribute(QLatin1String("package")); return manifestElem.attribute(QLatin1String("package"));
} }
QString AndroidManager::packageName(const Utils::FilePath &manifestFile) QString AndroidManager::packageName(const FilePath &manifestFile)
{ {
QDomDocument doc; QDomDocument doc;
if (!openXmlFile(doc, manifestFile)) if (!openXmlFile(doc, manifestFile))
@@ -178,7 +174,7 @@ int AndroidManager::packageVersionCode(const QString &deviceSerial,
return -1; return -1;
} }
void AndroidManager::apkInfo(const Utils::FilePath &apkPath, void AndroidManager::apkInfo(const FilePath &apkPath,
QString *packageName, QString *packageName,
int *version, int *version,
QString *activityPath) QString *activityPath)
@@ -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; QDomDocument doc;
if (!openManifest(target, 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 of the kit is returned if the manifest file of the APK cannot be found
or parsed. or parsed.
*/ */
int AndroidManager::minimumSDK(ProjectExplorer::Target *target) int AndroidManager::minimumSDK(const Target *target)
{ {
QDomDocument doc; QDomDocument doc;
if (!openXmlFile(doc, AndroidManager::manifestSourcePath(target))) 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 Returns the minimum Android API level required by the kit to compile. -1 is
returned if the kit does not support Android. returned if the kit does not support Android.
*/ */
int AndroidManager::minimumSDK(const ProjectExplorer::Kit *kit) int AndroidManager::minimumSDK(const Kit *kit)
{ {
int minSDKVersion = -1; int minSDKVersion = -1;
QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(kit); QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(kit);
if (version && version->targetDeviceTypes().contains(Constants::ANDROID_DEVICE_TYPE)) { 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"); version->prefix().toString() + "/src/android/templates/AndroidManifest.xml");
QDomDocument doc; QDomDocument doc;
if (openXmlFile(doc, stockManifestFilePath)) { if (openXmlFile(doc, stockManifestFilePath)) {
@@ -246,7 +242,7 @@ int AndroidManager::minimumSDK(const ProjectExplorer::Kit *kit)
return minSDKVersion; return minSDKVersion;
} }
QString AndroidManager::buildTargetSDK(ProjectExplorer::Target *target) QString AndroidManager::buildTargetSDK(const Target *target)
{ {
if (auto bc = target->activeBuildConfiguration()) { if (auto bc = target->activeBuildConfiguration()) {
if (auto androidBuildApkStep = bc->buildSteps()->firstOfType<AndroidBuildApkStep>()) 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; 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()) if (auto *bc = target->activeBuildConfiguration())
return bc->buildDirectory() / Constants::ANDROID_BUILDDIRECTORY; 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(); auto bc = target->activeBuildConfiguration();
if (!bc) if (!bc)
return {}; return {};
auto buildApkStep = bc->buildSteps()->firstOfType<AndroidBuildApkStep>(); auto buildApkStep = bc->buildSteps()->firstOfType<AndroidBuildApkStep>();
if (!buildApkStep) if (!buildApkStep)
return Utils::FilePath(); return {};
QString apkPath("build/outputs/apk/android-build-"); QString apkPath("build/outputs/apk/android-build-");
if (buildApkStep->signPackage()) 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)) { if (const ProjectNode *node = currentProjectNode(target)) {
const QString packageSource const QString packageSource
@@ -412,7 +408,7 @@ Utils::FilePath AndroidManager::manifestSourcePath(ProjectExplorer::Target *targ
return manifestPath(target); return manifestPath(target);
} }
Utils::FilePath AndroidManager::manifestPath(ProjectExplorer::Target *target) FilePath AndroidManager::manifestPath(const Target *target)
{ {
QVariant manifest = target->namedSettings(AndroidManifestName); QVariant manifest = target->namedSettings(AndroidManifestName);
if (manifest.isValid()) if (manifest.isValid())
@@ -425,17 +421,17 @@ void AndroidManager::setManifestPath(Target *target, const FilePath &path)
target->setNamedSettings(AndroidManifestName, QVariant::fromValue(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); return dirPath(target).pathAppended(AndroidDefaultPropertiesName);
} }
QString AndroidManager::deviceSerialNumber(ProjectExplorer::Target *target) QString AndroidManager::deviceSerialNumber(const Target *target)
{ {
return target->namedSettings(AndroidDeviceSn).toString(); 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" qCDebug(androidManagerLog) << "Device serial for the target changed"
<< target->displayName() << deviceSerialNumber; << target->displayName() << deviceSerialNumber;
@@ -462,17 +458,17 @@ QString AndroidManager::apkDevicePreferredAbi(const Target *target)
return preferredAbi(apkAbis, 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); target->setNamedSettings(AndroidDeviceAbis, deviceAbis);
} }
int AndroidManager::deviceApiLevel(ProjectExplorer::Target *target) int AndroidManager::deviceApiLevel(const Target *target)
{ {
return target->namedSettings(ApiLevelKey).toInt(); 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" qCDebug(androidManagerLog) << "Device API level for the target changed"
<< target->displayName() << level; << target->displayName() << level;
@@ -542,7 +538,7 @@ QString AndroidManager::androidNameForApiLevel(int x)
case 30: case 30:
return QLatin1String("Android 11"); return QLatin1String("Android 11");
default: 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); 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()); QFile f(fileName.toString());
if (!f.open(QIODevice::ReadOnly)) if (!f.open(QIODevice::ReadOnly))
@@ -564,7 +560,7 @@ static bool openXmlFile(QDomDocument &doc, const Utils::FilePath &fileName)
return true; return true;
} }
static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc) static bool openManifest(const Target *target, QDomDocument &doc)
{ {
return openXmlFile(doc, AndroidManager::manifestPath(target)); return openXmlFile(doc, AndroidManager::manifestPath(target));
} }
@@ -583,7 +579,7 @@ static int parseMinSdk(const QDomElement &manifestElem)
return 0; 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); const QStringList appAbis = AndroidManager::applicationAbis(target);
if (appAbis.isEmpty()) if (appAbis.isEmpty())
@@ -616,7 +612,7 @@ bool AndroidManager::checkKeystorePassword(const QString &keystorePath, const QS
SynchronousProcess proc; SynchronousProcess proc;
proc.setTimeoutS(10); proc.setTimeoutS(10);
SynchronousProcessResponse response = proc.run(cmd); 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) 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()); QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(target->kit());
if (!version) if (!version)
@@ -770,10 +766,10 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target, con
return mergeGradleProperties(gradlePropertiesPath, gradleProperties); return mergeGradleProperties(gradlePropertiesPath, gradleProperties);
} }
int AndroidManager::findApiLevel(const Utils::FilePath &platformPath) int AndroidManager::findApiLevel(const FilePath &platformPath)
{ {
int apiLevel = -1; int apiLevel = -1;
const Utils::FilePath propertiesPath = platformPath / "/source.properties"; const FilePath propertiesPath = platformPath / "/source.properties";
if (propertiesPath.exists()) { if (propertiesPath.exists()) {
QSettings sdkProperties(propertiesPath.toString(), QSettings::IniFormat); QSettings sdkProperties(propertiesPath.toString(), QSettings::IniFormat);
bool validInt = false; bool validInt = false;
@@ -812,13 +808,13 @@ SdkToolResult AndroidManager::runCommand(const CommandLine &command,
const QByteArray &writeData, int timeoutS) const QByteArray &writeData, int timeoutS)
{ {
Android::SdkToolResult cmdResult; Android::SdkToolResult cmdResult;
Utils::SynchronousProcess cmdProc; SynchronousProcess cmdProc;
cmdProc.setTimeoutS(timeoutS); cmdProc.setTimeoutS(timeoutS);
qCDebug(androidManagerLog) << "Running command (sync):" << command.toUserOutput(); qCDebug(androidManagerLog) << "Running command (sync):" << command.toUserOutput();
SynchronousProcessResponse response = cmdProc.run(command, writeData); SynchronousProcessResponse response = cmdProc.run(command, writeData);
cmdResult.m_stdOut = response.stdOut().trimmed(); cmdResult.m_stdOut = response.stdOut().trimmed();
cmdResult.m_stdErr = response.stdErr().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() qCDebug(androidManagerLog) << "Running command (sync) finshed:" << command.toUserOutput()
<< "Success:" << cmdResult.m_success << "Success:" << cmdResult.m_success
<< "Output:" << response.allRawOutput(); << "Output:" << response.allRawOutput();

View File

@@ -70,7 +70,7 @@ class ANDROID_EXPORT AndroidManager : public QObject
Q_OBJECT Q_OBJECT
public: public:
static QString packageName(ProjectExplorer::Target *target); static QString packageName(const ProjectExplorer::Target *target);
static QString packageName(const Utils::FilePath &manifestFile); static QString packageName(const Utils::FilePath &manifestFile);
static bool packageInstalled(const QString &deviceSerial, const QString &packageName); static bool packageInstalled(const QString &deviceSerial, const QString &packageName);
static int packageVersionCode(const QString &deviceSerial, const QString &packageName); static int packageVersionCode(const QString &deviceSerial, const QString &packageName);
@@ -78,30 +78,30 @@ public:
QString *packageName = nullptr, QString *packageName = nullptr,
int *version = nullptr, int *version = nullptr,
QString *activityPath = 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 void setDeviceSerialNumber(ProjectExplorer::Target *target, const QString &deviceSerialNumber);
static QString apkDevicePreferredAbi(const ProjectExplorer::Target *target); static QString apkDevicePreferredAbi(const ProjectExplorer::Target *target);
static void setDeviceAbis(ProjectExplorer::Target *target, const QStringList &deviceAbis); 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 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 int minimumSDK(const ProjectExplorer::Kit *kit);
static QStringList applicationAbis(const ProjectExplorer::Target *target); static QStringList applicationAbis(const ProjectExplorer::Target *target);
static QString archTriplet(const QString &abi); static QString archTriplet(const QString &abi);
static Utils::FilePath dirPath(const ProjectExplorer::Target *target); 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 void setManifestPath(ProjectExplorer::Target *target, const Utils::FilePath &path);
static Utils::FilePath manifestSourcePath(ProjectExplorer::Target *target); static Utils::FilePath manifestSourcePath(const ProjectExplorer::Target *target);
static Utils::FilePath defaultPropertiesPath(ProjectExplorer::Target *target); static Utils::FilePath defaultPropertiesPath(const ProjectExplorer::Target *target);
static Utils::FilePath apkPath(const ProjectExplorer::Target *target); static Utils::FilePath apkPath(const ProjectExplorer::Target *target);
static bool matchedAbis(const QStringList &deviceAbis, const QStringList &appAbis); static bool matchedAbis(const QStringList &deviceAbis, const QStringList &appAbis);
static QString devicePreferredAbi(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 void installQASIPackage(ProjectExplorer::Target *target, const QString &packagePath);
static bool checkKeystorePassword(const QString &keystorePath, const QString &keystorePasswd); 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, static bool checkCertificateExists(const QString &keystorePath, const QString &keystorePasswd,
const QString &alias); const QString &alias);
static bool updateGradleProperties(ProjectExplorer::Target *target, const QString &buildKey); static bool updateGradleProperties(ProjectExplorer::Target *target, const QString &buildKey);