たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 8382
目次
本題
環境
ひつようなもの
ながれ
犠牲になる?アプリ
必要なものを揃える
APK を取り出す
apktool を使って解体
別のアプリとしてインストールする
他の箇所
(あれば)
(あれば)
リソースを編集してみる
APK を組み立てる
alignment
署名
デバッグ用の署名ファイルを使う
署名ファイルを用意
APK に署名
インストール
名前変わってる!!!
Java のコードも編集したい
探す
該当の Smali ファイル
書き換えてみる
事件簿
INSTALL_FAILED_DUPLICATE_PERMISSION: Package ... attempting to redeclare permission ...DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION already owned by ...
Failure [INSTALL_FAILED_CONFLICTING_PROVIDER: Scanning Failed.: Can't install because provider name ...androidx-startup (in package ...) is already used by ...]
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from tmp/base.apk: Attempt to get length of null array]
[INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]
-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary
[INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package ...]
どうもこんばんわ。adb
コマンドでアプリインストールするの、面倒ですよね。特に複数端末が接続されている時。
Android Studio
が使える場合のみですが、
物理端末の画面ミラーリング画面へapk
を投げ込むとインストール出来ます、
アプリを作り直せるApktool
を使いました。動いた!
老舗ツールですが、今でも動いて感動。
というわけで、今回は自分用にApktool
で、APK
を解体・組み立てまでの流れを残しておこうと思います。
これは、アプリ(APK
)を解体して中身を書き換えて、もう一度APKに組み立て直すツール。
逆コンパイルだけでなく、そこからAPK
をもう一度作ることが出来る。
リソースは容易に書き換えできて、AndroidManifest
から怪しい権限を消したり、strings.xml
を自分の言語にローカライズしたり、して、その後APK
を作る。とか。
Java
のコードはSmali
になっているので、すごい微調整とかならすぐ出来るかもですが、
大きい変更は厳しそう雰囲気。。
難読化等されてると厳しいらしい。
なまえ | あたい |
---|---|
ぱそこん | Windows 10 Pro |
Android Studio
APK
直すだけで、Android
開発一ミリも興味ないから入れたくないWSL2
とかにインストールすれば良いはずですAndroid Studio
が必要というかはadb
、apksigner
コマンドを叩きたいからで、別に開発するわけではないJava
Android Studio
を入れると付いてきますが、JAVA_HOME
がなんとかとか言われたら...Android Studio
を入れたときに入ってくるjbr
のパスを環境変数にすれば良いはずVSCode
など、メモ帳で頑張っても良いはず?VSCode
でもAPK
ファイルを取り出すApktool
に渡して解体Apktool
で組み立てAPK
の作成adb install
でインストールNewRadioSupporter
。
自分のだから大丈夫だし、そもそも自己満足のためだから誰にも言われんやろ...
Apktool
はここから。.bat
ファイルは今回使わず、java
コマンドを毎回叩くことにします(なぜ...)Install Guide | Apktool
A minimum of Java 8 is required to run Apktool.
https://apktool.org/docs/install
Android Studio
も使います。adb
とかなので、起動することはないです、、、Android Studio とアプリツールのダウンロード - Android デベロッパー | Android Developers
Android Studio provides app builders with an integrated development environment (IDE) optimized for Android apps. Download Android Studio today.
https://developer.android.com/studio?hl=ja
あとJava
が必要ですが、Android Studio
入れていれば付いてくるはずなので。JAVA_HOME
の環境変数の設定だけやっておいて1!!
adb
コマンドで取り出す方法もあると思いますが、ファイルマネージャーによってはAPK
を取り出す機能があるので今回はそれを使います。
これをパソコンに転送~apktool
のところに置きました。名前も短くしておくと、ターミナル操作が楽かも?
.bat
を経由しないので、java
から書いていきます。
以下のコマンドを叩くと、APK
が解体されフォルダに中身が展開されます。
java -jar .\apktool_2.11.1.jar d {APKのパス}
Android
アプリはapplicationId (packageName)
で識別しています。
同じ名前のアプリでも、applicationId
が違えば別のアプリです。
既にapplicationId
のが同じアプリがインストールされている場合、アプリの更新としてインストールされます。
そのさい、アップデートの提供元が本物の開発者かどうか判断のため、署名を確認します。
この署名は、開発元しか持っていないため、別人が同じapplicationId
で更新することは出来ません。
なので、applicationId
を変更して別アプリとしてインストールするか、本家のアプリを削除するか。の2択です。
今回は前者のapplicationId
を変えて、もう一個同じアプリを入れることにします。
本家のアプリを消す場合はこの手順はスキップできます。
あと、よく分からないという場合も、本家を削除してスキップしたほうが良いかなと思います。
アプリが展開されたフォルダを開いて、AndroidManifest,xml
を、VSCode
か何かで開きます。
そしたらpackage
属性を探してください。
この行のことです。2行目とかにあるはずです。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:compileSdkVersion="36" android:compileSdkVersionCodename="16" package="io.github.takusan23.newradiosupporter" platformBuildVersionCode="36" platformBuildVersionName="16">
このpackage="io.github.takusan23.newradiosupporter"
を、なにか被らない(ユニークな)別の文字にする必要があります。
適当に後ろに.original
とかつけておきますか。
package="io.github.takusan23.newradiosupporter.original"
同様に、変更する必要がある箇所一覧です
この2つの、android:name
属性をapplicationId
の時のように被らないよう書き換えてください。
そして同じ値にする必要があります。
<permission android:name="io.github.takusan23.newradiosupporter.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature"/>
<uses-permission android:name="io.github.takusan23.newradiosupporter.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"/>
↓
<permission android:name="io.github.takusan23.newradiosupporter.original.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature"/>
<uses-permission android:name="io.github.takusan23.newradiosupporter.original.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"/>
ContentProvider
も一意である必要があります。android:authorities
の値を、applicationId
の時のように被らないよう書き換えてください。
<provider android:authorities="io.github.takusan23.newradiosupporter.androidx-startup" android:exported="false" android:name="androidx.startup.InitializationProvider">
↓
<provider android:authorities="io.github.takusan23.newradiosupporter.original.androidx-startup" android:exported="false" android:name="androidx.startup.InitializationProvider">
手始めに、ホーム画面に表示されるアプリの名前を書き換えてみましょう。
同様にAndroidManifest
を開きます
ホーム画面のアイコンを押したときに開くActivity (画面)
の探し方ですが、<intent-filter>
にandroid.intent.category.LAUNCHER
があるものが、ランチャーアプリで表示されるActivity
になります。
まあ、後ははMainActivity
って名前のActivity
なら十中八九それです。
見つけたら、android:label
属性を探します。今回は@string/app_name
でした。@string/
で始まってますね!!!これは文字列リソースなので、res
フォルダを開きます。
そしたら、values-{言語コード}
のフォルダが見つかると思います、日本語なのでja
ですね。それを開きます。
最後、!strings.xml
を開きます!!
どうでしょう?見覚えある文字列、ありますか?
ランチャーアプリに表示される名前は@string/app_name
でした、ので、name="app_name"
を探します。
一番上でしたね。(非開発者向け:Android Studio
が最初に作るのでそれはそう)
<string name="app_name">NewRadioSupporter</string>
これを書き換えてみます。5G チェッカーみたいな?
<string name="app_name">5Gチェッカー</string>
出来たら保存です!
apktool
にあるフォルダに戻って、ターミナル(コマンドプロンプト等)を開き、今度はb
オプション!
java -jar .\apktool_2.11.1.jar b {展開されたフォルダの名前}
成功すると、展開されたフォルダのdist
フォルダにAPK
があるはずです。
これがないとインストールに失敗するのでやります。zipalign
コマンドですが、これはAndroid Studio
をインストールすると付いてきます。
パスはここ:C:\Users\{ユーザー名}\AppData\Local\Android\Sdk\build-tools\{最新バージョン}\
パスが分かったところで、以下のコマンドを叩きます。APK
はさっき作ったやつ(dist
)です。
{build-toolsのパス}\{最新バージョン}\zipalign.exe -p -f 4 {distにあるapkのパス} aligned.apk
aligned.apk
が出来ていれば成功です!
多分署名しないとインストール出来ません、
署名には署名ファイルが必要です。自分のものを使う、自分で作る、また、もしかすると開発中(デバッグ用)の署名が使えるかもしれません。
もう持っている場合は署名コマンドまでスキップ。
すいません、今回は自分の署名ファイルを使うので、これが使えるかは見れていません。
署名ファイルはホームディレクトリの.android
フォルダのdebug.keystore
だと思います。
コマンドで作る場合は調べてみてください。Android Studio
で作る場合、適当に何かしらプロジェクトを作ります。なんでも良いです。
そしたら、メニューバーからBuild
→Generate Signed Bundle/APK
へ進み、
APK
でもAAB
でもどっちでも良いので次に進み、Create new
を押します。これを埋めれば、APK
に署名するための証明書が完成です。
パスワードは署名コマンドを叩く際に聞かれるので覚えておいてください。
署名ファイルが出来たら、以下のコマンドを叩きます。
今回もbuild-tools
にあるやつを使います。
{apksigner.bat のパス} sign --ks {署名ファイルのパス} --v2-signing-enabled true --ks-key-alias {key alias の値} --ks-pass pass:{key store pass の値} {aligned した APK のパス}
ここまで出来るとaligned.apk
がインストールできるはずです。
以下のコマンドでインストール!!
端末にAPK
を転送して、ファイルマネージャーで入れようとするとなんか失敗する時があったので、adb
が確実かも?
数字だと一番上で草
Smali
と戦うか、、、
値を書き換えるくらいなら、その値で検索をかければいいので、今回はこれを試します。
例えば、こんな感じに文字列リテラルの中のURL
を書き換えてみようと思います。
/** プライバシーポリシーを開く */
private fun openPrivacyPolicy(context: Context) {
val url = "https://takusan.negitoro.dev/pages/new_radio_supporter_privacy_policy/".toUri()
context.startActivity(Intent(Intent.ACTION_VIEW, url))
}
そもそもこの関数をどうやって見つけるんだって話ですが、GUI
のAPK
逆コンパイル+ソース閲覧ツールjadx
を使っています。
このアプリで、それっぽい処理を探し、(今回の例ではURL
の文字列検索)
クラス、関数を探します。
クラス名と同じ名前でSmali
ファイルがあるはずです。smali
で始まるフォルダを探してみてください。
それっぽいファイルを見つけたら、同様にVSCode
何かで開いて、探します。
関数の中で使ってる関数とかで検索をかけていく
対応する処理はここでした。
文字列リテラルがあると探すの楽でいいですね。
.method private static final openPrivacyPolicy(Landroid/content/Context;)V
.locals 3
.line 67
const-string v0, "https://takusan.negitoro.dev/pages/new_radio_supporter_privacy_policy/"
.line 168
invoke-static {v0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;
move-result-object v0
.line 68
new-instance v1, Landroid/content/Intent;
const-string v2, "android.intent.action.VIEW"
invoke-direct {v1, v2, v0}, Landroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;)V
invoke-virtual {p0, v1}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V
return-void
.end method
この"https://github.com/takusan23/NewRadioSupporter"
を書き換えて、Apktool
でAPK
を作り、実際にURL
が書き換わっているか見てみます。
適当にこのブログのトップページに飛ばすようにしてみた。
const-string v0, "https://takusan.negitoro.dev/"
あとはこれでもう一回Apktool
でAPK
を作り、alignment
、署名
、インストール
の手順で良いはずです。
androidx.appcompat
ライブラリ(?)が勝手にDYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
権限を作って自分に付与している、この次と同じ
おわり。
お疲れ様でした 88888