安卓禁止log会怎么样
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);
}
}