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,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 &regEx) {
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 &regEx)
{
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();

View File

@@ -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);