android signing

This commit is contained in:
2026-01-01 16:13:08 +02:00
parent 37f689f36d
commit 95d7489aa3
8 changed files with 180 additions and 15 deletions

View File

@@ -53,7 +53,7 @@ CUtlString AndroidManifest_t::BuildManifest()
CPUProject_t project = {};
project.m_szName = m_szPackageName;
unsigned int hash = project.GenerateProjectHash();
CUtlString szOutputDir = CUtlString("%s/%s/android/%u_%s/",FPC_TEMPORAL_DIRNAME, project.m_target.GetTriplet().GetString(), hash, m_szPackageID.GetString());
CUtlString szOutputDir = CUtlString("%s/android/%u_%s/",FPC_TEMPORAL_DIRNAME, hash, m_szPackageID.GetString());
filesystem2->MakeDirectory(szOutputDir);
filesystem2->MakeDirectory(CUtlString("%s/res", szOutputDir.GetString()));
@@ -84,6 +84,7 @@ class CAPKTool : public IAPKTool
{
public:
virtual CUtlString BuildPackage( AndroidManifest_t manifest, CUtlString szManifestDir ) override;
virtual CUtlString SignPackage( const char *szApk, LegalInfo_t *pLegalInfo, const char *szAlias, const char *szStorePassword, const char *szKeyPassword ) override;
private:
};
@@ -131,9 +132,74 @@ CUtlString CAPKTool::BuildPackage( AndroidManifest_t manifest, CUtlString szMani
CUtlString("%s.apk", manifest.m_szPackageID.GetString()),
};
runner->Run(CUtlString("%s/zipalign",szBuildTools),szManifestDir,args);
return manifest.m_szPackageID;
runner->Wait();
return CUtlString("%s/%s.apk",szManifestDir.GetString(), manifest.m_szPackageID.GetString());
}
CUtlString CAPKTool::SignPackage( const char *szApk, LegalInfo_t *pLegalInfo, const char *szAlias, const char *szStorePassword, const char *szKeyPassword )
{
V_printf(" APKSIGN %s\n", szApk );
CUtlString szOutput = CUtlString("%s.signed", szApk);
LegalInfo_t stLegalInfo = {};
CUtlVector<CUtlString> args = {};
CPUProject_t project = {};
project.m_szName = szAlias;
unsigned int hash = project.GenerateProjectHash();
CUtlString szOutputDir = CUtlString("%s/android/%u_%s/",FPC_TEMPORAL_DIRNAME, hash, szAlias);
filesystem2->MakeDirectory(szOutputDir);
CUtlString szKeystoreDir = CUtlString("%s/%s.jks",szOutputDir.GetString(),szAlias);
CUtlString szDname = "";
IINISection *pSection = NULL;
const char *szBuildTools;
pSection = g_pConfig->GetSection("Android_Build_Tools");
if (!pSection)
Plat_FatalErrorFunc("build_tools are required for this target");
szBuildTools = pSection->GetStringValue("path");
// We need to have a name at least
stLegalInfo.FirstName = "Gordon";
stLegalInfo.LastName = "Freeman";
if (pLegalInfo != NULL)
stLegalInfo = *pLegalInfo;
if (!stLegalInfo.FirstName)
Plat_FatalErrorFunc("First name wasn't provided\n");
if (!stLegalInfo.LastName)
Plat_FatalErrorFunc("Last name wasn't provided\n");
szDname.AppendTail(CUtlString("CN=%s %s", stLegalInfo.FirstName, stLegalInfo.LastName));
args = {
"-genkeypair",
"-keystore", szKeystoreDir,
"-alias", szAlias,
"-keyalg", "RSA",
"-keysize", "2048",
"-validity", "10000",
"-storepass", szStorePassword,
"-keypass", szKeyPassword,
"-dname", szDname,
};
runner->Run("keytool", args);
runner->Wait();
args = {
"sign",
"--ks", szKeystoreDir,
"--ks-key-alias", szAlias,
"--ks-pass", CUtlString("pass:%s",szStorePassword),
"--key-pass", CUtlString("pass:%s",szKeyPassword),
szApk,
};
runner->Run(CUtlString("%s/apksigner",szBuildTools), args);
runner->Wait();
return szApk;
};
IAPKTool *APKTool()
{
static CAPKTool s_apktool = {};