/* package */ AndroidApp signTestServer(File customSelendroidServer, File outputFileName) throws ShellCommandException, AndroidSdkException { if (outputFileName == null) { throw new IllegalArgumentException("outputFileName parameter is null."); } File androidKeyStore = androidDebugKeystore(); if (androidKeyStore.isFile() == false) { // create a new keystore CommandLine commandline = new CommandLine(JavaSdk.keytool()); commandline.addArgument("-genkey", false); commandline.addArgument("-v", false); commandline.addArgument("-keystore", false); commandline.addArgument(androidKeyStore.toString(), false); commandline.addArgument("-storepass", false); commandline.addArgument("android", false); commandline.addArgument("-alias", false); commandline.addArgument("androiddebugkey", false); commandline.addArgument("-keypass", false); commandline.addArgument("android", false); commandline.addArgument("-dname", false); commandline.addArgument("CN=Android Debug,O=Android,C=US", false); commandline.addArgument("-storetype", false); commandline.addArgument("JKS", false); commandline.addArgument("-sigalg", false); commandline.addArgument("MD5withRSA", false); commandline.addArgument("-keyalg", false); commandline.addArgument("RSA", false); commandline.addArgument("-validity", false); commandline.addArgument("9999", false); String output = ShellCommand.exec(commandline, 20000); log.info("A new keystore has been created: " + output); } // Sign the jar CommandLine commandline = new CommandLine(JavaSdk.jarsigner()); commandline.addArgument("-sigalg", false); commandline.addArgument("MD5withRSA", false); commandline.addArgument("-digestalg", false); commandline.addArgument("SHA1", false); commandline.addArgument("-signedjar", false); commandline.addArgument(outputFileName.getAbsolutePath(), false); commandline.addArgument("-storepass", false); commandline.addArgument("android", false); commandline.addArgument("-keystore", false); commandline.addArgument(androidKeyStore.toString(), false); commandline.addArgument(customSelendroidServer.getAbsolutePath(), false); commandline.addArgument("androiddebugkey", false); String output = ShellCommand.exec(commandline, 20000); if (log.isLoggable(Level.INFO)) { log.info("App signing output: " + output); } log.info("The app has been signed: " + outputFileName.getAbsolutePath()); return new DefaultAndroidApp(outputFileName); }
/* package */ File createAndAddCustomizedAndroidManifestToSelendroidServer() throws IOException, ShellCommandException, AndroidSdkException { String targetPackageName = applicationUnderTest.getBasePackage(); File tempdir = new File( FileUtils.getTempDirectoryPath() + File.separatorChar + targetPackageName + System.currentTimeMillis()); if (!tempdir.exists()) { tempdir.mkdirs(); } File customizedManifest = new File(tempdir, "AndroidManifest.xml"); log.info( "Adding target package '" + targetPackageName + "' to " + customizedManifest.getAbsolutePath()); // add target package InputStream inputStream = getResourceAsStream(selendroidApplicationXmlTemplate); if (inputStream == null) { throw new SelendroidException("AndroidApplication.xml template file was not found."); } String content = IOUtils.toString(inputStream, Charset.defaultCharset().displayName()); // find the first occurance of "package" and appending the targetpackagename to begining int i = content.toLowerCase().indexOf("package"); int cnt = 0; for (; i < content.length(); i++) { if (content.charAt(i) == '\"') { cnt++; } if (cnt == 2) { break; } } content = content.substring(0, i) + "." + targetPackageName + content.substring(i); log.info("Final Manifest File:\n" + content); content = content.replaceAll(SELENDROID_TEST_APP_PACKAGE, targetPackageName); // Seems like this needs to be done if (content.contains(ICON)) { content = content.replaceAll(ICON, ""); } OutputStream outputStream = new FileOutputStream(customizedManifest); IOUtils.write(content, outputStream, Charset.defaultCharset().displayName()); IOUtils.closeQuietly(inputStream); IOUtils.closeQuietly(outputStream); // adding the xml to an empty apk CommandLine createManifestApk = new CommandLine(AndroidSdk.aapt()); createManifestApk.addArgument("package", false); createManifestApk.addArgument("-M", false); createManifestApk.addArgument(customizedManifest.getAbsolutePath(), false); createManifestApk.addArgument("-I", false); createManifestApk.addArgument(AndroidSdk.androidJar(), false); createManifestApk.addArgument("-F", false); createManifestApk.addArgument( tempdir.getAbsolutePath() + File.separatorChar + "manifest.apk", false); createManifestApk.addArgument("-f", false); log.info(ShellCommand.exec(createManifestApk, 20000L)); ZipFile manifestApk = new ZipFile(new File(tempdir.getAbsolutePath() + File.separatorChar + "manifest.apk")); ZipArchiveEntry binaryManifestXml = manifestApk.getEntry("AndroidManifest.xml"); File finalSelendroidServerFile = new File(tempdir.getAbsolutePath() + "selendroid-server.apk"); ZipArchiveOutputStream finalSelendroidServer = new ZipArchiveOutputStream(finalSelendroidServerFile); finalSelendroidServer.putArchiveEntry(binaryManifestXml); IOUtils.copy(manifestApk.getInputStream(binaryManifestXml), finalSelendroidServer); ZipFile selendroidPrebuildApk = new ZipFile(selendroidServer.getAbsolutePath()); Enumeration<ZipArchiveEntry> entries = selendroidPrebuildApk.getEntries(); for (; entries.hasMoreElements(); ) { ZipArchiveEntry dd = entries.nextElement(); finalSelendroidServer.putArchiveEntry(dd); IOUtils.copy(selendroidPrebuildApk.getInputStream(dd), finalSelendroidServer); } finalSelendroidServer.closeArchiveEntry(); finalSelendroidServer.close(); manifestApk.close(); log.info("file: " + finalSelendroidServerFile.getAbsolutePath()); return finalSelendroidServerFile; }