首页 > 编程知识 正文

android混淆规则,手机app安装提示冲突

时间:2023-05-04 23:42:39 阅读:111670 作者:1726

有一天,客户说你们使用了混淆的aar库,与别人的另一个库发生了冲突,发现存在很高的虾,让我马上改正。 经过针对搜索引擎的编程,你发现定制词典可以解决问题。 如下: 其中,class_dictionary.txt文件如下所示: //package _ dicitonary.txt # thisobfuscationdictionarycontainsreservedjavakeywords.they can ' t # beusedinjavasourcefiler buttheycanbeusedincompiledclassfiles.# notethatthishardlyimprovestheobfuscation.decentdecompilerscarscascation automaticallyreplacereservedkeywords、 andtheeffectcanfairlysimplybe # undonebyobfuscatingagainwithsimplernames.# usage : # Java-jar proguard.jar .-obfue julyisafantasticmonthandalovelygirl你本来想半天就搞定,没想到十分钟就搞定了。 顺手牵羊,新的AVA不到2分钟,对方马上向你扔了一个臭虫: task : fpv demo : minifyreleasewithr8failedagpbi : { ' kind ' : ' error ',' text':'Java.nio.file.Nose}xxxxx

xx. grad le\ cachestransforms-2files-2.175131363 c84 DG a13 BD fer 09e 2d 223 de0xx lib

xxxx\.gradle\caches\transforms-2\files-2.1\52131363c840aa13bdf7509e2d2e8de0\xxxlib\.\dictionary\package_dictionary.txt"}],"tool":"R8"}

好了,翻车的那个人就是你我他,哈哈哈,扯淡到此结束,正文开始。

正确姿势探索

 当进到C:\Users\xxxxxxx\.gradle\caches\transforms-2\files-2.1\52131363c840aa13bdf7509e2d2e8de0\xxxlib下发现确实没有dictionary目录,如果我们能在xxxlib目录下生成dictionary目录,这个问题是不是就会解决呢,在xxxlib下我们发现有以下几个目录:

我们看到有res目录,我们再想想android还有个assets目录也可以用来存放文件,那我们是否可以将dictionary里面的字典文件放在assets中,从而让他们被打包进去,很显然,这是可以的,要不然文章到此就完结,可以扔鸡蛋了。

 插播一下,如果你打开编译出的aar文件,你会发现里面也没有你定义的dictionary文件

 接着说增加将dictionary文件打包进aar文件的事,上面说了我们可以放在assets文件中,很自然我们会想到放在src/main/assets里面,相信我,那是个小小的水坑,尽管跳就是了,这里就不给你们演示我花式跳坑技巧了。我们换个姿势,通过修改build.gradle文件,将dictionary文件夹加入到assets资源文件中,就像这样:

sourceSets { main { res.srcDirs = [ 'src/main/res' ] java.srcDirs = [ 'src/main/java' ] assets.srcDirs = [ 'dictionary', 'src/main/assets' ] } }

这个时候我们再看下生成的aar文件里面的内容是怎样的,有点变化了,有了个assets文件夹,而之前定义的dictionary文件也都在这里面,然后混淆的规则也生效了。

那现在问题是不是解决了呢,嗯,你去试…然后记得回来。这个时候你会发现还是同样的错误,那岂不是白忙活一场?其实也不至于,胜利马上就要到来了,我们再进入报错的路径下看看,有个assets文件夹,而dictionary文件就ykdyl。

虽然没有dictionary文件夹,但是字典文件却存在,那我们何不试试把dictionary文件夹改成assets试试?
除了dictionary文件夹改为assets,build.gradle和proguard-rules.pro也需要相应的修改。

//build.gradle sourceSets { main { res.srcDirs = [ 'src/main/res' ] java.srcDirs = [ 'src/main/java' ] assets.srcDirs = [ 'assets', 'src/main/assets' ] } } #proguard-rules.pro-obfuscationdictionary ./assets/default_dictionary.txt-classobfuscationdictionary ./assets/class_dictionary.txt-packageobfuscationdictionary ./assets/package_dictionary.txt

现在重新编译出aar文件,再跑一次demo,你会发现顺利通过了,可以将aar文件甩给客户了。

 至此本文应该结束了,但是,对还有个但是,如果你在自己的应用中通过implementation project(':xxxlib')依赖这个lib库的时候,你会碰到编译不过的问题,就像这样:

Task :app:minifyNormalReleaseWithR8 FAILEDAGPBI: {"kind":"error","text":"java.nio.file.NoSuchFileException: E:\xxx\xxxlib\build\intermediates\consumer_proguard_dir\release\lib0\.\assets\default_dictionary.txt","sources":[{"file":"E:\xxx\xxxlib\build\intermediates\consumer_proguard_dir\release\lib0\.\assets\default_dictionary.txt"}],"tool":"R8"}AGPBI: {"kind":"error","text":"java.nio.file.NoSuchFileException: E:\xxx\xxxlib\build\intermediates\consumer_proguard_dir\release\lib0\.\assets\class_dictionary.txt","sources":[{"file":"E:\xxx\xxxlib\build\intermediates\consumer_proguard_dir\release\lib0\.\assets\class_dictionary.txt"}],"tool":"R8"}AGPBI: {"kind":"error","text":"java.nio.file.NoSuchFileException: E:\xxx\xxxlib\build\intermediates\consumer_proguard_dir\release\lib0\.\assets\package_dictionary.txt","sources":[{"file":"E:\xxx\xxxlib\build\intermediates\consumer_proguard_dir\release\lib0\.\assets\package_dictionary.txt"}],"tool":"R8"}

这次不是gradle下找不到文件,而是你的lib库下找不到文件,那这个问题怎么解决呢?嗯,一开始我尝试过修改build.gradle中的consumerProguardFiles参数,但是没能成功,那怎么办呢,既然问题解决不掉问题,那就绕过问题,虽然可耻,但是有用… 我的方法是lib库增加一个buildType,命名为"aar",专门用于给他人提供aar库,混淆的时候使用自定义的字典;其他buildType不使用自定义的字典,最终修改如下:

文件目录结构:

│ build.gradle│ proguard-rules-aar.pro│ proguard-rules.pro│├─assets│ class_dictionary.txt│ default_dictionary.txt│ package_dictionary.txt│└─src

lib库的build.gradle文件:

//build.gradleapply plugin: 'com.android.library'android { compileSdkVersion 26 defaultConfig { minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled true consumerProguardFiles 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } aar { minifyEnabled true //将混淆规则打包进aar文件,使用了该aar文件的应用将会使用此混淆规则 consumerProguardFiles 'proguard-rules-aar.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-aar.pro' } } sourceSets { main { res.srcDirs = [ 'src/main/res' ] java.srcDirs = [ 'src/main/java' ] assets.srcDirs = [ 'assets', 'src/main/assets' ] } }}dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' implementation 'com.android.support:support-annotations:28.0.0' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'}

混淆文件proguard-rules.pro和proguard-rules-aar.pro几乎一模一样,除了没有自定义混淆字典。

#proguard-rules-aar.pro# 混淆字典可根据自己的需求定义,也可以使用同一个字典文件-obfuscationdictionary ./assets/default_dictionary.txt-classobfuscationdictionary ./assets/class_dictionary.txt-packageobfuscationdictionary ./assets/package_dictionary.txt#native 方法不混淆 -keepclasseswithmembernames class * { native <methods>; }#自定义保留不被混淆的类---start# -------自定义内容----------#自定义保留不被混淆的类---end

 最后,为了让大家得空学习清华大学《摸鱼学导论》课程,奉上build.gradle和混淆文件下载地址

参考文章:

《Android混淆——解决与其它包包名冲突》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。