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'
}
}