android项目混淆
❶ android 怎么实现只混淆自己的代码,而不混淆第3方
混淆打包流程: 1在proguard-projecttxt文件中添加不需要混淆的类和第三方的jar包 这个是保持自己包中不需要混淆的类,如果有些类调用了jni也不需要混淆,不然会出错。还有如果项目中有其他项目作为library引入,那这些项目的一些类也不能混淆android 怎么实现只混淆自己的代码,而不混淆第3方
❷ Android之如何混淆代码和相关配置
项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小APK包。
使用步骤:
1、修改project.properties文件:
java代码 收藏代码
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
去掉proguard.config一行前面的#注释;
2、配置proguard-project.txt文件:
这个是主配置文件,里面配置哪些需要混淆,哪些不需要混淆的选项;
提供给外部的类、方法、变量等名字不能混淆;
在AndroidManifest中配置的类(Activity、Service等的子类及Framework类默认不会进行混淆)
不混淆Parcelable的子类,防止android.os.BadParcelableException
Jni中调用的类
反射用到的类
项目中的实体类
3、导出项目:
export签名项目。
4、查看是否混淆成功:
用反编译工具反编译并对比未混淆的代码;
5、运行ProGuard及其生成的文件介绍
在以release模式下打包apk时会自动运行ProGuard,这里的release模式指的是通过ant release命令或eclipse project->android tools->export signed(unsigned) application package生成apk。在debug模式下为了更快调试并不会调用proguard。
如果是ant命令打包apk,proguard信息文件会保存于<project_root>/bin/proguard文件夹内;如果用eclipse export命令打包,会在<project_root>/proguard文件夹内。其中包含以下文件:
mapping.txt表示混淆前后代码的对照表,这个文件非常重要。如果你的代码混淆后会产生bug的话,log提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推。
mp.txt描述apk内所有class文件的内部结构
seeds.txt列出了没有被混淆的类和成员
usage.txt列出了源代码中被删除在apk中不存在的代码
目前市面上有很多第三方应用加固的平台, 如果新应用发布前需要扫描或者加固的话,可以先试试免费的,例如腾讯御安全,建议自己先去加固测试下。
❸ 【Android性能优化】:ProGuard,混淆,R8优化
使用Java编写的源代码编译后生成了标准的class文件,面临反编译风险,需要进行代码混淆以保护应用安全。ProGuard作为常用的混淆工具,具备压缩、优化、混淆功能。其工作流程包括shrink(缩减)、optimize(优化)、obfuscate(混淆)和preverigy(预验证)四个步骤。通过ProGuard,可以实现代码缩减,移除未使用的类、字段、方法和属性,优化代码结构。
在Android构建中,R8编译器取代了ProGuard进行代码优化与混淆。R8通过检测代码中未使用的部分,并移除它们来实现代码缩减。例如,若项目依赖多个库,但仅使用其中一部分,R8会检测应用代码入口(如启动的第一个Activity),构建访问图,并移除未访问的代码。
在R8配置中,通过proguard-rules.pro文件决定保留哪部分代码。R8支持来自不同来源的配置文件,如自定义配置、AGP生成的规则、AAR或JAR库中包含的规则,以及AAPT2生成的保留规则。通过minifyEnabled属性设置为true,可启用R8的代码缩减功能。需要注意的是,R8对反射调用和JNI调用的检测不足,可能需要在配置中进行额外处理以避免移除必要的代码。
R8在代码缩减后进行资源缩减,以去除不使用的资源文件。开启代码缩减并使用shrinkResources属性即可进行资源缩减。同时,可以使用tools:keep或tools:discard对特定资源文件进行保留或删除。
代码混淆通过替换类名、方法名和属性名,使反编译变得困难。混淆规则和模板的添加有助于保护应用安全。
R8进一步优化代码,通过深度分析移除更多未使用的代码,或重写代码以简化结构。优化点可参考Jake Wharton的R8优化博文。
总结,R8编译器通过代码缩减、资源缩减、代码混淆和代码优化等操作,全面提升了APK文件的性能。为了深入了解性能优化,可获取相关核心笔记,内容涵盖启动优化、内存优化、UI优化、网络优化、Bitmap优化与图片压缩、多线程并发优化、数据传输效率优化、体积包优化,以及性能监控框架和框架学习手册。这些资源将帮助开发者全面掌握性能优化技术。
❹ Android代码混淆&组件化和SDK混淆方案
本文整理了全面的Android代码混淆方法,包括组件化和SDK的混淆方案,旨在帮助开发者降低风险,避免项目上线后出现各种问题。混淆开启方法是在app模块的build.gradle文件中将minifyEnabled设置为true。默认混淆配置文件proguard-android.txt在Android sdk /tools/proguard目录下,自定义混淆规则则放在proguard-rules.pro文件中。
自定义混淆规则中,常用混淆命令keep用于保留指定类或方法不被混淆,更多规则可参考官方网站。组件化代码混淆方案包括两种方案:第一,所有混淆规则统一管理在app模块的proguard-rule.pro文件中,优点在于规则集中,便于维护;缺点是移除模块后需手动调整app模块规则。第二,每个组件模块管理各自混淆规则,避免影响编译效率,优点是模块间混淆解耦。组件化代码混淆总结建议将第三方混淆规则解耦到common模块和各自的组件模块,确保混淆规则合理且高效。
SDK代码混淆方案与组件化方案相似,涉及两次混淆过程:SDK内部混淆和外部混淆。内部混淆将核心代码混淆,保留对外暴露的类;外部混淆时,外部业务方可能遇到反射调用问题,因此需要将需要反射的类保留,这通常在SDK内部的consumerProguardFiles配置文件中完成。特别注意,使用compileOnly依赖方式引用SDK时,SDK的混淆配置也会被引入。
总结而言,通过合理配置混淆规则,开发者可以有效提升代码安全性,减少项目上线后的兼容性问题,确保代码在不同环境下的稳定运行。
❺ Android项目里如何混淆自己打的jar包或者防止被反编译
Android之防止反编译技巧:
1. 判断程序是否运行在模拟器上
boolean isRunningInEmualtor() {
boolean qemuKernel = false;
Process process = null;
DataOutputStream os = null;
try{
process = Runtime.getRuntime().exec("getprop ro.kernel.qemu");
os = new DataOutputStream(process.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
os.writeBytes("exit\n");
os.flush();
process.waitFor();
// getprop ro.kernel.qemu == 1 在模拟器
// getprop ro.proct.model == "sdk" 在模拟器
// getprop ro.build.tags == "test-keys" 在模拟器
qemuKernel = (Integer.valueOf(in.readLine()) == 1);
Log.d("com.droider.checkqemu", "检测到模拟器:" + qemuKernel);
} catch (Exception e){
qemuKernel = false;
Log.d("com.droider.checkqemu", "run failed" + e.getMessage());
} finally {
try{
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
}
Log.d("com.droider.checkqemu", "run finally");
}
return qemuKernel;
}
2. 检测keystore签名,再与之前得做比较
public int getSignature(String packageName) {
PackageManager pm = this.getPackageManager();
PackageInfo pi = null;
int sig = 0;
try {
pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
Signature[] s = pi.signatures;
sig = s[0].hashCode();
} catch (Exception e1) {
sig = 0;
e1.printStackTrace();
}
return sig;
}
3. 检测包名,版本名和版本号,然后做判断:
private String getAppInfo() {
try {
String pkName = this.getPackageName();
String versionName = this.getPackageManager().getPackageInfo(
pkName, 0).versionName;
int versionCode = this.getPackageManager()
.getPackageInfo(pkName, 0).versionCode;
return pkName + " " + versionName + " " + versionCode;
} catch (Exception e) {
}
return null;
}
4. 把jpg图片写成是png格式得图片 但是最新版本的apktool已经修复了
5. 花指令,影响jd-gui 但是最新版本的jd-gui已经修复
private static final char[] wJ = "0123456789abcdef".toCharArray();
public static String imsi = "204046330839890";
public static String p = "0";
public static String keyword = "电话";
public static String tranlateKeyword = "%E7%94%B5%E8%AF%9D";
在每个类里面加入 如上字段。。。。
https://***/ 一个第三方得”爱加密“网站 1.需要使用官方的打包key工具打包后上传到"爱加密"网站进行处理,然后到网站上面下载,下载后还要用"爱加密"的打包工具再次进行打包即可。
❻ android 混淆 什么意思
Android代码混淆,是为了你的apk被他人反编译之后拿到源码,如果你混淆了,那反编译后的apk所有的java类都被改成了a.java/c.java之类的文件名,类里面的属性也变成abc之类的了,想拿到你的源码就不可能了,直接在gradle(app)文件的android节点下加上下边代码。
buildTypes{
release{
minifyEnabledfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}