[俺メモ]新しいTitanium SDK がでたらやること

当然ダウンロードは済んでいる前提。

## Android アプリ作成時の署名方法変更
なんでそんなことが必要なの？は、こちらの[ページ](http://qiita.com/sngmr/items/b6ac523b98446e5e69fa)を参照のこと。

```py:android/builder.py
def get_sigalg(self):
	output = run.run([self.keytool,
		'-v',
		'-list',
		'-keystore', self.keystore,
		'-storepass', self.keystore_pass,
		'-alias', self.keystore_alias
	], protect_arg_positions=(6,))

	# If the keytool encounters an error, that means some of the provided
	# keychain info is invalid and we should bail anyway
	run.check_output_for_error(output, r'RuntimeException: (.*)', True)
	run.check_output_for_error(output, r'^keytool: (.*)', True)
	
	#
	# ここを変更
	# Edited by sngmr for Error installing apk
	#
	match = re.search(r'Signature algorithm name: (.*)', output)
	if match is not None:
		if match.group(1) == "SHA256withRSA":
			return "SHA1withRSA"
		else:
			return match.group(1)

	# Return the default:
	return "MD5withRSA"
```

```js:android/cli/commands/_build.js
// 320行目付近
	validate: function (value, callback) {
		// if there's a value, then they entered something, otherwise let the cli prompt
		if (value) {
			var selectedAlias = value.toLowerCase(),
				alias = _t.keystoreAlias = _t.keystoreAliases.filter(function (a) { return a.name && a.name.toLowerCase() == selectedAlias; }).shift();
			if (!alias) {
				return callback(new Error(__('Invalid "--alias" value "%s"', value)));
			}
			if (alias.sigalg && alias.sigalg.toLowerCase() == 'sha256withrsa') {
				logger.warn(__('The selected alias %s uses the %s signature algorithm which will likely have issues with Android 4.3 and older.', ('"' + value + '"').cyan, ('"' + alias.sigalg + '"').cyan));
				logger.warn(__('Certificates that use the %s or %s signature algorithm will provide better compatibility.', '"SHA1withRSA"'.cyan, '"MD5withRSA"'.cyan));

				// ここを追加 for Java 7 で Keystore を作ってしまってるのの対応
				logger.warn(__('Force change %s to %s', ('"' + alias.sigalg + '"').cyan, '"SHA1withRSA"'.cyan));
				alias.sigalg = 'SHA1withRSA';
			}
		}
		callback(null, value);
	}
```

## 以下はもう不要だと思う。Titaniumが公式にGenymotion対応したから。

## Genymotion対応
対応の詳細は[こちら](http://qiita.com/sngmr/items/d7c244114d7242c681c5)。

```py:android/androidsdk.py
def list_devices(self):
	adb = self.get_adb()
	(out, err) = subprocess.Popen([adb, 'devices'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
	if type(err) != types.NoneType and len(err) > 0:
		raise Exception(err)
	devices = []
	for line in out.splitlines():
		line = line.strip()
		if line.startswith("List of devices"): continue
		elif line.startswith("emulator-"):
			(name, status) = line.split()
			port = int(name[name.index("-")+1:])
			offline = False
			if status == "offline":
				offline = True
			devices.append(Device(name, port, True, offline))
		# Added by sngmr
		elif line.startswith("192.168.56."):
			(name, status) = line.split()
			port = int(name[name.index(":")+1:])
			offline = False
			if status == "offline":
				offline = True
			devices.append(Device(name, port, True, offline))
		elif "device" in line:
			name = line.split()[0]
			devices.append(Device(name))
	return devices
```

```js:android/cli/commands/_build.js
// 448行目付近
// Changed by sngmr
emulatorProcess = spawn('python', ['--version'], { detached: true, stdio: 'ignore' });
// emulatorProcess = spawn('python', emulatorCmd, { detached: true, stdio: 'ignore' });

///
/// 中略
///

// 465行目付近
devicesProcess.on('exit', function (code, status) {
	if (results.indexOf('emulator') != -1) {
		logger.info(__('Emulator is running') + '\n');
	// Addedn by sngmr
	} else if (results.indexOf('192.168.56.') != -1) {
		logger.info(__('AndroVM Emulator is running') + '\n');
	} else {
		emulatorRunning = false;
		logger.info(__('Emulator process exited successfully') + '\n');
		logcatProcess && logcatProcess.kill('SIGKILL');
		adbProcess && adbProcess.kill('SIGKILL');
		buildProcess && buildProcess.kill('SIGKILL');
		emulatorProcess = buildProcess = logcatProcess = adbProcess = null;
	}
});
```