Android-Build
view release on metacpan or search on metacpan
lib/Android/Build.pm view on Meta::CPAN
#-------------------------------------------------------------------------------
# Create app
#-------------------------------------------------------------------------------
sub create
{my ($android) = @_;
$android->pushIcons;
$android->manifest;
$android->resources;
}
#-------------------------------------------------------------------------------
# Make app
#-------------------------------------------------------------------------------
sub getAdb
{my ($android) = @_;
filePath($android->getPlatformTools, qw(adb))
}
my $confirmRequiredUtilitiesAreInPosition;
sub confirmRequiredUtilitiesAreInPosition($) # Confirm required utilities are in position
{my ($android) = @_;
return if $confirmRequiredUtilitiesAreInPosition++; # Only do this once per run
my $buildTools = $android->getBuildTools;
my $adb = $android->getAdb;
my $aapt = filePath($buildTools, qw(aapt));
my $dx = filePath($buildTools, qw(dx));
my $zipAlign = filePath($buildTools, qw(zipalign));
zzz("$aapt version", qr(Android Asset Packaging Tool), 0,
"aapt not found at:\n$aapt");
zzz("$adb version", qr(Android Debug Bridge), 0, "adb not found at:\n$adb");
zzz("$dx --version", qr(dx version), 0, "dx not found at:\n$dx");
zzz("jarsigner", qr(Usage: jarsigner), 0, "jarsigner not found");
zzz("javac -version", qr(javac), 0, "javac not found");
zzz("zip -v", qr(Info-ZIP), 0, "zip not found\n");
zzz("$zipAlign", 0, 2, "zipalign not found at:\n$zipAlign");
}
sub signApkFile($$) # Sign an apk file
{my ($android, $apkFile) = @_; # Android, apk file to sign
$android->confirmRequiredUtilitiesAreInPosition;
my $keyStoreFile = $android->keyStoreFileX;
-e $keyStoreFile or confess"Key store file does not exists:\n$keyStoreFile\n";
my $keyAlias = $android->keyAliasX;
my $keyStorePwd = $android->keyStorePwd;
my $alg = $android->debug ? '' : "-sigalg SHA1withRSA -digestalg SHA1";
my $c =
"echo $keyStorePwd |".
"jarsigner $alg -keystore $keyStoreFile $apkFile $keyAlias";
my $s = zzz($c);
$s =~ /reference a valid KeyStore key entry containing a private key/s and
confess "Invalid keystore password: $keyStorePwd ".
"for keystore:\n$keyStoreFile\n".
"Specify the correct password via the keyStorePwd() method\n";
$s =~ /jar signed/s or confess "Unable to sign $apkFile\n";
if ($android->verifyApk) # Optional verify
{my $v = zzz("jarsigner -verify $apkFile");
$v =~ /jar verified/s or confess "Unable to verify $apkFile\n";
}
}
sub make
{my ($android) = @_;
$android->confirmRequiredUtilitiesAreInPosition;
my $getAppName = $android->getAppName;
my $buildTools = $android->getBuildTools;
my $buildArea = $android->buildArea;
my $adb = $android->getAdb;
my $androidJar = $android->getAndroidJar;
my $aapt = filePath($buildTools, qw(aapt));
my $dx = filePath($buildTools, qw(dx));
my $zipAlign = filePath($buildTools, qw(zipalign));
my $bin = $android->getBinFolder;
my $gen = $android->getGenFolder;
my $res = $android->getResFolder;
my @src = @{$android->src};
my @libs = @{$android->libs};
my $manifest = $android->getManifestFile;
my $binRes = filePath($bin, q(res));
my $classes = filePath($bin, q(classes));
my $api = $bin."$getAppName.ap_";
my $apj = $bin."$getAppName-unaligned.apk";
my $apk = $bin."$getAppName.apk";
if (1) # Confirm required files are in position
{for(
[qq(buildArea), $buildArea ],
[qq(androidJar), $androidJar],
[qq(res), $res ],
[qq(manifest), $manifest ],
)
{my ($name, $file) = @$_;
-e $file or confess "Unable to find $name:\n$file\n";
}
}
for my $file(@{$android->src}) # Check source files
{-e $file or confess "Unable to find source file:\n$file\n";
}
for my $file(@{$android->libs}) # Check library files
{-e $file or confess "Unable to find library:\n$file\n";
}
unlink $_ for $api, $apj, $apk; # Remove any existing apks
if (1) # Generate R.java
{makePath($gen);
my $c = "$aapt package -f -m -0 apk -M $manifest -S $res -I $androidJar".
" -J $gen --generate-dependencies";
zzz($c);
}
( run in 2.146 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )