序文
逆転学習のすべてのステップを記録します。
難読化メカニズム
現在、難読化はコード難読化とリソース難読化に分類されており、難読化は逆コンパイルの難易度を高めるだけでなく、アプリケーションのインストール パッケージのサイズを削減する方法でもあります。
コードの難読化
コード難読化リファレンス:
Android Studio 難読化に関するメモ
ProGuard の一般的な問題と解決策
Android 難読化: ProGuard の実践
逆コンパイル ツール:
androiddevtools は
通常、jadx を使用します。
リソースの難読化
リソースの難読化には WeChat のAndResGuardプラグインが使用されますが、github の README では Gradle 設定が区別されないことに注意してください。
実際の構成は次のとおりです。
1. プロジェクトのルート ディレクトリの build.gradle に、次のようにプラグインの依存関係を追加します。
buildscript {
repositories {
// AS默认的,可忽略
google()
jcenter()
}
dependencies {
// 编写文章时的插件版本是1.2.17
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
}
}
2. モジュールの build.gradle を次のように構成します。
android {
...省略一千字
}
apply plugin: 'AndResGuard'
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
use7zip = true
useSign = true
// 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
keepRoot = false
// 设置这个值,会把arsc name列混淆成相同的名字,减少string常量池的大小
fixedResName = "arg"
// 打开这个开关会合并所有哈希值相同的资源,但请不要过度依赖这个功能去除去冗余资源
mergeDuplicatedRes = true
whiteList = [
// for your icon
"R.drawable.icon",
// for fabric
"R.string.com.crashlytics.*",
// for google-services
"R.string.google_app_id",
"R.string.gcm_defaultSenderId",
"R.string.default_web_client_id",
"R.string.ga_trackingId",
"R.string.firebase_database_url",
"R.string.google_api_key",
"R.string.google_crash_reporting_api_key"
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.17'
//path = "/usr/local/bin/7za"
}
/**
* 可选: 如果不设置则会默认覆盖assemble输出的apk
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* 可选: 指定v1签名时生成jar文件的摘要算法
* 默认值为“SHA-1”
**/
// digestalg = "SHA-256"
}
3. パッケージング コマンドの実行は、Assembly が resguard に置き換えられることを除いて、通常のパッケージング コマンドと変わりません。
例:
元の実行コマンド: gradlew AssemblyRelease
置き換え後: gradlew resguardRelease
パッケージ化後、リリースの下に新しいディレクトリが生成されます。赤いボックスはリソースの混乱です。署名後の APK: