ラノベ日記

ラノベの感想用

カテゴリ: Android

リバースエンジニアリング目的ではなく、誤操作で消してしまった自作コードの復元に(´Д⊂ヽウェェェン

深夜三時……寝ぼけた状態でファイル整理をやっていた時にそれは起こりました。
Eclipseのワークスペースから消すつもりが、ディスク上から削除(ゴミ箱にも残らなかった)
寝ぼけているのに、涙が止まらない、という異常な精神状態に。

夜が明けて、途方にくれるのにも飽きた頃
まず思い出したのはファイル復元ツール
→消去済みのファイルを復元するツールを何個か試してみましたが……
 ファイル名までは復元できたものの、内容までは戻りませんでした。
 (HDDの頃は正常に動作したので、SSD特有の問題かもしれません)

次に思い出したのは、逆アセンブル(デコンパイル)ツール
難読化ツール(ProGuard)を使用していても、難読化されるのはクラス名やメソッド名のみ。
「小説家になろうダウンローダー」の中心である正規表現文字列は全て残っていると踏みました。

●apktool
公式?なAPKファイルの復号ツールです。
ソースコードの復元機能はありませんが、レイアウトXML等のリソースを100%復元可能です。
→入手先 https://code.google.com/p/android-apktool/
→使用方法 http://techbooster.org/android/environment/7754/

使用方法
対象のapkファイルをapktool.batと同じフォルダに入れて
「apktool d hogehoge.apk」

まぁそういうツールなのであれですが、リソースファイルの復元は完璧ですね。
(ProGuardは関係ないのでしょうか?)

ただし
@+id/text_title
となっている部分が
@id/text_title(+が無くなる)
となり、そのままでは大量のエラーが出ます。
手動で+を追加してください。

●dex2jar,jd-gui
→入手作(dex2jar) https://code.google.com/p/dex2jar/
→入手先(jd-gui) http://www.softpedia.com/progDownload/JD-GUI-Download-92540.html
※海外のDLサイトは無関係なリンクだらけなので気を付けてください。

apk(Dalvik)形式からjarに変換するツールと、Jarをソースコード(.java)に復元するツールです。

ProGuardを利用している場合、クラス名、メソッド名、変数名等が
短縮されてしまう(難読化)ので、完全な状態への復元は原理的に不可能です。

逆にいえば、ProGuardを使用していても処理の流れ、定数文字列等は読めてしまいます
(ProGuardを使ってるから、暗号・復号処理をAndroidアプリ内でやっても大丈夫とはなりません)

使用方法
apkファイルをdex2jarと同じフォルダに入れて実行
「dex2jar hogehoge.apk」
Jarファイルが出力される

jd-gui
GUI形式のツールなので、普通に起動してjarを読み込ませればOKです。
jd-gui

変数名がa,b等1文字のアルファベットに置き換えられていますが、クラス型や、定数文字列は残っています。
処理の流れも十分に把握可能です。

セキュリティを考えた場合、例えばAESの鍵値をソースコードに埋め込むのは、全く駄目ですね。
暗号化が必要な場合は、RSAにような非対称の暗号方式を使って、秘密鍵はソースに埋めこまない。
パスワード等の変化値を鍵値にする等が必要になります。

小説家になろうをEPUB3形式に変換するアプリの更新を続けています。
公開してすぐは、バグ報告や、要望がひっきりなしです。

ルビ対応
一方通行→アクセラレーター
のような当て字を多様するライトノベルでは、必須機能ですよね。

小説家になろうのルビ機能

|一方通行(アクセラレーター)
縦棒 対象文字 (よみがな)

上記の表記で入力すると、ルビとして認識されるようです。
一方通行(アクセラレーター)

他にも数パターンあるのですが、ここでは割愛。(アプリでは全て対応させてあります)

StringクラスのreplaceAllメソッドを使用します。
String#replaceAll(regex, 置き換え文字)

このような場合は、正規表現ですよね。

パターン
|(.+?)\((.+?)\)

置き換え文字
$1($2)

$1は、パターン内1つ目の括弧
$2は、パターン内2つ目の括弧

ルビ対応は、比較的簡単な修正ですね

小説家になろうに登録されている小説をEPUB2形式に変換するAndroidアプリを公開しました。
これで、電子書籍リーダーや縦書きビューアを利用して、なろう小説を読めるようになります。

ブラウザで読むのは疲れる、小説は縦書きじゃないと、というこだわり派の方がいましたらお使いください。

なろうダウンローダー(GooglePlay)
icon_512

初歩的なバグが見つかったので、バグ修正。

短針位置の計算方法を勘違いしていました。

短針は、12時間で一回転する
「-2*パイ*時刻/12 + 2*パイ/4」
としていたのですが、違いますよね。
※2*パイ/4は0時の時に90度の位置にするため

上記の式では
1:00〜1:59までの間、短針の位置はずっと1時ちょうどのまま。

実際の短針は少しづつ移動しするので、正しい式は
「-2*パイ*(時刻+ 分/60)/12 + 2*パイ/4」

となります。

更に更新しました。
最小化状態(アイコンの状態)で表示されるアナログ時計が動きます。
minimize


この機能は、元々レビューで要望されていたのですが、仕様的にできないと今まで放置していたものです。


ダメ元で仕様書を読み返してみると、デフォルトのアイコン表示以外に、任意のViewを表示可能となっています。
任意のView=OnDrawのoverrideが可能=アナログの時計を描画できるって事です。

画像からOnDrawへ
元々のアイコンは画像なのですが、図形描画で時計を描画します。

外側の円⇒内側の円⇒短針⇒長針
のように描画しています。

色は元々の画像に合わせたので、注意して見なければ分からないかもしれませんね。
時計の表示が動くのも気付かないかもですね。

フルスクリーンアプリの利用中にさり気なく表示するというのがコンセプトなので、気付かれない方がよかったりします。

Android(SonyのXperia専用)アプリを更新しました。
normal

今回の更新は、レビューで頼まれていた機能の追加です。
ユーザーの声を直に聞けるというのは良いですね。

実は、今回追加した機能以外にも、何点か指摘事項があったのですが
スモールアプリという性格上、最小限の追加にとどめました。

(タイマー機能を付けるべきかとも悩んだのですが……
最終的に、目覚まし機能があるから不要としました)

●通常画面の長押しで設定を表示
時計画面を長押しすることで、目覚ましメニューが表示されます
alarm_image

●通知はバイブレーション
通知音やバイブレーション時間の設定を付けようかとも思ったのですが、とりあえず振動のみ3秒間に固定しました。


他のアプリと同時に起動・表示できるスモールアプリは、ソニーXperia独自の拡張なのですが、Android標準にして欲しい機能の一つです。

昨年のCEATECくらいから、先端デバイスに疎い金物業界にもBluetooth4.0が凄いらしい、という噂が流れ始めました。

興奮冷めやまぬまま会場でサンプルを注文し、測定してガッカリ……
という方も多かったのではないかと思います。

勤務先も、ボタン電池1個で2年動くらしい、な、なんだって!?
という噂に飛びつき、測定したら2ヶ月弱で電池切れ……(´・ω・`)
ツカエネー

という雰囲気だったのですが、数社のモジュールを測定した結果、消費電力に10倍近い差が有り、優秀なものは触れ込み通りボタン電池1個で2年稼働できる事が分かりました。

ムラタエレクトロニクス社製(Type-VZ)
コネクションインターバル:2s (ム社によれば、2sにした時が、一番高率が良くなるとのこと)
アプリケーションデータ無し状態
⇒154uAh

Nordic社製(nRF51822)
コネクションインターバル:1s
アプリケーションデータ無し状態
⇒18uAh

うーん。
何が違うのでしょう?

Xperia(Sony製Android端末)には、スモールアプリという謎規格なアプリがあります。
http://www.sony.jp/tablet/app/smallapp/

ぱっと見はウィジェット(ホーム画面に貼り付くタイプのアプリ)なのですが、スモールアプリはフォアグラウンドアプリの前に表示される独自仕様になっています。

ソニーのHPで紹介されているように、動画閲覧中にtwitterを利用したり、WEBの閲覧中にリモコンアプリで他の機器を操作するという使い方が想定されているようです。

で、
これ、ソニー以外でも作れるの?
って事で気になったので、調べてみました。


開発方法

残念ながら日本ソニーには情報がありません……

次に海外ソニーを調べると
「Xperia Developer World」なるサイトが!?
Sony Add-on SDKと、いかにもなものが配布されていました。
http://developer.sonymobile.com/knowledge-base/sdks/sony-add-on-sdk/

インストール方法に従い、SDKをインストールします。
(AndroidのSDK managerは、サードパーティ製のライブラリもダウンロードできたのですね……)
開発マニュアルもDLしてください。

プロジェクトの作成
スモールアプリは
com.sony.smallapp.SmallApplication
を継承して作成します

XMLで画面表示を定義し、setContentViewで設定する等、Activityと大差ありません。

AndroidManifestの設定例

<manifest>
<uses-permission android:name="com.sony.smallapp.permission.SMALLAPP" />
<application android:label="@string/app_name" android:icon="@mipmap/ic_launcher”>
<uses-library android:name="com.sony.smallapp.framework" />
<service android:name=“SampleSmallApp” android:exported=“true” >
<intent-filter>
<action android:name="com.sony.smallapp.intent.action.MAIN" />
<category
android:name=“com.sony.smallapp.intent.category.LAUNCHER” />
</intent-filter>
</service>
</application>
</manifest>
</pre>


権限やライブラリの条件に
uses-permission
 com.sony.smallapp.permission.SMALLAPP
uses-library
 com.sony.smallapp.framework

SmallApplicationは、ActivityではなくServiceとして定義します
Intent-filterに
 action   android:name="com.sony.smallapp.intent.action.MAIN"
 category  android:name=“com.sony.smallapp.intent.category.LAUNCHER”

これにより、スモールアプリランチャーに表示されるようになります。

同一のパッケージ内に、通常のアプリと、スモールアプリの両方を定義することも可能です。
初心者の方には、スモールアプリランチャーの操作が分からない可能性もあります。
通常のActivityとして、操作説明を定義しておくのが良いかもしれません。

今回開発したサンプルはこちら

機種変更をして1週間。

Xperia VLの電池稼働時間が相変わらず悪い。

とは言っても、全く操作しなければ24時間以上持ちます。
だから、16時間で電池0%というREGZA PHONEと比べれば段違いですね。
(朝6時100%→18時70%)
(一度も操作せず。バックグラウンド通信を2時間毎30秒に制限)

悪いのは……
WEB閲覧や、動画を観た場合です。

特に何をするでもなく、画面を点灯しておくだけで
一時間で15%程度は電池ゲージが下がる気がします。
こんなものでしょうか?

でもまぁ、充電時間は速いです。
→充電器の電源容量が倍になっている。

従来の共通充電器 DC5V/600mA
Xperia VL付属の充電器 DC5V/1500mA

せっかく全社の充電器が共通になったというのに、また端末毎に別々の充電器が必要になるんですね……

調べてみると、かなりFeliCaよりな設計になっていることが分かります。
(NFC-ICのセキュリティエリア上に実装すれば単純な気がしますが……
 FelicaNetworks社専用品ということなので、また耐タンパ機能等に拘っているのでしょう)

FeliCaカードとして使う
カードそのものとして動作しますが……
Android端末自信がInitiatorとなっている期間は、外部のR/Wからの通信を受けません。

PN532を利用した場合、デフォルトのタイムアウト値(102ms)では、結構な頻度でInitiatorの期間と被り、ポーリングに失敗しました。
→タイムアウト値を25msにしたころ、ほとんど失敗しなくなりまいた。

NFCモード
NfcA(106kbps) Passiveのみ対応です。
※海外製のNexus7やGalaxyシリーズが、212kbps、424kbpsに対応していることを考えると、かなり残念です。