最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 資源混淆的方案及注意事項

 更新時間:2021年05月28日 09:58:50   作者:TokenYc  
資源混淆有助于減小包體積,也可以提高被反編譯后閱讀代碼的難度。還可以應對一些安全檢測機構對于資源混淆要求。本文基于微信的Android資源混淆工具,實現(xiàn)資源混淆

原理

Android的資源類型是很多的,比如說drawable,string,layout等,aapt在打包時,會將這些資源的名稱,id和位置打包進一個resources.arsc包。 通過AndroidStudio可以查看resouces.arsc文件的內(nèi)容。

AndResGuard大致上做的就是修改資源的名稱和路徑,修改為a b c這種簡短的名稱。​

注意事項

如果你的資源,存在使用插件化的方式加載的,即:使用名稱去找id,再用id去加載資源,由于資源的名稱已經(jīng)修改過了,所以會無法找到id。這種情況不能混淆。框架中提供了添加白名單的方法。 但是三方sdk中隱藏的插件化方式有點防不勝防。官方提供了常見的sdk白名單​

使用方法

我使用的是gradle集成的方式

1.添加gradle配置
2.設置白名單,我設置了除了layout以外所有的資源不進行混淆,因為我的需求是應付安全監(jiān)測,并且我們的項目中存在圖片插件加載,為了降低后期維護成本,就不進行混淆了。
3.執(zhí)行命令:resguardRelease 與assemble類似
具體可以參考github

一些細節(jié)

  • mappingFile要不要加?我選擇不加,加了之后,會keep住資源的路徑,如果對增量包大小有要求的,可以加。不加的話,包體積可以進一步減小,并在一定程度上提高反編譯的難度。
  • mergeDuplicationedRes要不要加?我是加的。是否會造成什么問題?應該是不會的。因為框架本質(zhì)上修改的是圖片的指向的路徑,圖片的名稱和id都沒有修改,所以不管是正常引用和插件化加載都是沒問題的。

附:美團的資源混淆方案

Android查找資源的流程

在Android系統(tǒng)中,每一個應用程序一般都會配置很多資源,用來適配不同密度、大小和方向的屏幕,以及適配不同的國家、地區(qū)和語言等等。這些資源是在應用程序運行時自動根據(jù)設備的當前配置信息進行適配的。這也就是說,給定一個相同的資源ID,在不同的設備配置之下,查找到的可能是不同的資源。
 這個查找過程對應用程序來說,是完全透明的,這個過程主要是靠Android資源管理框架來完成的,而Android資源管理框架實際是由AssetManager和Resources兩個類來實現(xiàn)的。其中,Resources類可以根據(jù)ID來查找資源,而AssetManager類根據(jù)文件名來查找資源。事實上,如果一個資源ID對應的是一個文件,那么Resources類是先根據(jù)ID來找到資源文件名稱,然后再將該文件名稱交給AssetManager類來打開對應的文件的。
 基本流程如下圖:

通過上圖我們可以看到Resources是通過resources.arsc把Resource的ID轉(zhuǎn)化成資源文件的名稱,然后交由AssetManager來加載的。
 而Resources.arsc這個文件是存放在APK包中的,他是由AAPT工具在打包過程中生成的,他本身是一個資源的索引表,里面維護者資源ID、Name、Path或者Value的對應關系,AssetManager通過這個索引表,就可以通過資源的ID找到這個資源對應的文件或者數(shù)據(jù)。

AAPT

AAPT是Android Asset Packaging Tool的縮寫,它存放在SDK的tools/目錄下,AAPT的功能很強大,可以通過它查看查看、創(chuàng)建、更新壓縮文件(如 .zip文件,.jar文件, .apk文件), 它也可以把資源編譯為二進制文件,并生成resources.arsc, AAPT這個工具在APK打包過程中起到了非常重要作用,在打包過程中使用AAPT對APK中用到的資源進行打包,這里不對AAPT這個工具做過多的討論,只看一下AAPT這個工具在打包過程中起到的作用,下圖是AAPT打包的流程:

 AAPT這個工具在打包過程中主要做了下列工作:

  1. 把”assets”和”res/raw”目錄下的所有資源進行打包(會根據(jù)不同的文件后綴選擇壓縮或不壓縮),而”res/”目錄下的其他資源進行編譯或者其他處理(具體處理方式視文件后綴不同而不同,例如:”.xml”會編譯成二進制文件,”.png”文件會進行優(yōu)化等等)后才進行打包;
  2. 會對除了assets資源之外所有的資源賦予一個資源ID常量,并且會生成一個資源索引表resources.arsc;
  3. 編譯AndroidManifest.xml成二進制的XML文件;
  4. 把上面3個步驟中生成結果保存在一個*.ap_文件,并把各個資源ID常量定義在一個R.java中;

資源混淆

我們知道在系統(tǒng)的Proguard中,對APK中資源文件名使用簡短無意義名稱進行替換,給破解者制造困難,從而做到資源的相對安全。通過閱讀AAPT編譯資源的代碼,我們發(fā)現(xiàn)修改AAPT在處理資源文件相關的源碼是能夠做到資源文件名的替換,下面是Resource.cpp中makeFileResources()的修改的代碼片段:

static status_t makeFileResources(Bundle* bundle, const sp<AaptAssets>& assets,
                                      ResourceTable* table,
                                      const sp<ResourceTypeSet>& set,
                                      const char* resType)
    {
        String8 type8(resType);
        String16 type16(resType);

        bool hasErrors = false;

        ResourceDirIterator it(set, String8(resType));
        ssize_t res;
        while ((res=it.next()) == NO_ERROR) {
            if (bundle->getVerbose()) {
                printf("    (new resource id %s from %s)\n",
                       it.getBaseName().string(), it.getFile()->getPrintableSource().string());
            }
            String16 baseName(it.getBaseName());
            const char16_t* str = baseName.string();
            const char16_t* const end = str + baseName.size();
            while (str < end) {
                if (!((*str >= 'a' && *str <= 'z')
                        || (*str >= '0' && *str <= '9')
                        || *str == '_' || *str == '.')) {
                    fprintf(stderr, "%s: Invalid file name: must contain only [a-z0-9_.]\n",
                            it.getPath().string());
                    hasErrors = true;
                }
                str++;
            }
            String8 resPath = it.getPath();
            resPath.convertToResPath();

            String8 obfuscationName;
            String8 obfuscationPath = getObfuscationName(resPath, obfuscationName);

            table->addEntry(SourcePos(it.getPath(), 0), String16(assets->getPackage()),
                            type16,
                            baseName, // String16(obfuscationName),
                            String16(obfuscationPath), // resPath
                            NULL,
                            &it.getParams());
            assets->addResource(it.getLeafName(), obfuscationPath/*resPath*/, it.getFile(), type8);
        }

        return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
    }

上述代碼是在ResourceTable和Assets中添加資源文件時, 對資源文件名稱進行修改,這就能夠做到資源文件名稱的替換,這樣通過使用修改過的AAPT編譯資源并進行打包,從而達到保護資源的目的。

以上就是Android 資源混淆的使用及注意事項的詳細內(nèi)容,更多關于Android 資源混淆的資料請關注腳本之家其它相關文章!

相關文章

  • Android 重力傳感器在游戲開發(fā)中的應用

    Android 重力傳感器在游戲開發(fā)中的應用

    本文主要介紹Android 重力傳感器,這里整理了詳細的資料,并且詳細的說明重力傳感器的使用方法,有興趣的小伙伴可以參考下
    2016-08-08
  • Android短信備份及數(shù)據(jù)插入實現(xiàn)代碼解析

    Android短信備份及數(shù)據(jù)插入實現(xiàn)代碼解析

    這篇文章主要介紹了Android短信備份及數(shù)據(jù)插入實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Android樣式和主題之選擇器的實例講解

    Android樣式和主題之選擇器的實例講解

    今天小編就為大家分享一篇關于Android樣式和主題之選擇器的實例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Android實現(xiàn)帶有記住密碼功能的登陸界面

    Android實現(xiàn)帶有記住密碼功能的登陸界面

    這篇文章主要為大家詳細介紹了Android實現(xiàn)帶有記住密碼功能的登陸界面,主要采用SharedPreferences來保存用戶數(shù)據(jù),感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android簡單實現(xiàn)圓盤抽獎界面

    Android簡單實現(xiàn)圓盤抽獎界面

    這篇文章主要介紹了Android簡單實現(xiàn)圓盤抽獎界面的相關資料,需要的朋友可以參考下
    2016-01-01
  • Repo工作原理和使用介紹

    Repo工作原理和使用介紹

    Repo是谷歌用Python腳本寫的調(diào)用git的一個腳本,可以實現(xiàn)管理多個git庫。本文詳細講解了Repo的工作原理和使用介紹,需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • Android DataBinding的官方雙向綁定示例

    Android DataBinding的官方雙向綁定示例

    本篇文章主要介紹了Android DataBinding的官方雙向綁定示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 詳解Flutter手游操縱桿移動的原理與實現(xiàn)

    詳解Flutter手游操縱桿移動的原理與實現(xiàn)

    這篇文章將為大家詳細介紹一下Android?Flutter手游中操縱桿移動角色的原理與實現(xiàn)過程,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-07-07
  • Android 4.4以上

    Android 4.4以上"沉浸式"狀態(tài)欄效果的實現(xiàn)方法

    Android與ios效果互仿早已不是什么稀奇的事,我猜大概這個效果來自ios吧,有爭議說這種效果不能叫做沉浸式,叫透明狀態(tài)欄更合適,我也感覺這和沉浸式的含義不太一致。但是大家都這么叫了,那就這樣唄。下面來一起看看關于Android 4.4以上"沉浸式"效果的實現(xiàn)方法。
    2016-09-09
  • android提取視頻多張圖片和視頻信息實例

    android提取視頻多張圖片和視頻信息實例

    本篇文章主要介紹了android提取視頻多張圖片和視頻信息實例,具有一定的參考價值,有興趣的可以了解一下
    2017-05-05

最新評論

宁南县| 襄樊市| 郓城县| 乌审旗| 湖口县| 衡阳市| 铁岭县| 河北省| 新和县| 尼勒克县| 荆门市| 高安市| 新田县| 玉环县| 宁安市| 三都| 贵南县| 建水县| 星子县| 阿城市| 武安市| 来凤县| 安平县| 遂宁市| 屯留县| 泰安市| 崇礼县| 泰宁县| 康马县| 广丰县| 贺兰县| 体育| 崇义县| 会理县| 轮台县| 徐汇区| 乐至县| 秦皇岛市| 沙河市| 望都县| 静乐县|