据谷歌称,在发布我的Android应用程序之前,我必须" 停用源代码中对Log方法的任何调用 ".摘录自出版物清单的第5部分:
在构建应用程序以进行发布之前,请确保停用日志记录并禁用调试选项.您可以通过删除源文件中对Log方法的调用来停用日志记录.
我的开源项目很大,每次发布时手动执行都很痛苦.此外,删除日志行可能很棘手,例如:
if(condition)
Log.d(LOG_TAG, "Something");
data.load();
data.show();
Run Code Online (Sandbox Code Playgroud)
如果我对日志行进行注释,则条件适用于下一行,并且可能不会调用load().这种情况是否足够罕见,我可以决定它不应该存在?
这是在官方清单上,所以我想很多人会定期这样做.
那么,如何有效但安全地删除所有日志行?
我有一个使用很多Log.d()或Log.e()调用调用的应用程序.现在我想创建我的最终发布包.Eclipse的Android Export功能提到删除"Debuggable"清单中的标志,我已经完成了.我是否还应该评论所有Log调用以提高应用程序的性能,或者这些调用在不可调试的最终版本包中什么都不做?
BuildConfig.DEBUG当我运行应用程序时,为什么返回false?
我使用它来控制日志,如下所示:
public static void d(String LOG_TAG, String msg){
if(BuildConfig.DEBUG){
Log.d(LOG_TAG,msg);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用TimingLogger来检查特定方法及其语句所消耗的时间.但Android TimingLogger无法打印日志.
在日志中运行项目后添加过滤器,例如"app:My_Package_Name"
在/.idea/workspace.xml中添加:
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidConfiguredLogFilters">
<filters>
<filter>
<option name="logLevel" value="verbose" />
<option name="logMessagePattern" value="" />
<option name="logTagPattern" value="" />
<option name="name" value="app: com.zastavok.net" />
<option name="packageNamePattern" value="com.zastavok.net" />
<option name="pid" value="" />
</filter>
</filters>
Run Code Online (Sandbox Code Playgroud)
但是在这个过滤器中没有结果:

但如果我将过滤器更改为"无过滤器",则会显示所有结果:

如何通过Package_Name解决日志问题?
我的一个日志返回以下消息:
12-07 10:42:45.201 6622-17013/? D/DownloadManager: 23 Starting {Apk-apks_1.1.017-812_releaseVersion.apk} by {10112:com.google.android.gm}
我相信com.google.android.gm代表我的Gmail帐户但不确定.需要更多见解.
尝试使用logback-android重定向日志消息,以便可以将消息保存在文件中.但是,它不会保存到文件中.
这是我的logback.xml文件configration,它存储在我的Android Studio中的src/main/assets下
<configuration debug="true">
<!-- Create a file appender for a log in the application's data directory -->
<appender name="FILE" class="ch.qos.logback.classic.android.FileAppender">
<file>/data/com.test.equa/files/log/foo.log</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Write INFO (and higher-level) messages to the log file -->
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这是我启动日志记录的一段代码.
@Override
public void onCreate() {
super.onCreate();
loadData();
Logger log = LoggerFactory.getLogger(MyActivity.class);
log.error("Application Data setup in progress");
}
Run Code Online (Sandbox Code Playgroud)
问题:我继续在logcat中看到消息,但我希望它们存储在我的android sd卡内存中.
在清单中添加了用户权限,用于在SD卡中写入日志
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
我在这个配置中遗漏了一些东西,因为我在logcat中没有看到任何配置错误的错误或消息.有人可以帮助我吗?
在DebugTree日志中,我看到了类名,但是当我创建自定义树时,标签就是null.这是我的自定义树的样子:
public class CrashlyticsTree extends Timber.Tree {
private static final String CRASHLYTICS_KEY_PRIORITY = "priority";
private static final String CRASHLYTICS_KEY_TAG = "tag";
private static final String CRASHLYTICS_KEY_MESSAGE = "message";
@Override
protected boolean isLoggable(int priority) {
if (priority == Log.VERBOSE || priority == Log.DEBUG || priority == Log.INFO) {
return false;
}
// only log WARN(Timber.w), ERROR(Timber.e), or WTF(Timber.wtf)
return true;
}
@Override
protected void log(int priority, @Nullable String tag, @Nullable String message, @Nullable Throwable t) {
if(User.CurrentUser.isLoggedIn()){ …Run Code Online (Sandbox Code Playgroud) 我想从其他应用程序中读取日志并过滤它们,以便在记录某个关键字时,我的应用程序将执行某项任务.
我找到了几种读取日志的方法,但从我的测试中我只能得到我的应用程序日志.
这是我最初尝试使用的方法
try {
Process process = Runtime.getRuntime().exec("logcat -d");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
StringBuilder log=new StringBuilder();
String line = "";
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
}
TextView tv = (TextView)findViewById(R.id.textView1);
tv.setText(log.toString());
}
catch (IOException e) {}
Run Code Online (Sandbox Code Playgroud)
但它似乎只读取我的应用程序的日志.