Android 应用开发之代码混淆
1.代码混淆的作用
代码混淆可以将原有 Java 代码反编译成的暴露的对应 Java 原代码格式的 Java 文件进行二次加密,改变其结构,提高代码保密性和防止逆向破解的能力。
在 Android 应用开发中,只编写 Java 代码是不够的。Android 应用也会包含 XML 、资源文件、native 库和其他二进制文件等。因此,为了保护我们的代码和应用不被反编译,我们需要对 Android 应用进行代码混淆。代码混淆可以对应用进行加密,防止反编译和破解。
2.代码混淆的步骤
Android 应用开发中的代码混淆需要开发者在代码编写完成后对应用进行代码混淆。代码混淆的步骤为:
- 在 Android Studio 工具栏上打开 Terminal 窗口,输入以下命令进行生成 ProGuard 配置文件:
./gradlew assembleRelease
上面这个命令会在项目根目录下的app
模块中找到build/outputs/mapping/
文件夹,ProGuard 的混淆配置文件就在这个文件夹中。
- 在工程的 build.gradle 文件中进行设置混淆:
在gradle文件的android节点下修改如下配置:
```
android {
...
buildTypes {
release {
minifyEnabled true
// 是否开启混淆:`minifyEnabled`为true表示开启;为false表示关闭。
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
```
上面的 `proguardFiles` 参数配置路径表示引用了 ProGuard 配置文件,并且会从项目根目录下的 app 模块中的 proguard-rules.pro 文件中找到具体的混淆规则。
- 配置混淆规则:
在app模块的proguard-rules.pro
文件里设置混淆规则。例如:
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn org.xmlpull.v1.**
-dontwarn com.squareup.okhttp.**
-dontwarn okhttp3.**
-dontwarn org.apache.http.**
-dontwarn com.ta.utdid2.**
-dontwarn com.facebook.stetho.**
-dontwarn com.squareup.picasso.**
-dontwarn com.google.android.gms.**
-dontwarn com.beyondsoft.security.**
-dontwarn com.baidu.**
-dontwarn com.alipay.security.**
-dontwarn javax.security.**
-dontwarn org.bouncycastle.**
-keep class com.litesuits.** { *; }
-keep class com.umeng.analytics.** { *; }
-keep class cn.aqqje.** { *; }
- 编译生成混淆后的 APK 包:
使用此基于 ProGuard 规则的混淆文件打包一个混淆后的 APK 文件。
3.混淆代码的示例
下面为两个简单的混淆代码的示例:
public class MainActivity extends AppCompatActivity {
private String TAG = getClass().getSimpleName();
private TextView tv_content;
private final String mString = "Hello";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_content = findViewById(R.id.tv_content);
tv_content.setText(mString);
Log.d(TAG, "计算结果:" + calculate());
}
private int calculate(){
int result;
int var1 = 10;
int var2 = 20;
result = var1 + var2;
return result;
}
}
使用 ProGuard 规则后,相应混淆后的代码将是这样的:
public class MainActivity extends AppCompatActivity {
private String a = getClass().getSimpleName();
private final String b = "Hello";
private TextView c;
protected void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(R.layout.activity_main);
this.c = findViewById(R.id.tv_content);
this.c.setText(this.b);
Log.d(this.a, "计算结果:" + a());
}
private int a() {
int i = 10;
int j = 20;
return i + j;
}
}
从上面的组等可以看出,使用代码混淆后,函数名、变量名等将变成一串混淆字符,从而增加了逆向分析的难度。
同时,由于上面的代码没有加入防抄袭等代码混淆技巧,所以并不是完全不容易被破解。
对于更加大型的项目,合理配置 ProGuard 还需要根据情况针对性制定混淆规则,这样才能最大程度的实现代码的保护和安全。
4. 总结
在 Android 开发中,代码混淆是一种非常重要的保护代码安全的方案。 ProGuard 是代码混淆工具的一种,可以通过设置 ProGuard 混淆配置文件来实现代码混淆。开发者可以根据需要进行不同程度的混淆,加强对应用的保密性和防止逆向破解,提高应用开发的安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android应用开发之代码混淆 - Python技术站