Androidコード混同の実践


apkを開発するときはもちろん自分のコードを守ることを考えなければなりませんが、Android環境ではproguardを提供してコード混同を行うのは、確かに非常に有用なツールですが、使っても確かに振り回されます.
1.基本構成
eclipseの下でandroidプロジェクトを構築するとproguardが生成されます.cfgとproject.properties、後のファイルにproguardを追加します.config=proguard.cfgは、前のプロファイルをexport時に有効にします.デフォルトのファイルにはいくつかの内容があります.ここではもっと一般的なポイントをあげます.

  
  
  
  
  1. ##---------------Begin: proguard configuration common for all Android apps ---------- 
  2. -optimizationpasses 5 
  3. -dontusemixedcaseclassnames 
  4. -dontskipnonpubliclibraryclasses 
  5. -dontskipnonpubliclibraryclassmembers 
  6. -dontpreverify 
  7. -verbose 
  8. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
  9. -keepattributes *Annotation* 
  10. -renamesourcefileattribute SourceFile 
  11. -keepattributes SourceFile,LineNumberTable 
  12.  
  13. #   
  14. -allowaccessmodification 
  15. -repackageclasses '' 
  16.  
  17. #  , proguard  
  18. -dump class_files.txt  
  19. -printseeds seeds.txt  
  20. -printusage unused.txt  
  21. -printmapping mapping.txt  
  22.  
  23. #   
  24. #-dontwarn 
  25.  
  26. -keep public class * extends android.app.Activity 
  27. -keep public class * extends android.app.Application 
  28. -keep public class * extends android.app.Service 
  29. -keep public class * extends android.content.BroadcastReceiver 
  30. -keep public class * extends android.content.ContentProvider 
  31. -keep public class * extends android.app.backup.BackupAgentHelper 
  32. -keep public class * extends android.preference.Preference 
  33. -keep public class com.android.vending.licensing.ILicensingService 
  34. -dontnote com.android.vending.licensing.ILicensingService 
  35.  
  36.  
  37. -keepnames class * implements java.io.Serializable 
  38.  
  39. # Explicitly preserve all serialization members. The Serializable interface 
  40. # is only a marker interface, so it wouldn't save them. 
  41. -keepclassmembers class * implements java.io.Serializable { 
  42.     static final long serialVersionUID; 
  43.     private static final java.io.ObjectStreamField[] serialPersistentFields; 
  44.     private void writeObject(java.io.ObjectOutputStream); 
  45.     private void readObject(java.io.ObjectInputStream); 
  46.     java.lang.Object writeReplace(); 
  47.     java.lang.Object readResolve(); 
  48.  
  49. # Preserve all native method names and the names of their classes. 
  50. -keepclasseswithmembernames class * { 
  51.     native <methods>
  52.  
  53. -keepclasseswithmembernames class * { 
  54.     public <init>(android.content.Context, android.util.AttributeSet); 
  55.  
  56. -keepclasseswithmembernames class * { 
  57.     public <init>(android.content.Context, android.util.AttributeSet, int); 
  58.  
  59. # Preserve static fields of inner classes of R classes that might be accessed 
  60. # through introspection. 
  61. -keepclassmembers class **.R$* { 
  62.   public static <fields>
  63.  
  64. # Preserve the special static methods that are required in all enumeration classes. 
  65. -keepclassmembers enum * { 
  66.     public static **[] values(); 
  67.     public static ** valueOf(java.lang.String); 
  68.  
  69. -keep class * implements android.os.Parcelable { 
  70.   public static final android.os.Parcelable$Creator *; 
  71.  
  72. #   
  73. #-keep public class * { 
  74. #    public protected *; 
  75. #} 
  76.  
  77. ##---------------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に変更されました.だから上からもらったものはまだ足りないし、加えなければならない.

  
  
  
  
  1. #  JsonObject 
  2. -keep class com.google.gson.JsonObject { *; } 

個人的には、これらの依存パッケージの混同によるトラブルを減らし、いっそすべて混同しないことをお勧めします.たとえば

  
  
  
  
  1. -keep class com.badlogic.** { *; } 
  2. -keep class * implements com.badlogic.gdx.utils.Json* 
  3. -keep class com.google.** { *; } 

5.libgdxを使用するために必要な構成
リファレンスhttp://code.google.com/p/libgdx-users/wiki/Ant
6.パッケージ効果の検証
私はapktoolの逆コンパイルツールを利用して、パッケージファイルをまた解凍して見ましたが、パッケージパス、クラス名、変数名、メソッド名などの変化があなたの期待と一致すればOKです.コマンド:

  
  
  
  
  1. apktool.bat d xxx.apk destdir 

 
まとめ:これは使うのも簡単ではありません.特にあなたのプログラムが使う高級な特性が多いと、問題が発生しやすくなります.またproguardのパラメータも確かに理解しにくいように見え、パッケージ化が遅く、テストも時間の無駄です.品物はいいが、そんなに簡単には手に入らない.