android內部類混淆
A. Android代碼混淆為什麼不混淆Activity
不混淆Activity 的類是因為這個在manifest中聲明了,如果混淆了就找不到了。
所有在xml中注冊的都不能混淆,而且設置的是不混淆這些類名或某些方法,如果是這樣寫:-keepclassmembers class * extends android.app.Activity {*;},就是內部所有都不混淆,要是只寫:-keep public class * extends android.app.Activity,只是類名不會混淆,可以反編譯下自己混淆過的代碼就看出來了。更多關於安卓混淆的辦法請參考android學習手冊,例子、源碼、文檔全部搞定,採用androidstudo的目錄結構,360手機助手中下載。下面是截圖。
B. android mk文件怎麼加混淆
針對android 選擇user版本進行編譯的時候,會出現proguard錯誤,我們需要知道的事情
1.proguard是做什麼的,他的作用是將java代碼進行混淆的工具
2.因為proguard是混淆工具,所以android的mk文件也對其支持為兩種方式:
1.指定不需要混淆的native方法與變數的proguard.flags文件
如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
2.制定編譯的工程,不要使用代碼混淆的工具進行代碼混淆
如:LOCAL_PROGUARD_ENABLED := disabled
3.不設置,默認使用LOCAL_PROGUARD_ENABLED := full.即將該工程代碼全部混淆
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在Android項目中用到JNI,當用了proguard後,發現native方法找不到很多變數,原來是被proard優化掉了。所以,在JNI應用中該慎用progurad啊。
解決辦法:
1、在Android.mk中加入一行:
LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags
2、創建proguard.flag文件,裡面寫入不需要proguard優化的類和方法。例如:
-keep class oms.miracle.mobiletv.broadcast.ServiceContext {
*;
}
我的這個類是和JNI相關的,不想讓proguard去優化而引起錯誤,向上面寫就能實現。
----------下面是網上找到的一些proguard的資料,貼出來分享:
ProGuard是一個免費的java類文件壓縮,優化,混淆器.它探測並刪除沒有使用的類,欄位,方法和屬性.它刪除沒有用的說明並使用位元組碼得到最大優化.它使用無意義的名字來重命名類,欄位和方法.
ProGuard的使用是為了:
1.創建緊湊的代碼文檔是為了更快的網路傳輸,快速裝載和更小的內存佔用.
2.創建的程序和程序庫很難使用反向工程.
3.所以它能刪除來自源文件中的沒有調用的代碼
4.充分利用java6的快速載入的優點來提前檢測和返回java6中存在的類文件.
參數:
-include {filename} 從給定的文件中讀取配置參數
-basedirectory {directoryname} 指定基礎目錄為以後相對的檔案名稱
-injars {class_path} 指定要處理的應用程序jar,war,ear和目錄
-outjars {class_path} 指定處理完後要輸出的jar,war,ear和目錄的名稱
-libraryjars {classpath} 指定要處理的應用程序jar,war,ear和目錄所需要的程序庫文件
- 指定不去忽略非公共的庫類。
- 指定不去忽略包可見的庫類的成員。
保留選項
-keep {Modifier} {class_specification} 保護指定的類文件和類的成員
-keepclassmembers {modifier} {class_specification} 保護指定類的成員,如果此類受到保護他們會保護的更好
-keepclasseswithmembers {class_specification} 保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。
-keepnames {class_specification} 保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclassmembernames {class_specification} 保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification} 保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)
-printseeds {filename} 列出類和類的成員-keep選項的清單,標准輸出到給定的文件
C. android 內部類 為什麼不能混淆
針對1234的回答如下: 1,2,4要一起說,這是採用的是傳值的方式,這比較靈活。如果傳入的MainActivity與當前MainActivity是同一個對象,那麼可以直接使用MainActivity.this;如果傳入的MainActivity與當前的MainActivity不是同一個對象,這種傳...
D. android jar包類名如何混淆成方框
一、如何指定某個包不被混淆
不被混淆的包下放一個指定不被混淆的class,這樣該包名就不會被混淆
舉例demo原有目錄結構如下:
圖1-1
指定MainActivity不被混淆
-keep public class * extends android.app.Activity # 保持哪些類不被混淆
-flattenpackagehierarchy 'yjrtest' #重新包裝所有重命名的包並放在給定的單一包中
混淆後的目錄結構如下:
圖1-2
可以看出除了MainActivity所在的包沒有被混淆之外其他的包名都被混淆了。
E. Android如何保持指定類不被混淆
包名 package com.example.test
類名 public class WebAppInterface{}
加上完整的包名才行。
-keep class com.example.test.WebAppInterface {*;}
F. android 混淆 什麼意思
Android代碼混淆,是為了你的apk被他人反編譯之後拿到源碼,如果你混淆了,那反編譯後的apk所有的java類都被改成了a.java/c.java之類的文件名,類裡面的屬性也變成abc之類的了,想拿到你的源碼就不可能了,直接在gradle(app)文件的android節點下加上下邊代碼。
buildTypes{
release{
minifyEnabledfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}
G. android混淆時提示找不到項目中jar中的類
-libraryjars '引用包的路徑'
引用包的路徑是你所引用的包的路徑,將這句話加到proguard.cfg中
H. android 加入library如何混淆
android工程會看到項目有
project.properties這個文件就是用來開啟項目是否混淆
proguard-project.txt 這個文件就是記錄了代碼混淆的屬性
要開啟混淆,只需要將project.properties 文件中的
# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt」的「#」去掉就可以了。
關於proguard-project.tx混淆的屬性:
通常情況下,我們只需要作以上幾步操作就能滿足需求,如果有一些特殊要求,某些類或者jar包不需要混淆,這個時候就需要修改proguard-project.txt文件了。以下是網上搜索的網友分享的經驗:
1.在proguard-project.txt文件中添加不需要混淆的類和第三方的jar包
這個是保持自己包中不需要混淆的類,如果有些類調用了jni也不需要混淆,不然會出錯。還有如果項目中有其他項目作為library引入,那這些項目的一些類也不能混淆。
2.另外還有其他一些經驗:
-optimizationpasses 5壓縮等級
-dontusemixedcaseclassnames 【混淆時不會產生形形色色的類名 】
- 【指定不去忽略非公共的庫類。 】
-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 * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public abstract interface com.asqw.android.Listener{
public protected <methods>;【所有方法不進行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【對該方法不進行混淆】
}
-keepclasseswithmembernames class * { 【保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)】
native <methods>;
}
-keepclasseswithmembers class * { 【保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好 】
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {【保護指定的類文件和類的成員】
public static final android.os.Parcelable$Creator *;
}
I. 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工具打包後上傳到"愛加密"網站進行處理,然後到網站上面下載,下載後還要用"愛加密"的打包工具再次進行打包即可。