欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android app進(jìn)行代碼混淆實(shí)例詳解

 更新時(shí)間:2016年09月09日 11:27:35   投稿:lqh  
本文主要節(jié)誒是android app進(jìn)行代碼混淆,這里整理了詳細(xì)的資料,及實(shí)現(xiàn)代碼,有興趣的小伙伴可以參考下

接到一個(gè)新的任務(wù),對(duì)現(xiàn)有項(xiàng)目進(jìn)行代碼混淆。之前對(duì)混淆有過(guò)一些了解,但是不夠詳細(xì)和完整,知道有些東西混淆起來(lái)還是比較棘手的。不過(guò)幸好目前的項(xiàng)目不是太復(fù)雜(針對(duì)混淆這塊來(lái)說(shuō)),提前完成~~現(xiàn)總結(jié)之。 

第一部分

介紹下操作流程(eclipse):

1、打開混淆器:找到項(xiàng)目根目錄下的project.properties文件,將“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”這行前的“#”刪除即可;

2、修改混淆配置文件:找到項(xiàng)目根目錄下的proguard-project.txt文件,修改其中代碼,這部分是最關(guān)鍵;

3、保存相關(guān)文件供以后出錯(cuò)時(shí)使用:主要有導(dǎo)出的apk文件、項(xiàng)目根目錄下的proguard目錄下的文件(主要的是mapping.txt)和項(xiàng)目源碼;

4、項(xiàng)目運(yùn)行過(guò)程出錯(cuò)處理:根據(jù)錯(cuò)誤信息和第3步中保存的mapping定位錯(cuò)誤位置。

知道這些之后,我們對(duì)其進(jìn)行展開。打開eclipse然后新建一個(gè)項(xiàng)目,默認(rèn)會(huì)創(chuàng)建proguard-project.txt和project.properties。編寫我們的代碼,然后將proguard-project.txt的“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”這行前的“#”刪除,最后導(dǎo)出即可實(shí)現(xiàn)對(duì)代碼的混淆,即使我們沒有去編寫proguard-project.txt中的內(nèi)容。下面是我的測(cè)試代碼:

public class MainActivity extends Activity {
 
  private String mName;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    mName = ttdevs;
 
    getString(mName);
    setName(mName);
    showDialog();
    // testError();
  }
 
  public String getString(String name) {
    return hello + name;
  }
 
  public void setName(String name) {
    System.out.println(I'm + name);
  }
 
  private void showDialog() {
    new Handler().postDelayed(new Runnable() {
 
      @Override
      public void run() {
        ScoreAlertDialog.showDialog(MainActivity.this);
      }
    }, 2000);
  }
 
  public static class ScoreAlertDialog {
 
    public static void showDialog(final Activity activity) {
      if (activity.isFinishing()) {
        return;
      }
      try {
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setTitle(alert_title);
        builder.setNegativeButton(cancel, null);
        builder.setPositiveButton(submit, new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            try {
              Toast.makeText(activity, Welcome, Toast.LENGTH_LONG).show();
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
        builder.show();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
 
  private void testError() {
    try {
      int error = 1 / 0;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 

打包,反編譯,最后我們得到如下的代碼:


分析上面的代碼我們會(huì)發(fā)現(xiàn),自定義的方法名都被替換成無(wú)特殊意義的短字母,而activity的onCreate()方法卻沒變;最后一個(gè)testError()方法由于我們沒有調(diào)用也被剔除掉了。這些就是默認(rèn)的混淆處理策略??吹竭@里,感覺混淆還是小case的哈~~

繼續(xù)往下,我們將注銷的testError()打開,打包運(yùn)行這個(gè)時(shí)候會(huì)報(bào)錯(cuò),錯(cuò)誤信息如下:

java.lang.ArithmeticException: divide by zero
  at com.ttdevs.proguard.MainActivity.b(Unknown Source)
  at com.ttdevs.proguard.MainActivity.onCreate(Unknown Source)
  at android.app.Activity.performCreate(Activity.java:4531)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
  at android.app.ActivityThread.access$600(ActivityThread.java:139)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:154)
  at android.app.ActivityThread.main(ActivityThread.java:4945)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  at dalvik.system.NativeStart.main(Native Method)

由于這個(gè)例子比較簡(jiǎn)單,很容易看出來(lái)是何地方出了問(wèn)題,不過(guò)還是可以用來(lái)說(shuō)明我們想表達(dá)的問(wèn)題:如何還原混淆后的代碼的錯(cuò)誤信息。為了達(dá)到這個(gè)目的,我們需要三個(gè)文件:android-sdk-windows oolsproguardin etrace.bat、mapping.txt和上面的錯(cuò)誤信息(log.txt)。然后執(zhí)行下面的命令(window系統(tǒng)):

retrace.bat mapping.txt log.txt


 

從上圖中可以很清楚的看到錯(cuò)誤日志中的b()方法為我們實(shí)際代碼中的setName()方法。

這里需要注意的是每次導(dǎo)出apk都會(huì)在項(xiàng)目中目錄下的proguard文件夾下生成一個(gè)對(duì)應(yīng)的mapping文件,所以對(duì)于每個(gè)apk我們都需要保存與之對(duì)應(yīng)的mapping文件。至此整個(gè)混淆的流程介紹完畢。

參考:

官方文檔:http://developer.android.com/tools/help/proguard.html

官方文檔的翻譯:http://www.cnblogs.com/over140/archive/2011/04/22/2024528.html (本想自己去翻一個(gè),結(jié)果發(fā)現(xiàn)很久以前農(nóng)民伯伯已經(jīng)翻譯,在此直接引用并感謝之)

第二部分

第一部分講了如何操作,參照官方文檔,基本都會(huì)掌握。剩下的也是最難的就是proguard-project.txt文件的編寫。對(duì)于這部分,兩種處理策略:自己編寫和使用別人寫好的。先說(shuō)如何使用別人寫好的,我們引用的第三方庫(kù)無(wú)論開源還是閉源如有特殊情況我們都可以在他的User Guide中找到混淆代碼的配置,如我們引用了大名鼎鼎的guillep PullToRefresh,我們可以在他的文檔中找到如下的代碼:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
 
-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
 
-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);
}
 
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}
 
-keep class * implements android.os.Parcelable {
 public static final android.os.Parcelable$Creator *;
}</init></init></methods>

有了這部分代碼我們就可以直接copy插入我們的項(xiàng)目中即可。這種方式還是copy式的。那下面我們舉個(gè)小例子看看如何自己寫代碼控制是否混淆。還是用第一部分的例子,我們?cè)谶@個(gè)項(xiàng)目的proguard-project.txt文件中(之前為空)加入如下幾行(proguard-project.txt中“#”代表注釋):

# -keep public class com.ttdevs.proguard.** { *; }
# -keepclasseswithmembers public class com.ttdevs.proguard.** { *; }
 
-keep public class com.ttdevs.proguard.MainActivity {
  java.lang.String getString(java.lang.String);
}

然后我們?cè)趯?dǎo)出apk然后反編譯,得到如下代碼:


和之前的對(duì)比,我們發(fā)現(xiàn)其中的getString方法沒有被混淆。沒錯(cuò),上面proguard-project.txt的意思就是保持MainActivity的getString()方法不要被混淆。大家也可以試試上述混淆代碼中被注釋的兩行分別是什么效果。

講到這里已經(jīng)開始涉及ProGuard的核心部分了,剩下的就是研讀ProGuard的文檔,掌握的他的語(yǔ)法并使用之。本想找一個(gè)完整的ProGuard的翻譯文檔,但是找了N久沒有發(fā)現(xiàn)一個(gè),而且連零零散散的翻譯也非常的少,最近時(shí)間很緊,加之能力有限,想翻譯一下常用的幾個(gè)命令也是很困,所以細(xì)讀的想法只能暫時(shí)往后推了。這里先簡(jiǎn)單介紹下keep命令:

-keep [,modifier,...] class_specification

在你的代碼中指定作為切入點(diǎn)而被保留的類或者類的成員(屬性和方法)。例如,為了保持一個(gè)應(yīng)用,你可以指定主類和他的main方法。為了處理一個(gè)庫(kù),你需要詳細(xì)說(shuō)明他的public訪問(wèn)的元素。

另外還有keep的簡(jiǎn)單概述 和 語(yǔ)法中規(guī)范。Class Specification中會(huì)告訴你如何表示構(gòu)造方法,屬性和方法,* 與“**”的區(qū)別等等。比如*表示匹配任何的類名但是不包括包的分隔符,而**則是匹配任何的類名并且包括任意數(shù)量的包分隔符,因此上面我們注釋掉的代碼意思如下:第一行:保持com.ttdevs.proguard下的所有類和子包下的類的所有方法都不混淆,第二行保持com.ttdevs.proguard下的所有類和子包下的類的所有方法和成員變量都不混淆。
// TODO 細(xì)節(jié)還有很多,比如-libraryjars、-dontwarn、-keepattributes等等,這些待續(xù)吧

通過(guò)此文希望能幫助到讀者進(jìn)行代碼的混淆,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Android原生定位服務(wù)LocationManager

    Android原生定位服務(wù)LocationManager

    這篇文章主要為大家介紹了Android原生定位服務(wù)LocationManager實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Android使用Matrix旋轉(zhuǎn)圖片模擬碟片加載過(guò)程

    Android使用Matrix旋轉(zhuǎn)圖片模擬碟片加載過(guò)程

    這篇文章主要為大家詳細(xì)介紹了Android使用Matrix旋轉(zhuǎn)圖片模擬碟片加載過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android編程實(shí)現(xiàn)VideoView循環(huán)播放功能的方法

    Android編程實(shí)現(xiàn)VideoView循環(huán)播放功能的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)VideoView循環(huán)播放功能的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Android使用VideoView實(shí)現(xiàn)多媒體播放功能的操作技巧,需要的朋友可以參考下
    2017-02-02
  • Android Studio升級(jí)4.1.1后各種錯(cuò)誤和解決方案

    Android Studio升級(jí)4.1.1后各種錯(cuò)誤和解決方案

    這篇文章主要介紹了Android Studio升級(jí)4.1.1后各種錯(cuò)誤和解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 源碼分析Android?LayoutInflater的使用

    源碼分析Android?LayoutInflater的使用

    簡(jiǎn)單來(lái)說(shuō),LayoutInflater的工作就是將使用xml文件編寫的布局轉(zhuǎn)換成Android里的View對(duì)象,并且這也是Android中將xml布局轉(zhuǎn)換成View的唯一方式。本文將從源碼帶大家了解一下LayoutInflater的具體使用
    2023-04-04
  • 簡(jiǎn)單實(shí)現(xiàn)Android倒計(jì)時(shí)效果

    簡(jiǎn)單實(shí)現(xiàn)Android倒計(jì)時(shí)效果

    這篇文章主要教大家如何簡(jiǎn)單的實(shí)現(xiàn)Android倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 詳解Flutter混排瀑布流解決方案

    詳解Flutter混排瀑布流解決方案

    這篇文章主要介紹了Flutter混排瀑布流解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Android獲取藍(lán)牙設(shè)備列表的方法

    Android獲取藍(lán)牙設(shè)備列表的方法

    這篇文章主要為大家詳細(xì)介紹了Android獲取藍(lán)牙設(shè)備列表的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android studio 2020中的Android SDK 下載教程

    Android studio 2020中的Android SDK 下載教程

    這篇文章主要介紹了Android studio 2020中的Android SDK 下載教程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • ListView實(shí)現(xiàn)聊天列表之處理不同數(shù)據(jù)項(xiàng)

    ListView實(shí)現(xiàn)聊天列表之處理不同數(shù)據(jù)項(xiàng)

    這篇文章主要為大家詳細(xì)介紹了ListView實(shí)現(xiàn)聊天列表之處理不同數(shù)據(jù)項(xiàng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論