mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 06:05:58 -06:00
Android Builder was modernized to the latest Google stacks. It is compatible with latest build tools version (33) and android (13). The following PR covers: - Migration from deprecated DX to D8 - Migrate from deprecated jarsigner to apksigner - Android Builder works now for both POSIX and Windows - There is no possibility to lunch SDK and AVD managers, the tools that we spawned previously are deprecated. We will need to write our own wrappers for console tools if we want to support that. - Android Builder now parsers AndroidManifest.xml file and informs Android NDK project about minAndroidSdk version from this file. This helps to avoid warnings in the build process.
252 lines
5.1 KiB
C++
252 lines
5.1 KiB
C++
#include "Android.h"
|
|
|
|
#include <plugin/pcre/Pcre.h>
|
|
|
|
namespace Upp {
|
|
|
|
String AndroidSDK::GetDownloadUrl()
|
|
{
|
|
return "https://developer.android.com/studio/index.html";
|
|
}
|
|
|
|
AndroidSDK::AndroidSDK()
|
|
{
|
|
}
|
|
|
|
AndroidSDK::AndroidSDK(const String& path, bool deduceValues)
|
|
{
|
|
this->path = path;
|
|
if(deduceValues)
|
|
DeducePathReleatedValues();
|
|
}
|
|
|
|
AndroidSDK::~AndroidSDK()
|
|
{
|
|
}
|
|
|
|
void AndroidSDK::DeducePathReleatedValues()
|
|
{
|
|
DeducePlatform();
|
|
DeduceBuildToolsRelease();
|
|
}
|
|
|
|
void AndroidSDK::DeducePlatform()
|
|
{
|
|
platform = FindDefaultPlatform();
|
|
}
|
|
|
|
void AndroidSDK::DeduceBuildToolsRelease()
|
|
{
|
|
build_tools_release = FindDefaultBuildToolsRelease();
|
|
}
|
|
|
|
bool AndroidSDK::Validate() const
|
|
{
|
|
if(!DirectoryExists(path) || !FileExists(AndroidPath())) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool AndroidSDK::ValidatePlatform() const
|
|
{
|
|
return DirectoryExists(ConcretePlatformDir());
|
|
}
|
|
|
|
bool AndroidSDK::ValidateBuildTools() const
|
|
{
|
|
return DirectoryExists(ConcreteBuildToolsDir());
|
|
}
|
|
|
|
Vector<String> AndroidSDK::FindPlatforms() const
|
|
{
|
|
Vector<String> platforms;
|
|
|
|
for(FindFile ff(AppendFileName(PlatformsDir(), "*")); ff; ff.Next()) {
|
|
if(!ff.IsHidden() && ff.IsFolder())
|
|
platforms.Add(ff.GetName());
|
|
}
|
|
|
|
return platforms;
|
|
}
|
|
|
|
Vector<String> AndroidSDK::FindBuildToolsReleases() const
|
|
{
|
|
Vector<String> buildTools;
|
|
|
|
for(FindFile ff(AppendFileName(BuildToolsDir(), "*")); ff; ff.Next()) {
|
|
if(!ff.IsHidden() && ff.IsFolder())
|
|
buildTools.Add(ff.GetName());
|
|
}
|
|
|
|
return buildTools;
|
|
}
|
|
|
|
Vector<AndroidDevice> AndroidSDK::FindDevices() const
|
|
{
|
|
Vector<AndroidDevice> devices;
|
|
|
|
String out;
|
|
if(Sys(NormalizeExePath(AdbPath()) + " devices -l", out) == 0) {
|
|
Vector<String> lines;
|
|
Vector<String> outputLines = Split(out, "\n");
|
|
for(int i = 0; i < outputLines.GetCount(); i++) {
|
|
if(!outputLines[i].StartsWith("*") && !outputLines[i].StartsWith(" "))
|
|
lines.Add(outputLines[i]);
|
|
}
|
|
|
|
for(int i = 1; i < lines.GetCount(); i++) {
|
|
AndroidDevice device;
|
|
|
|
Vector<String> elements = Split(lines[i], " ");
|
|
for(int j = 0; j < elements.GetCount(); j++) {
|
|
if(j == 0)
|
|
device.SetSerial(elements[j]);
|
|
else if(j == 1)
|
|
device.SetState(elements[j]);
|
|
else {
|
|
Vector<String> element = Split(elements[j], ":");
|
|
if(element.GetCount() == 2) {
|
|
String tag = element[0];
|
|
String data = element[1];
|
|
if(tag == "usb")
|
|
device.SetUsb(data);
|
|
else
|
|
if(tag == "model")
|
|
device.SetModel(data);
|
|
}
|
|
}
|
|
}
|
|
devices.Add(device);
|
|
}
|
|
}
|
|
|
|
return devices;
|
|
}
|
|
|
|
Vector<AndroidVirtualDevice> AndroidSDK::FindVirtualDevices() const
|
|
{
|
|
Vector<AndroidVirtualDevice> avdes;
|
|
|
|
String out;
|
|
if(Sys(NormalizeExePath(AndroidPath()) + " list avd", out) == 0) {
|
|
Vector<String> lines = Split(out, "\n");
|
|
|
|
AndroidVirtualDevice avd;
|
|
for(int i = 0; i < lines.GetCount(); i++) {
|
|
Vector<String> line = Split(lines[i], ":");
|
|
if(line.GetCount() == 2) {
|
|
String tag = line[0];
|
|
String data = line[1];
|
|
if(data.StartsWith(" "))
|
|
data.Remove(0);
|
|
if(tag.Find("Name") > -1) {
|
|
if(!avd.GetName().IsEmpty() && avd.GetName() != data)
|
|
avdes.Add(avd);
|
|
avd.SetName(data);
|
|
}
|
|
else
|
|
if(tag.Find("Device") > -1)
|
|
avd.SetDeviceType(data);
|
|
else
|
|
if(tag.Find("Path") > -1)
|
|
avd.SetPath(data);
|
|
else
|
|
if(tag.Find("Target") > -1)
|
|
avd.SetTarget(data);
|
|
else
|
|
if(tag.Find("Tag/ABI") > -1)
|
|
avd.SetAbi(data);
|
|
|
|
// TODO: implement all possible tags
|
|
}
|
|
}
|
|
|
|
if(!avd.GetName().IsEmpty())
|
|
avdes.Add(avd);
|
|
}
|
|
|
|
return avdes;
|
|
}
|
|
|
|
String AndroidSDK::FindDefaultPlatform() const
|
|
{
|
|
Vector<String> platforms = FindPlatforms();
|
|
if(platforms.GetCount()) {
|
|
Android::NormalizeVersions(platforms);
|
|
Sort(platforms, StdGreater<String>());
|
|
Android::RemoveVersionsNormalization(platforms);
|
|
|
|
int idx = 0;
|
|
for(int i = 0; i < platforms.GetCount(); i++) {
|
|
if(RegExp("^android-[0-9]*$").Match(platforms[i])) {
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
return platforms[idx];
|
|
}
|
|
return "";
|
|
}
|
|
|
|
String AndroidSDK::FindDefaultBuildToolsRelease() const
|
|
{
|
|
Vector<String> releases = FindBuildToolsReleases();
|
|
if(releases.GetCount()) {
|
|
Sort(releases, StdGreater<String>());
|
|
int idx = 0;
|
|
for(int i = 0; i < releases.GetCount(); i++) {
|
|
if(RegExp("^[1-9][0-9.]*$").Match(releases[i])) {
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
return releases[idx];
|
|
}
|
|
return "";
|
|
}
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
String AndroidSDK::BinDir() const
|
|
{
|
|
return path + DIR_SEPS + "bin";
|
|
}
|
|
|
|
String AndroidSDK::BuildToolsDir() const
|
|
{
|
|
return path + DIR_SEPS + "build-tools";
|
|
}
|
|
|
|
String AndroidSDK::PlatformsDir() const
|
|
{
|
|
return path + DIR_SEPS + "platforms";
|
|
}
|
|
|
|
String AndroidSDK::ConcreteBuildToolsDir() const
|
|
{
|
|
return BuildToolsDir() + DIR_SEPS + build_tools_release;
|
|
}
|
|
|
|
String AndroidSDK::ConcretePlatformDir() const
|
|
{
|
|
return PlatformsDir() + DIR_SEPS + platform;
|
|
}
|
|
|
|
String AndroidSDK::PlatformToolsDir() const
|
|
{
|
|
return path + DIR_SEPS + "platform-tools";
|
|
}
|
|
|
|
String AndroidSDK::ToolsDir() const
|
|
{
|
|
return path + DIR_SEPS + "tools";
|
|
}
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
bool AndroidSDK::HasD8() const
|
|
{
|
|
return FileExists(D8Path());
|
|
}
|
|
|
|
}
|