Androidコード混同の実践
9230 ワード
apkを開発するときはもちろん自分のコードを守ることを考えなければなりませんが、Android環境ではproguardを提供してコード混同を行うのは、確かに非常に有用なツールですが、使っても確かに振り回されます.
1.基本構成
eclipseの下でandroidプロジェクトを構築するとproguardが生成されます.cfgとproject.properties、後のファイルにproguardを追加します.config=proguard.cfgは、前のプロファイルをexport時に有効にします.デフォルトのファイルにはいくつかの内容があります.ここではもっと一般的なポイントをあげます.
2.exportパッケージのエラーを解決する
このときexportは「conversion to Dalvik format failed with error 1」というエラーを提示し、ネット上ではいろいろな言い方がありましたが、最後にproguardを4.4から4.8にアップグレードして解決しました.公式住所はhttp://proguard.sourceforge.net.上のプロファイルパラメータはここで参照できます.
アップグレード方法は簡単ですが、android sdkディレクトリの下にあるtool/proguardディレクトリを上書きすればいいです.
3.パッケージ化されたプログラムのデバッグ方法
いったん梱包するとeclipseのlogcatで見ることはできません.ここではandroid sdkのddmsを使うことができます.batのtoolを見ると、使うとlogcatと実は1つのもので、複数のデバイスの選択です.
Androidではlogcatリーダーをダウンロードしたほうがいいです.そうすれば、携帯電話で実行がクラッシュし、パソコンでもログを見ることができます.またここでダウンロードできますhttp://static.apk.hiapk.com/html/2012/03/438120.html.
4.gsonを使用するために必要な構成
Gsonが汎用型を使うと間違いを報告するので、これは本当に憂鬱で、「Missing type parameter」をヒントにしました.最後に、解決策を示す資料を見つけました.参考:http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter.
また私はJsonObjectを使いましたが、提出したObjectの中のmembersがaに変更されました.だから上からもらったものはまだ足りないし、加えなければならない.
個人的には、これらの依存パッケージの混同によるトラブルを減らし、いっそすべて混同しないことをお勧めします.たとえば
5.libgdxを使用するために必要な構成
リファレンスhttp://code.google.com/p/libgdx-users/wiki/Ant
6.パッケージ効果の検証
私はapktoolの逆コンパイルツールを利用して、パッケージファイルをまた解凍して見ましたが、パッケージパス、クラス名、変数名、メソッド名などの変化があなたの期待と一致すればOKです.コマンド:
まとめ:これは使うのも簡単ではありません.特にあなたのプログラムが使う高級な特性が多いと、問題が発生しやすくなります.またproguardのパラメータも確かに理解しにくいように見え、パッケージ化が遅く、テストも時間の無駄です.品物はいいが、そんなに簡単には手に入らない.
1.基本構成
eclipseの下でandroidプロジェクトを構築するとproguardが生成されます.cfgとproject.properties、後のファイルにproguardを追加します.config=proguard.cfgは、前のプロファイルをexport時に有効にします.デフォルトのファイルにはいくつかの内容があります.ここではもっと一般的なポイントをあげます.
- ##---------------Begin: proguard configuration common for all Android apps ----------
- -optimizationpasses 5
- -dontusemixedcaseclassnames
- -dontskipnonpubliclibraryclasses
- -dontskipnonpubliclibraryclassmembers
- -dontpreverify
- -verbose
- -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
- -keepattributes *Annotation*
- -renamesourcefileattribute SourceFile
- -keepattributes SourceFile,LineNumberTable
-
- #
- -allowaccessmodification
- -repackageclasses ''
-
- # , proguard
- -dump class_files.txt
- -printseeds seeds.txt
- -printusage unused.txt
- -printmapping mapping.txt
-
- #
- #-dontwarn
-
- -keep public class * extends android.app.Activity
- -keep public class * extends android.app.Application
- -keep public class * extends android.app.Service
- -keep public class * extends android.content.BroadcastReceiver
- -keep public class * extends android.content.ContentProvider
- -keep public class * extends android.app.backup.BackupAgentHelper
- -keep public class * extends android.preference.Preference
- -keep public class com.android.vending.licensing.ILicensingService
- -dontnote com.android.vending.licensing.ILicensingService
-
-
- -keepnames class * implements java.io.Serializable
-
- # Explicitly preserve all serialization members. The Serializable interface
- # is only a marker interface, so it wouldn't save them.
- -keepclassmembers class * implements java.io.Serializable {
- static final long serialVersionUID;
- private static final java.io.ObjectStreamField[] serialPersistentFields;
- private void writeObject(java.io.ObjectOutputStream);
- private void readObject(java.io.ObjectInputStream);
- java.lang.Object writeReplace();
- java.lang.Object readResolve();
- }
-
- # Preserve all native method names and the names of their classes.
- -keepclasseswithmembernames class * {
- native <methods>;
- }
-
- -keepclasseswithmembernames class * {
- public <init>(android.content.Context, android.util.AttributeSet);
- }
-
- -keepclasseswithmembernames class * {
- public <init>(android.content.Context, android.util.AttributeSet, int);
- }
-
- # Preserve static fields of inner classes of R classes that might be accessed
- # through introspection.
- -keepclassmembers class **.R$* {
- public static <fields>;
- }
-
- # Preserve the special static methods that are required in all enumeration classes.
- -keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
- }
-
- -keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
- }
-
- #
- #-keep public class * {
- # public protected *;
- #}
-
- ##---------------End: proguard configuration common for all Android apps ----------
2.exportパッケージのエラーを解決する
このときexportは「conversion to Dalvik format failed with error 1」というエラーを提示し、ネット上ではいろいろな言い方がありましたが、最後にproguardを4.4から4.8にアップグレードして解決しました.公式住所はhttp://proguard.sourceforge.net.上のプロファイルパラメータはここで参照できます.
アップグレード方法は簡単ですが、android sdkディレクトリの下にあるtool/proguardディレクトリを上書きすればいいです.
3.パッケージ化されたプログラムのデバッグ方法
いったん梱包するとeclipseのlogcatで見ることはできません.ここではandroid sdkのddmsを使うことができます.batのtoolを見ると、使うとlogcatと実は1つのもので、複数のデバイスの選択です.
Androidではlogcatリーダーをダウンロードしたほうがいいです.そうすれば、携帯電話で実行がクラッシュし、パソコンでもログを見ることができます.またここでダウンロードできますhttp://static.apk.hiapk.com/html/2012/03/438120.html.
4.gsonを使用するために必要な構成
Gsonが汎用型を使うと間違いを報告するので、これは本当に憂鬱で、「Missing type parameter」をヒントにしました.最後に、解決策を示す資料を見つけました.参考:http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter.
また私はJsonObjectを使いましたが、提出したObjectの中のmembersがaに変更されました.だから上からもらったものはまだ足りないし、加えなければならない.
- # JsonObject
- -keep class com.google.gson.JsonObject { *; }
個人的には、これらの依存パッケージの混同によるトラブルを減らし、いっそすべて混同しないことをお勧めします.たとえば
- -keep class com.badlogic.** { *; }
- -keep class * implements com.badlogic.gdx.utils.Json*
- -keep class com.google.** { *; }
5.libgdxを使用するために必要な構成
リファレンスhttp://code.google.com/p/libgdx-users/wiki/Ant
6.パッケージ効果の検証
私はapktoolの逆コンパイルツールを利用して、パッケージファイルをまた解凍して見ましたが、パッケージパス、クラス名、変数名、メソッド名などの変化があなたの期待と一致すればOKです.コマンド:
- apktool.bat d xxx.apk destdir
まとめ:これは使うのも簡単ではありません.特にあなたのプログラムが使う高級な特性が多いと、問題が発生しやすくなります.またproguardのパラメータも確かに理解しにくいように見え、パッケージ化が遅く、テストも時間の無駄です.品物はいいが、そんなに簡単には手に入らない.