android 资源混淆编译,Android 反编译与混淆

一、反编译

反编译代码工具

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

将需要反编译的代码片段移动至dex2jar的目录下,如下图红色框中所示

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

打开命令行,快捷方式 win+R,输入cmd,移动到dex2jar的目录下,输入命令d2j-dex2jar.bat classes.dex

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

操作执行后,可以看见目录下多了一个jar包,如下图所示

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

将jar包复制到jd-gui-window目录下,并打开jd-gui.exe,查看jar包的内容

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

反编译资源文件工具

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

将要反编译资源的apk放在与工具同样的目录下,打开命令行,跳转至工具目录下,并执行反编译指令

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

反编译成功后,可以看见多了一个app-release文件夹,里面的资源已经被反编译过的了

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

二、混淆

java 代码混淆,proguard-rules.pro

#微信

-keep class com.tencent.mm.opensdk.** {

*;

}

-keep class com.tencent.wxop.** {

*;

}

#网易云信

-dontwarn com.netease.**

-keep class com.netease.** {*;}

# okhttp3

-dontwarn okhttp3.**

-dontwarn okio.**

-dontwarn javax.annotation.**

# A resource is loaded with a relative path so the package of this class must be preserved.

-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

# eventbus

-keepattributes *Annotation*

-keepclassmembers class ** {

@org.greenrobot.eventbus.Subscribe ;

}

-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor

-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {

(java.lang.Throwable);

}

# glide

-keep public class * implements com.bumptech.glide.module.GlideModule

-keep public class * extends com.bumptech.glide.module.AppGlideModule

-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {

**[] $VALUES;

public *;

}

-keepclasseswithmembers class com.activity.** {*;}

-keepclasseswithmembers class com.model.** { *; }

-keepclasseswithmembers class com.util.** {public *** *(***);}

常用自定义混淆规则

#不混淆某个类

-keep public class com.example.Test { *; }

#不混淆某个包所有的类

-keep class com.test.** { *; }

#不混淆某个类的子类

-keep public class * extends com.example.Test { *; }

#不混淆所有类名中包含了“model”的类及其成员

-keep public class com.** {*;}

#不混淆某个接口的实现

-keep class * implements com.example.Interface { *; }

#不混淆某个类的构造方法

-keepclassmembers class com.example.Test {

public (); -> 匹配被public修饰的构造方法

}

#不混淆某个类的特定的方法

-keepclassmembers class com.example.Test {

public void test(java.lang.String); -> 匹配传参为String类型的方法

}

#保留某些类及某些成员方法

-keepclassmembers public class * extends android.view.View {

public void *(android.view.View); ->匹配传参为View的任意方法

public static ; -> 匹配被static修饰的区域

public *** ; -> 匹配被public修饰的任意类型的方法

public *** *(***); -> 核心

void set*(***);

*** get*();

}

常用不混淆类

Android四大组件、Application、自定义View、数据模型Model、第三方开源库、反射方法、枚举Enum、序列化Parcelable、WebView的JS调用接口

资源文件混淆,使用微信开源工具AndResGuard,进入tool_output目录

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

将需要混淆的apk和与之对应的签名密钥准备好

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

配置config.xml文件,其中value是key的密码

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

切换到tool_output目录下,并执行混淆语句

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

混淆成功后,可以发现目录下多了一个app的文件夹

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

进入app文件夹,其中app_signed.apk就是我们所需要的apk

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

混淆关键字详解

-keep 指定需要保留的类和类成员

-keepclassmembers 指定需要保留的类成员:变量或者方法

-keepclasseswithmembers 指定保留的类和类成员,条件是所指定的类成员都存在

-keepnames 指定要保留名称的类和类成员,仅用于模糊处理

-keepclassmembernames 指定要保留名称的类成员,仅用于模糊处理

-keepclasseswithmembernames 指定要保留名称的类成员,仅用于模糊处理

-keepattributes SourceFile,LineNumberTable 保留行号

-keepdirectories 指定要保持的目录结构

-keepattributes Signature 保持泛型

-dontwarn 压缩,如果有警告也不终止

-ignorewarnings 忽略警告,避免打包时某些警告出现

-optimizationpasses 指定压缩级别

-dontusemixedcaseclassnames 包名不混合大小写

-dontskipnonpubliclibraryclassmembers 不跳过非公共的库的类成员

匹配类中的所有字段

匹配类中的所有方法

匹配类中的所有构造函数

* 匹配任意长度字符,但不含包名分隔符(.)

** 匹配任意长度字符,并且包含包名分隔符(.)

*** 匹配任意参数类型

… 匹配任意长度的任意类型参数

三、真机调试

1、更改(app)build.grade文件,Tip:手机通过USB安装的Apk属于Debug版本

android {

compileSdkVersion 26

defaultConfig {

applicationId "com.singApk"

minSdkVersion 21 -> 以免真机不能安装apk

targetSdkVersion 26

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

signingConfigs { //配置apk签名信息,二选一

debug { //生成调试版的apk

storeFile file("../debug.keystore")

}

release { //生成正式版的apk

keyAlias 'keyAlias'

keyPassword 'keyPassword '

storeFile file('../debug.keystore')

storePassword 'storePassword '

}

}

2、更改AndroidStudio的配置,选择 File -> setting -> Build,Execution,Deployment -> Instant Run

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

取消勾选框里的选项

3、真机的权限允许

不同的厂商有不同的权限配置,需根据不同的手机,自行搜索需要允许的权限

四、资源目录分类

当资源文件数量足够庞大的时候,为方便日后开发及维护,建议将资源文件分包管理

android { -> app.build

sourceSets{

main{

res.srcDirs=

[

'src/main/res/layout/activity',

'src/main/res/layout/fragment',

'src/main/res/layout/adapter',

'src/main/res/layout/popwindow',

'src/main/res/layout/dialog',

'src/main/res/layout',

'src/main/res'

]

}

}

}

b13040fa62b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

将layout文件分类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值