问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何混淆android代码以及注意事项

发布网友 发布时间:2022-04-30 16:07

我来回答

4个回答

懂视网 时间:2022-04-20 13:22

本篇文章给大家带来的内容是关于安全编程之Android APK打包代码混淆(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

第一步:在项目工程目录下的proguard-rules.pro文件中配置自定义的混淆规则

#注意:
#1.引用外部的jar包 如果不是自己写的最好不混淆它们,因为外部jar包有可能已经混淆过
#2.不要混淆XML布局中使用的自定义控件类,混淆后加载布局会报找不到该控件错误
#3.不要混淆Manifests中配置的组件类,混淆后系统会找因不到该组件而报错
#------------------------------------------------------------------
#指定代码的压缩级别
-optimizationpasses 5
#表示混淆时不使用大小写混合类名,混淆后的类名为小写
-dontusemixedcaseclassnames
#表示不进行优化,建议使用此选项,因为根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。
-dontoptimize
# 混淆时
输出日志 -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 #表示不混淆任何包含native方法的类的类名以及native方法名 -keepclasseswithmembernames class * { native <methods>; } #表示不混淆任何一个View中的setXxx()和getXxx()方法,因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。 -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } #表示不混淆Activity中参数是View的方法,因为有这样一种用法,在XML中配置android:onClick=”buttonClick”属性,当用户点击该按钮时就会调用Activity中的buttonClick(View view)方法,如果这个方法被混淆的话就找不到了。 -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } #表示不混淆枚举中的values()和valueOf()方法 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } #表示不混淆Parcelable实现类中的CREATOR字段,毫无疑问,CREATOR字段是绝对不能改变的,包括大小写都不能变,不然整个Parcelable工作机制都会失败。 -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; } #表示不混淆R文件中的所有静态字段,我们都知道R文件是通过字段来记录每个资源的id的,字段名要是被混淆了,id也就找不着了。 -keepclassmembers class **.R$* { public static <fields>; } #保持自定义控件类不被混淆 -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } #保持自定义控件类不被混淆 -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } #过滤掉自己编写的实体类以及自定义控件类 -keep class com.beacon.supertool.bean.**{*;} -keep class com.beacon.supertool.widget.**{*;} #不需要混淆第三方类库 -dontwarn android.support.v4.** #去掉警告 -keep class android.support.v4.** { *; } #过滤android.support.v4 -keep interface android.support.v4.app.** { *; } -keep public class * extends android.support.v4.** -keep public class * extends android.app.Fragment #不需要混淆butterknife -dontwarn butterknife.** -keep class butterknife.** { *;} #不需要混淆gson -dontwarn com.google.** -keep class com.google.gson.** {*;} #不需要混淆glide -dontwarn com.bumptech.glide.** -keep class com.bumptech.glide.** {*;} #不需要混淆okhttp3 okio -dontwarn okhttp3.** -keep class okhttp3.** {*;} -dontwarn okio.** -keep class okio.** {*;} #不需要混淆第三方库库或jar......

第二步:在项目工程目录下的build.gradle文件中修改

 buildTypes {
// debug版本的配置
 debug {
  versionNameSuffix "-debug"
  minifyEnabled false
  zipAlignEnabled false
  shrinkResources false
  signingConfig signingConfigs.debug
 }
// release版本的配置
 release {
  // 不显示Log
  buildConfigField "boolean", "LOG_DEBUG", "false"
  //混淆
  minifyEnabled true
  //Zipalign优化
  zipAlignEnabled true
  // 移除无用的resource文件
  shrinkResources true
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 }
 }

热心网友 时间:2022-04-20 10:30

  2.3SDK的两个新特点:

  1.刚安装上2.3时,查看sdk目录,发现在\tools下新增了一文件夹“proguard”,如下图,我就在想是不是Google终于官方对proguard考虑进去了。理论上,对java的混淆都是可以的,但关键在于如何编写proguard的混淆脚本。

  

  2.使用SDK2.3后,新建的工程下和之前相比,都会多了一个文件“proguard.cfg”。一打开,相当惊喜,这就是混淆所需的proguard脚本啊。

  如下图:

  

  其代码如下:

  view plaincopy to clipboardprint?

  -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 com.android.vending.licensing.ILicensingService

  -keepclasseswithmembernames class * {

  native ;

  }

  -keepclasseswithmembernames class * {

  public (android.content.Context, android.util.AttributeSet);

  }

  -keepclasseswithmembernames class * {

  public (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 *;

  }

  -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 com.android.vending.licensing.ILicensingService

  -keepclasseswithmembernames class * {

  native ;

  }

  -keepclasseswithmembernames class * {

  public (android.content.Context, android.util.AttributeSet);

  }

  -keepclasseswithmembernames class * {

  public (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 *;

  }

  从脚本中可以看到,混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件。

  并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考\examples中的例子及注释。)

  好了,进行得差不多了,下面就来看看如何真正的生成混淆APK吧。这儿又得提醒一下,SDK新的特性在文档里都是有的,所以文档很重要。

  查看SDK2.3的文档,在路径“/docs/guide/developing/tools/proguard.html”的“Enabling
ProGuard ”中是这样描述的:

  To enable ProGuard so that it runs as part of an Ant or Eclipse build, set
the proguard.config property in the /default.properties file. The path can be an
absolute path or a path relative to the project's root.

  好的,那就这样做吧。

  在工程的"default.properties"中添加这样一句话“proguard.config=proguard.cfg”,如下图:

  


  这样就已经设置好ADT的混淆操作了。接下来就是正常的打包和签名了。。

  下图是我混淆SDK Demo中自带的Notepad效果图:

  

  注意要点:

  1.混淆以后的包会比混淆前的包小一点,一定要注意这点.

  如果混淆不成功,请在第2步,将proguard.config=proguard.cfg修改为proguard.config=E:\Mobile_Develop\Google_Android\publicGoldenBeach_new\proguard.cfg这种类似的用绝对路径,请注意绝对路径中的文件夹名不能含有空格,如果有空格请替换为"_".

  2.android在用proguard混淆时,一般情况下使用系统自带的配置文件就可以保持大部分外部需要引用的类,比如Activity,view扩展等等,但是有些情况下一些引入的外部lib,如果被混淆也会出现各种各样的问题,如果不想混淆这些包,就要加上

  -keep class packagename.** {*;}

  这样就能完整保持原有class了

热心网友 时间:2022-04-20 11:48

系统自带的proguard就可以了,注意事项主要是在proguard配置文件中忽略一些不能被混淆的类,
还有就是用到jni的话就要慎用proguard了,记得忽略这些类的混淆,以防止找不到native方法
http://blog.csdn.net/binyao02123202/article/details/18940715

热心网友 时间:2022-04-20 13:23

http://blog.csdn.net/garretly/article/details/6653464
这个应该能帮到你,希望采纳
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
iPhone XR电量百分比怎么设置 Django如何使用网页嵌套网页(2023年最新解答) 社保之前工作缴了 后面工作不缴。自己要怎么续上?自己缴要缴多少?每... 壁挂炉数字不亮了怎么回事了解壁挂炉数字不亮的原因及解决方法_百度知 ... 单反长镜头和短镜头什么区别 ai的剪切蒙版快捷键是什么 自学当程序员需要哪些基础 程序员,需要学什么课程 想当一名出色的程序员数学必须要很好吗 华为路由器192.168.1.1怎样设置? 稻草人这本书的读后感 我想买一个2万左右的女士手表,帮忙说一下 《人生》这本书怎么样,《人生》读后感 药剂师需要什么条件才能考 欢喜自在这本书的读后感 2万左右的女士手表,选哪个牌子,哪款好些 读一本好书的心得体会,需要二千字的文章如钢铁是怎样炼成的这本书的读后感 专业网贷技术哪里有 分享《中国活法》读后感吧 中国人事考试网2017年执业药师考试报考条件有哪些要求 读完一本书的读后感 这本书读后感。 这本书的读后感,400字左右 这本书的读后感100字 这本书的读后感怎么写? 需要申请网贷,去哪好? 网贷一般在哪里借? 在工程施工中如何进行设计变更程序(业主方、监理方、施工方)? 简述工程变更的确认及处理程序 和男友亲热的时候,他那里留了白色的液体是什么? 职业药师在什么时间报名,需要什么证件 哪本书读后感好写,就是感悟特多的那种。 android代码混淆以及怎么判断一个apk代码是否被混淆过 2万内的,皮带的女士手表求推荐 这本书怎么写读后感 seetong监控怎么注销账号 Android-android 怎么实现只混淆自己的代码,而不混淆第3方jar包_百度... 关于Android studio 怎么使用代码混淆的问题 android studio 代码混淆错误 萤石云摄像头怎么删除原账号 监控摄像头不用了如何注销 android如何将混淆代码还原? 爱维宝贝监控机如何注销掉之前帐户 Android如何保持指定类不被混淆? 请问在房管局申请注销监控账户时需要提交什么资料。最好有一份资料清单,谢谢。 摄像头用户怎么注销? android中哪些东西不能做代码混淆 android代码混淆时,如何防止第三方jar包被 监控摄像头注销帐户就是解绑吗? 监控器账户注销了怎么恢复?