當前位置:首頁 » 安卓系統 » 安卓禁止log會怎麼樣

安卓禁止log會怎麼樣

發布時間: 2022-07-14 16:55:00

A. android 列印log會影響速度嗎

三組列印結果,中間間隔1000毫秒,從系統返回的毫秒數來看列印日誌對程序影響非常的小,一組的列印日誌在1毫秒內完成

B. android 怎樣禁止禁止列印日誌

2)配置proguard-------修改proguard配置文件,
如:我的配置文件是:proguard-project.txt
配置為:
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

-dontwarn android.support.**

-keepclassmembers class **.R$* {
public static <fields>;
}
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String,int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}

3)導出關閉日誌的apk
proguard,在導出apk的時候才會優化代碼,生成優化後的apk。(完成代碼混淆也是在導出apk,proguard將代碼混淆後生成apk)
通過如上兩個步驟,配置project.properties文件和proguard.properties文件;那麼項目就配置好了。可以直接導出簽名apk,該apk不會輸出日誌,我們用LogCat是看不到該apk的日誌。

assumenosideeffects

assumenosideeffects,proguard 配置文件里的參數。assume no side effects;假定無效;該屬性也就是標識無效代碼。我們就是通過這個參數來讓proguard刪除日誌代碼。
assumenosideeffects的官方解釋:
In the optimization step, ProGuard will then remove calls to such methods, if it can determine that the return values aren't used.ProGuard will analyze your program code to find such methods automatically.It will not analyze library code, for which this option can therefore be useful.
In general, making assumptions can be dangerous; you can easily break the processed code. Only use this option if you know what you're doing!

如下:
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
使用這個配置時,一定要注意-dontoptimize,配置。
don『t optimize 不要優化;將會關閉優化,導致日誌語句不會被優化掉。所以不能有這個配置

C. 安卓root後,內存的data/log文件夾下的LOG文件在不停的增加。

很正常,ROOT以後,系統軟體和用戶軟體都會獲得系統操作的許可權,也就是許可權開放。

所以好多ROOT軟體,自帶了兼容性較強的許可權管理軟體,用來限制和管理軟體的系統許可權,限制和禁止軟體的許可權,就不會出現這樣的情況了。

比如360超級ROOT,ROOT成功後,會自動安裝ROOT許可權管理軟體,並提供自由的管理功能。

D. 手機里LOG可以刪除么

  • Log文件是可以刪除的。

  • 但一些專業場所建議保留一段時間或者確保環境安全後再刪除,因為一旦出現疑問緊急時間,技術人員可以查看Log日誌文件,找出問題。

E. 如何關閉安卓系統的所有log

主要看是高通還是MTK了。不過大致相當,只是log文件名稱不一樣而已 手機的android log(包含 main_log、events_log、kernel_log),mainlog記錄手機android上層app以及framework相關活動的log,比如你寫的app列印的log,就在這裡面;eventslog則...
如有疑問追問,如滿意記得採納,
如果有其他問題也可點我名字向我求助
答題不易,
如果沒有回答完全,請您諒解,

請採納最快回答的正確答案!!謝謝!

F. 如何防止android app被kill

相較於/data/app下的應用,放在/system/app下的應用享受更多的特權,比如若在其Manifest.xml文件中設置persistent屬性為true,則可使其免受out-of-memory
killer的影響。如應用程序'Phone'的AndroidManifest.xml文件:

<application
android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
設置後app提升為系統核心級別,任何情況下不會被kill掉, settings->applications裡面也會屏蔽掉stop操作。

這樣設置前的log: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)

# cat /proc/255/oom_adj

4

設置後的log: PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)

# cat /proc/155/oom_adj

-12 # 這是CORE_SERVER_ADJ
註:init進程的oom_adj為-16(即SYSTEM_ADJ): cat /proc/1/oom_adj

Android相關部分分析:
在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代碼:
final
ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord
app = getProcessRecordLocked(info.processName, info.uid);

if
(app == null) {
app
= newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName,
info.uid, app);
updateLruProcessLocked(app,
true, true);
}

if
((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
==
(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent
= true;
app.maxAdj
= CORE_SERVER_ADJ; //
這個常數值為-12。
}
if
(app.thread == null && mPersistentStartingProcesses.indexOf(app)
< 0) {
mPersistentStartingProcesses.add(app);
startProcessLocked(app,
"added application", app.processName);
}

return
app;
}


見要想成為core service (即app.maxAdj =
CORE_SERVER_ADJ(-12)),應用程序需要FLAG_SYSTEM和FLAG_PERSISTENT兩個標志,FLAG_SYSTEM指
的是應用位於/system/app下,FLAG_PERSISTENT就是指persistent屬性。

而對於frameworks/base/services/java/com/android/server/SystemServer.java,則調用
ActivityManagerService.setSystemProcess();
把自己的 app.maxAdj 設置成SYSTEM_ADJ,即-16。

原理:
Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先順序自動進行進程的回收。由此帶來三個問題:
1)
回收規則: 什麼時候回收與回收哪一個?
2)
避免誤殺: 如何阻止被回收?
3)
數據恢復與保存: 被回收了怎麼辦?

Android將進程分為6個等級,它們按優先順序順序由高到低依次是:
1.前台進程(
FOREGROUND_APP)
2.可視進程(VISIBLE_APP
)
3.
次要服務進程(SECONDARY_SERVER )
4.後台進程
(HIDDEN_APP)
5.內容供應節點(CONTENT_PROVIDER)
6.空進程(EMPTY_APP)

特徵:
1.如果一個進程裡面同時包含service和可視的activity,那麼這個進程應該歸於可視進程,而不是service進程。
2.另外,如果其他進程依賴於它的話,一個進程的等級可以提高。例如,一個A進程里的service被綁定到B進程里的組件上,進程A將總被認為至少和B進程一樣重要。
3.系統中的phone服務被劃分到前台進程而不是次要服務進程.

在android中,進程的oom_adj值也就代表了它的優先順序。oom_adj值越高代表該進程優先順序越低。文件/init.rc中有以下屬性設置:
setprop
ro.FOREGROUND_APP_ADJ 0
setprop
ro.VISIBLE_APP_ADJ 1
setprop
ro.SECONDARY_SERVER_ADJ 2
setprop
ro.HIDDEN_APP_MIN_ADJ 7
setprop
ro.CONTENT_PROVIDER_ADJ 14
setprop
ro.EMPTY_APP_ADJ 15
/init.rc中,將PID為1的進程(init進程)的oom_adj設置為SYSTEM_ADJ(-16):
#
Set init its forked children's oom_adj.
write
/proc/1/oom_adj -16

查看本機設置:
cat /sys/mole/lowmemorykiller/parameters/adj
0,1,2,7,14,15

回收時機:
文件/init.rc中:
setprop
ro.FOREGROUND_APP_MEM 1536 // 6M
setprop
ro.VISIBLE_APP_MEM 2048 // 8M
setprop
ro.SECONDARY_SERVER_MEM 4096 // 16M
setprop
ro.HIDDEN_APP_MEM 5120 // 20M
setprop
ro.CONTENT_PROVIDER_MEM 5632 // 22.4M
setprop
ro.EMPTY_APP_MEM 6144 // 24M
這些數字也就是對應的內存閾值,一旦低於該值,Android便開始按順序關閉相應等級的進程。
注意這些數字的單位是page: 1 page = 4 kB。所以上面的六個數字對應的就是(MB): 6,8,16,20,22,24。

查看現在的內存閾值設置:
cat /sys/mole/lowmemorykiller/parameters/minfree

要想重新設置該值(對應不同的需求):
echo "1536,2048,4096,5120,15360,23040">/sys/mole/lowmemorykiller/parameters/minfree
這樣當可用內存低於90MB的時候便開始殺死"空進程",而當可用內存低於60MB的時候才開始殺死"內容供應節點"類進程。

具體的回收實現在ActivityManagerService.java中的函數trimApplications():
1.首先移除package已被卸載的無用進程;
2.基於進程當前狀態,更新oom_adj值,然後進行以下操作:
1)
移除沒有activity在運行的進程;
2)
如果AP已經保存了所有的activity狀態,結束這個AP。
3.
最後,如果目前還是有很多activities 在運行,那麼移除那些activity狀態已經保存好的activity。

更新oom_adj的值:
在ActivityManagerService.java文件的ComputeOomAdjLocked() 中計算出進程的oom_adj,例如:
if
(app == TOP_APP) {
//
The last app on the list is the foreground app.
adj
= FOREGROUND_APP_ADJ;
app.adjType
= "top-activity";
}

Android kernel中的low memory killer
Android的Low Memory Killer根據需要(當系統內存短缺時)殺死進程釋放其內存,源代碼在kernel/drivers/misc/lowmemorykiller.c中。簡單說,就是尋找一個最合適的進程殺死,從而釋放它佔用的內存。
最合適的進程是:
• oom_adj越大
• 佔用物理內存越多

一旦一個進程被選中,內核會發送SIGKILL信號將之殺死:
for_each_process(p)
{
……
if(selected
== NULL || p->oomkilladj
> selected->oomkilladj ||
(p->oomkilladj
== selected->oomkilladj && tasksize > selected_tasksize))
{
selected
= p;
}
}
if(selected
!= NULL) {
force_sig(SIGKILL,
selected);
}

查看LRU列表:adb shell mpsys activity
當activitydemo在前台時:
包含Service的進程的優先順序比較高,在computeOomAdjLocked中將其分為了兩小類:
static
final int MAX_SERVICE_INACTIVITY = 30*60*1000;
if
(now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if
(adj > SECONDARY_SERVER_ADJ) {
adj
= SECONDARY_SERVER_ADJ;
app.adjType
= "started-services";
app.hidden
= false;
}
}
if
(adj > SECONDARY_SERVER_ADJ) {
app.adjType
= "started-bg-services";
}

完全讓進程不被kill是不可能的,我們可以通過一些操作,使進程被kill的幾率變小:
1)
提高進程的優先順序:
*
後台操作採用運行於前台的Service形式,因為一個運行著service的進程比一個運行著後台activity的等級高;
*
按back鍵使得進程中的activity在後台運行而不是destory,需重載back按鍵(沒有任何activity在運行的進程優先被殺).
*
依賴於其他優先順序高的進程;

2)
強制修改進程屬性:
*
在進程中設置:setPersistent(true);

*
在Manifest文件中設置(如上)。

G. 安卓關掉log輸出在哪個類裡面哪個方法

logcat是android中用於輸出日誌用的log可以保存到一個文件中,保存方式:直接在logcat中按Ctlr+C復制注意,右鍵是沒有復制粘使用adb命令,將logcat重定向adbshell進入shell模式
執行logcat>c:\log.txt表示將logcat定向到這個文件中

H. 如何屏蔽android logcat中的無用信息

重新切換一個工作區間。當你在新切換的工作區間第一次編譯android程序的時候,會讓你選擇logcat輸出的信息,這時候選擇所有(v開頭的那個)。一般應用如果有輸出的話左邊就會自動建一個過濾器。如果沒有的話,就手動建立,點擊左邊的加號然後添加過濾器的名稱以及需要過濾的應用的包名,確定即可。

I. android log列印會不會影響應用的性能

android log列印會影響應用的性能的,只是音響不大,用戶感覺不到,但是最好上線之前還是關閉log列印的。

J. 安卓手機里的log文件有什麼左右,能刪掉么

第一步:
定義一個logTools工具類,相信你能夠看懂的,誰的log,可以用誰的名字做方法名,如logli,這就是工程師li列印的日誌
復制代碼代碼如下:
import android.util.Log;
public class LogTools {
public static boolean isShow = true;//上線模式

//public static boolean isShow = false;//開發模式
//ye工程師打出來的log
public static void logYe(String msg){
if(isShow){
Log.i("Ye", msg);
}
}
//li工程師打出來的log
public static void logli(String msg){
if(isShow){
Log.i("lili", msg);
}
}

}

第二步:在程序中應用的方式是:

復制代碼代碼如下:

LogTools.logYe("onTouchEvent-----"+event.getAction());

第二種方法:
在開發中經常要列印log,但是在我們發布項目的時候是不能列印。為了方便操作log我們需要自己定義個log類然後在開發階段將下面LOG_LEVEL 設置為6這樣所有的log都能顯示,在發布的時候我們將LOG_LEVEL 設置為0.這樣log就非常方便管理了
復制代碼代碼如下:
public class Logger {
public static int LOG_LEVEL = 0;
public static int ERROR = 1;
public static int WARN = 2;
public static int INFO = 3;
public static int DEBUG = 4;
public static int VERBOS = 5;

public static void e(String tag,String msg){
if(LOG_LEVEL>ERROR)
Log.e(tag, msg);
}

public static void w(String tag,String msg){
if(LOG_LEVEL>WARN)
Log.w(tag, msg);
}
public static void i(String tag,String msg){
if(LOG_LEVEL>INFO)
Log.i(tag, msg);
}
public static void d(String tag,String msg){
if(LOG_LEVEL>DEBUG)
Log.d(tag, msg);
}
public static void v(String tag,String msg){
if(LOG_LEVEL>VERBOS)
Log.v(tag, msg);
}
}

熱點內容
我的世界伺服器如何使用路由器映射 發布:2025-01-24 20:49:30 瀏覽:739
腳本操作瀏覽器 發布:2025-01-24 20:41:40 瀏覽:296
fast自動獲取ip地址伺服器無響應 發布:2025-01-24 20:19:13 瀏覽:710
http加密數據 發布:2025-01-24 20:15:00 瀏覽:100
中國存儲行業排名 發布:2025-01-24 20:02:21 瀏覽:422
arm編譯鏈 發布:2025-01-24 19:42:12 瀏覽:700
linuxc的函數返回值 發布:2025-01-24 19:35:23 瀏覽:665
威綸編程軟體反編譯 發布:2025-01-24 19:30:26 瀏覽:49
網路存儲單元 發布:2025-01-24 19:28:04 瀏覽:168
自解c語言 發布:2025-01-24 19:27:08 瀏覽:647