Skip to content
kairi edited this page Sep 28, 2024 · 3 revisions

Welcome to the NarouReaderMod wiki!

Mod開発手順

必ずしもこのようにするべき、というわけではありませんが、参考情報として私の場合の本Modの開発手順を記載します。

より良い方法があるという提案や質問がある場合は Discussions でご報告ください。

開発環境

参考情報として開発環境を記載しますが基本なんでもいいと思います。 apktoolのバージョンだけ注意です。

  • OS: Windows (+WSL)
    • Windows側のディスクをWSLから読み書きすると超遅いのでWSL側の領域にコピーして作業したほうが良い
  • Editor:
    • Android Studio (NarouReaderMod-source)
    • VSCode (NarouReaderMod)
  • Tool:
    • apktool: v2.9.3 (aptのものは古く互換性がない)
    • jadx

基本的な開発手順

  • 基本は jadx でデコンパイルしたJavaコードを参考情報にしてapktoolでデコードしたsmaliコードをいじってビルドする
  • smali を直接変更するとすぐ不整合になるのでメソッド単位でインジェクションして、それを元処理から参照すると良い
    1. NarouReaderMod-source で必要なメソッドを定義
    2. apk をビルド
    3. apktool で ↑の apk をデコードしてインジェクション用の smali コードを入手
  • 差分は基本 unified diff でとり、対応が難しければスクリプト等を書く

実装解析手順

  • jadx でデコンパイルされた Java コードを読む & それっぽい単語にあたりをつけて検索する
  • apktool でデコードされた smali コード以下略
  • com.tscsoft.naroureader.utils.ReverseDebug に定義した d メソッド(ログ)とか trace メソッド(スタックトレース)をインジェクションしてログから処理を追う
  • 私は Android Studio のエミュレータと Log ツール使ってます

動作解析時にログやスタックトレースを取っていた例

--- dec/origin2/smali_classes2/com/tscsoft/naroureader/utils/UpdateManager.smali	2024-02-11 23:02:36.020336145 +0900
+++ dec/origin/smali_classes2/com/tscsoft/naroureader/utils/UpdateManager.smali	2024-02-13 00:07:24.187959781 +0900
@@ -261,6 +261,14 @@
             Ljava/text/ParseException;
         }
     .end annotation
+    
+    invoke-static {}, Lcom/tscsoft/naroureader/utils/ReverseDebug;->trace()V
+    const-string v0, "checkAndUpdate: WorkMode"
+    invoke-static {v0}, Lcom/tscsoft/naroureader/utils/ReverseDebug;->d(Ljava/lang/String;)V
+    invoke-static {p4}, Lcom/tscsoft/naroureader/utils/ReverseDebug;->d(Ljava/lang/Object;)V
+
+    iget-object v8, p0, Lcom/tscsoft/naroureader/utils/UpdateManager;->mNovel:Lcom/tscsoft/naroureader/beans/ListBean;
+    iput-object p4, v8, Lcom/tscsoft/naroureader/beans/ListBean;->workMode:Lcom/tscsoft/naroureader/services/ServiceItem$WorkMode;
 
     .line 473
     new-instance v0, Ljava/util/ArrayList;