2013/11/05

Galaxy S4 LTE-Aのカメラの無音化(deodex版、odex版)


韓国版のGalaxy S4 LTE-A(shv-e330s、SKテレコム版)の無音カメラアプリ(deodex版)とodexファイルの作成方法の覚書です。

カメラアプリの設定メニューにシャッター音のOn/Offオプションを追加します。

韓国版のGalaxy S4 LTE-Aのカメラはbild.propとfeature.xmlを編集しただけでは無音になりません。(カメラアプリの設定メニューにシャッター音のOn/Offオプションは表示されますが、Offを選択出来ません。)

Galaxy S4のカメラアプリの設定メニューにシャッター音のOn/Off項目を追加(韓国版では機能せず)
http://galaxy-shw-m110s.blogspot.kr/2013/07/galaxy-s4ooff.html

On/Offせずに、常に無音でよいのでしたら、アプリを解凍して音源ファイルを無音ファイルに差し替える方法で無音化出来ます。

Galaxy S4のカメラの無音化(ESファイルエクスプローラー使用)
http://galaxy-shw-m110s.blogspot.kr/2013/05/galaxy-s4_2.html

【全体の流れ】

・必要なファイルの準備
・odexファイルを展開・編集
・classes.dexを作成
・deodexファイルを作成
・odexファイルを作成(オプション)

【準備】

まず、必要な物を用意します。

JAVAはインストールされている前提です。

Java SE ダウンロード
http://www.oracle.com/technetwork/jp/java/javase/downloads/index.html

1)作業用フォルダ

任意のフォルダで構いませんが、今回は/desktop/deodex/というフォルダを作業用に用意しました。

2)アセンブラと逆アセンブラ

An assembler/disassembler for Android's dex format
https://code.google.com/p/smali/

上記のページから以下のファイルをダウンロードして作業用フォルダに保存します。

baksmali
smali
baksmali-2.0.jar
smali-2.0.jar

baksmali-2.0.jarとsmali-2.0.jarはbaksmali.jarとsmali.jarにリネームしておきます。

3)7Z

以下から7Zをダウンロードして、解凍し、作業用フォルダに置きます。

7z002.lzh
http://madobe.net/archiver/app/dosp/7z.html

4)カメラアプリとodexファイル

端末から以下の2つのファイルを抜き出して作業用フォルダ内に置きます。

PCの任意のフォルダにもバックアップとしても保存しておくことをお勧めします。

/system/app/SamsungCamera2.apk
/sustem/app/SamsungCamera2.odex

これらのファイルは、SDKを使ってPCにpullしてもよいのですが、ESファイルエクスプローラ等でコピーして端末の/sdcard/に置き、そこからケーブルやクラウドを介してPCにコピーしてもよいでしょう。

5)/system/framework/の中身

端末の/system/framework/の中身全てを作業用フォルダにコピーします。

それぞれのファイルのサイズは小さく、全体で90MB程しかありませんが、当方の環境では154個のファイルがありました。

ファイル数が多いので、今回は、作業用フォルダの中に/system/framework/というフォルダを作り、その中に入れました。

6)feature.xmlの編集

ESファイルエクスプローラー等を利用して、端末の下記のファイルを編集しておきます。

/system/csc/feature.xml

ESファイルエクスプローラー
https://play.google.com/store/apps/details?id=com.estrongs.android.pop

変更する箇所は以下です。

FeatureSet/CSCFeature/Camera_ShutterSoundMenu ; false => true

【deodexファイルの作成】

1)odexファイルの展開

コマンドプロンプトから作業用フォルダに入り、以下を実行します。

PCのエクスプローラで作業用フォルダを開き、Shift+右クリックから「コマンドウインドウをここで開く」を選択するとよいでしょう。

java -jar baksmali.jar -d system/framework -x SamsungCamera2.odex -o test

作業用フォルダ内の/test/にファイルが展開されますので、コマンドプロンプトは開いたままにして、次の作業に移ります。

2)設定ファイルの編集

以下のファイルをメモ帳等にドラッグして開きます。

/test/com/sec/android/app/camera/CameraSettings.smali

下記を検索し、その部分を添付内容に置き換えます。

.method public getCameraShutterSound()I

 

.method public getCameraShutterSound()I
    .registers 4

    .prologue
    iget-object v0, p0, Lcom/sec/android/app/camera/CameraSettings;->mActivityContext:Lcom/sec/android/app/camera/Camera;

    invoke-virtual {v0}, Lcom/sec/android/app/camera/Camera;->isCalling()Z

    move-result v0

    if-eqz v0, :cond_a

    const/4 v0, 0x0

    :goto_9
    return v0

    :cond_a
    invoke-virtual {p0}, Lcom/sec/android/app/camera/CameraSettings;->getPreferences()Lcom/sec/android/app/camera/ComboPreferences;

    move-result-object v0

    const-string v1, "pref_camera_shuttersound_key"

    const/4 v2, 0x1

    invoke-virtual {v0, v1, v2}, Lcom/sec/android/app/camera/ComboPreferences;->getInt(Ljava/lang/String;I)I

    move-result v0

    goto :goto_9
.end method



同様に、下記部分を置き換えます。

.method public setCameraShutterSound(I)V

 

.method public setCameraShutterSound(I)V
    .registers 6
    .param p1, "shuttersound"    # I

    .prologue
    invoke-virtual {p0}, Lcom/sec/android/app/camera/CameraSettings;->getPreferences()Lcom/sec/android/app/camera/ComboPreferences;

    move-result-object v1

    const-string v2, "pref_camera_shuttersound_key"

    const/4 v3, 0x1

    invoke-virtual {v1, v2, v3}, Lcom/sec/android/app/camera/ComboPreferences;->getInt(Ljava/lang/String;I)I

    move-result v1

    iput v1, p0, Lcom/sec/android/app/camera/CameraSettings;->mShutterSound:I

    iget v1, p0, Lcom/sec/android/app/camera/CameraSettings;->mShutterSound:I

    if-eq v1, p1, :cond_42

    const-string v1, "CameraSettings"

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;->()V

    const-string v3, "setCameraShutterSound "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-static {v1, v2}, Landroid/util/Log;->secV(Ljava/lang/String;Ljava/lang/String;)I

    iput p1, p0, Lcom/sec/android/app/camera/CameraSettings;->mShutterSound:I

    invoke-virtual {p0}, Lcom/sec/android/app/camera/CameraSettings;->getPreferences()Lcom/sec/android/app/camera/ComboPreferences;

    move-result-object v1

    invoke-virtual {v1}, Lcom/sec/android/app/camera/ComboPreferences;->edit()Landroid/content/SharedPreferences$Editor;

    move-result-object v0

    .local v0, "editor":Landroid/content/SharedPreferences$Editor;
    const-string v1, "pref_camera_shuttersound_key"

    iget v2, p0, Lcom/sec/android/app/camera/CameraSettings;->mShutterSound:I

    invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences$Editor;->putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor;

    invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->apply()V

    const/16 v1, 0x15

    invoke-virtual {p0, v1, p1}, Lcom/sec/android/app/camera/CameraSettings;->notifyCameraSettingsChanged(II)V

    .end local v0    # "editor":Landroid/content/SharedPreferences$Editor;
    :cond_42
    return-void
.end method

 

なお、上記差し替え分はAndroid 4.3 MJ7用です。同じ機種でもOSのバージョンの違いによって正常に機能しない可能性がありますので注意してください。

3)classes.dexの作成

作業用フォルダでコマンドプロンプトから下記を実行します。

java -jar smali.jar test -o classes.dex

以下のファイルが作成されます。

classes.dex

4)deodex化

作業用フォルダでコマンドプロンプトから下記を実行します。

7z a -tzip SamsungCamera2.apk classes.dex

作業用フォルダ内のSamsungCamera2.apkが更新されます。

更新されたファイルは、odexファイルを取り込んだ物(deodex)になりますので、端末の/system/app/SamsungCamera2.apkに上書きすれば、無音カメラアプリとして使えますが、カメラアプリ自体を差し替えずにodexファイルだけを差し替えたい場合は、以下の作業を行ってください。

【odexファイルの作成】(オプション)

ここから先はSDKが使える環境になっている事が前提です。

1)dexopt-wrapper入手

以下のサイトからdexopt-wrapperをダウンロードして解凍し、端末の/data/local/tmp/に置きます。

http://forum.xda-developers.com/showpost.php?p=3864655&postcount=36

以下の様にSDKからpushしても良いですし、ESファイルエクスプローラー等を使っても構いません。

adb push dexopt-wrapper /data/local/tmp/

同様に、作成したdeodexファイル(SamsungCamera2.apk)も/data/local/tmp/に置きます。

2)odexファイルの作成

adbから下記を実行します。

adb shell chmod 755 /data/local/tmp/dexopt-wrapper
adb shell
cd /data/local/tmp
./dexopt-wrapper SamsungCamera2.apk SamsungCamera2.odex
busybox dd if=/system/app/SamsungCamera2.odex of=SamsungCamera.odex bs=1 count=20 skip=52 seek=52 conv=notrunc

/data/local/tmp/にSamsungCamera.odexが作成されますので、これを/system/app/SamsungCamera.odexに上書きします。

以上で無音化は終了ですが、この手法は工数が多いので、常に無音でよいのでしたら、冒頭で紹介したアプリの音源ファイルを差し替える方が手軽でよいかと思います。

0 件のコメント:

コメントを投稿