問題タブ [android-jack-and-jill]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - JACK コンパイラで縮小化と難読化を実行する方法は?
Google は、Android Studio 2.1 を使用する Android 開発者向けの新しいJACK コンパイラのテスト バージョンをリリースしました。
私の質問は、JACK を使用して APK の難読化を有効にするにはどうすればよいですか? 以下の記事では、JACK が難読化をネイティブに実行し、Proguard の必要性を排除すると述べています。
.pro
次の記事では、JACK は難読化を実行するために Proguard 構成ファイル (つまり、ファイル) を使用すると述べています。
それはまた言う
このプロセス中に、Jack は要求されたコードの縮小(縮小および/または難読化) も処理します。
これは正確にはどういう意味ですか?オプションを使用して、Proguard オプションを含むファイルをminifyEnabled
定義する必要がありますか?.pro
要約すれば:
JACK で難読化を有効にするにはどうすればよいのでしょうか? Proguard の使用を回避できますか、それとも、JACK でコンパイルしたとしても、Proguard は難読化プロセスで事実上の役割を果たしますか?
JACK は現在、難読化をサポートしていますか?
ノート:
私はすでに次の投稿を参照しました:
さらなる参考文献:
アップデート:
Matt Inskoによる回答は役に立ちますが、より詳細で、より正確で標準的な回答が必要です。
android - Jack コンパイラの使用エラー - app/build/intermediates/packaged/debug/classes.zip' は無効なライブラリです
Jack コンパイラの使用中に次のエラーが発生しますが、何が問題なのかわかりません。
次の依存関係を持つ Android Studio 2.2 Preview 2 を使用しています。
Gradle プラグイン 2.2.0 alpha 2 と com.google.gms:google-services:3.0.0 も使用しています
どんな助けでも大歓迎です。
android - ジャックはコード自体を難読化していないようです
Android Studio バージョンを使用v2.1.2
しProguard
ていますが、リリース ビルドに署名しようとしても動作しません。ビルドは劇的に失敗します。
開発者ドキュメントのこのリンクによると、 Jack は自動的に難読化を行います。
圧縮、難読化、再パッケージ化、マルチデックスを処理 ProGuard などの別のパッケージを使用する必要はなくなりました。
フラグを無効にしてminifyEnabled
、proguard ファイルをロードする行を削除する必要がありました。これを行った後、それを機能させるために; 上記を実行して生成されたファイルを調べたところ、リリースサイズがデバッグ サイズと同じであるため、apk
Jack が本当に冗長なコードを難読化して削減したかどうかはわかりません。apk
apk
ドキュメントが実際には役に立たないため、新しいコンパイラで難読化を機能させる方法を理解する必要があります。
以下の質問を理解できることを楽しみにしています。
ファイルJack
なしで動作しますか?Proguard
ファイルを指定する方法はありProguard
ますか?
android - エラー: データ バインディングはまだ Jack ビルドをサポートしていません
を実装DataBinding
しています。完璧に機能していますが、使用できませんjackOptions
。Data Binding does not support Jack builds yet
ビルド中にエラーがスローされます。
これが私のbuild.gradle
android - ジャックの翻訳されたラムダ式は、minSdkVersion が 24 に設定されている場合、より効率的なアプローチを使用しません
私は現在、jack
コンパイラがラムダ式のために生成するバイトコードを見ています。
例として、次のプレーン Java クラスを見てみましょう。
JDK 1.8 を使用javac
すると、次のバイトコードが生成されます。
ドキュメントに従って、ラムダ式のバイトコードへのinvokedynamic call site
変換は、16 行目で生成し、ラムダ式の本体を静的メソッドに変換することによって実行されます。
では、についてお話しましょうjack
。一般に、ラムダをminSdkVersion
24 未満でコンパイルすると、jack
コンパイラは匿名クラスを生成します。これは、1.6/1.7 に基づく以前のランタイムとの後方互換性のためです。
しかし、ラムダminSdkVersion
を 24 に設定してコンパイルするとどうなるでしょうか?
これに答えるために、(上記の Java サンプルと同様に) 同じラムダ式を作成しjack
、Android 環境でコンパイルしました。
この場合、Android 7.0 のランタイムは 1.8 に基づいているため、jack
より効率的で最適化されたコード (JVM の作成およびラムダ ボディ ヘルパー メソッドの生成に似たもの) を生成することを期待していました。
命令オペランドが Dalvik と ART のどちらでもサポートされていないことはわかっていましたが、より最適化されたメカニズムがあると考えていました。それ以外の場合、Android でのラムダ式のサポートは単なる構文糖衣です。 invokedynamic call site
invokedynamic
代わりに、生成されたバイトコードには同じ匿名クラスが含まれていました。
おそらくJVMの機能jack
に似た、より効率的なものではなく、コンパイラがバイトコードでラムダ式を表すために匿名クラスアプローチを使用するのはなぜですか?invokedynamic