Smoke ๆฏไธไธชๅจ Java ๅ Android ๅนณๅฐไธไฝฟ็จ็ๆฅๅฟๅฐ่ฃ ๅบ๏ผๅ ทๅคไปฅไธ็นๆง๏ผ
- ๆฅๅฃไฝฟ็จ็ฎๆด,ๆฏๆ ๆ TAG ๆๅฐ;
- ๆฏๆๆฅๅฟๆ ผๅผๅๆถ่ชๅจ่ฏๅซๆฐ็ป/ๅ่กจ/JSON/XML็ญ็ฑปๅๆๆฏๆ ผๅผ;
- ๆฏๆ้ฟๆฅๅฟๆๅฐ,Android ๅนณๅฐไธไธๅ็ณป็ป Logcat ้ฟๅบฆ้ๅถ;
- ๆฏๆๅค็บง TAG ๅๆฅๅฟ้ ็ฝฎ็ปงๆฟ;
- ๆฏๆๆฅๅฟๅฟซ้่ทณ่ฝฌๅฐไปฃ็ ไฝ็ฝฎ;
- ไฝฟ็จ้พๅผ่ฐ็จ,่ชๅฎไนๆฅๅฟไฟฎ้ฅฐ/ๆๅฐๅ่ฝๅผบๅคง;
- ๆฏๆๆฅๅฟๆ็บงๅซ่ฟๆปค;
- ๆฏๆSDKๅผๅธธๅ่ชๅจๅ ณ้ญ่ช่บซๅ่ฝ;
- ๆฏๆๆฅๅฟๆไปถ่ฎฐๅฝ
compile 'com.mingyuans.android:smoke-java:2.1.3'
compile 'com.mingyuans.android:smoke-android:2.1.1'
Smoke.install("Smoke",null);
Smoke.debug("Hello,Smoke!");
Smoke.install("Smoke",AndroidProcesses.androidDefault());
Smoke.debug("Hello,Smoke!");
Android ๅนณๅฐไธๆฏๆๆฅๅฟๅๅ ฅๅฐๆไปถไธญไฟๅญ,่ฏฆ่ง: smoke-android-file: README
็ธๆฏ็ณป็ปๅ็็ Log.d(TAG,"message") ๆๅฐ๏ผSmoke ็ดๆฅไฝฟ็จ้ป่ฎคๆนๆณๅไฝไธบTAG,ไฝฟๅผๅ่ ไธๆณจไบๆฅๅฟๆถๆฏๆฌ่บซ๏ผ ไผ ็ป็String.formatๅฝขๅผ๏ผไฝฟๅพๆไปฌๆๅฐไธไธชๆถๆฏๆถๅพๅพ่ฟ่ฆๅปๆณจๆๅๆฐ็็ฑปๅ๏ผๅๅ่ฎจๅ; ไธบไบๆดๆไธ็น๏ผSmoke ๅ ้จ่ชๅจๅไบๅๆฐ็็ฑปๅๅคๆญ๏ผๅนถๆฏๆ MessageFormat ๆ ผๅผๅๅฝขๅผ๏ผ
public void doSmokePrint() {
Smoke.verbose();
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ[SmokeTest.doSmokePrint(SmokeTest.java:59)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
public void doSmokePrint() {
Smoke.debug("Hello๏ผ%s","Lilei");
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ[SmokeTest.doSmokePrint(SmokeTest.java:59)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โHello,Lilei
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
public void doSmokePrint() {
Smoke.debug("Hello๏ผ{}","Hanmeimei");
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ[SmokeTest.doSmokePrint(SmokeTest.java:59)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โHello,Hanmeimei
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
public void doSmokePrint() {
Smoke.debug("Hello๏ผ{0} and {1}","Lilei","Hanmeimei");
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ[SmokeTest.doSmokePrint(SmokeTest.java:59)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โHello,Lilei and Hanmeimei
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
public void doSmokePrint() {
String xmlString = "<team><member name=\"Elvis\"/><member name=\"Leon\"/></team>";
Smoke.info(xmlString);
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ[SmokeTest.doSmokePrint(SmokeTest.java:132)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ<?xml version="1.0" encoding="UTF-8"?>
โ<team>
โ <member name="Elvis"/>
โ <member name="Leon"/>
โ</team>
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
public void testJson() {
String json = "{\"code\":\"1\",\"content\":\"hello\"}";
Smoke.warn(json);
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ[SmokeTest.testJson(SmokeTest.java:125)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ{
โ "code": "1",
โ "content": "hello"
โ}
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
public void testFormat() {
String[] array = new String[]{"Hello","World"};
Smoke.debug("array is : {0}",(Object)array);
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ[SmokeTest.testFormat(SmokeTest.java:101)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โarray is : [Hello,World]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๅค็บง TAG ็จไบๅธฎๅฉๅบๅๆฅ็ไธๅๆจกๅ็ๆฅๅฟๆถๆฏ๏ผ newSub ๆนๆณๅพๅฐ็ๅญๅฏน่ฑกๅฐ็ปงๆฟ็ถๅฏน่ฑก็ๆฅๅฟ้ ็ฝฎ๏ผ
public void testNewSub() {
SubSmoke subSmoke = Smoke.newSub("subOne");
subSmoke.debug("Hello, subOne!");
SubSmoke subSmoke1 = subSmoke.newSub("subTwo");
subSmoke1.debug("Hello, {0}!","subTwo");
}
//Output:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โใsubOneใ[SmokeTest.testNewSub(SmokeTest.java:151)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โHello, subOne!
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โใsubOne|subTwoใ[SmokeTest.testNewSub(SmokeTest.java:153)][thread: main]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โHello, subTwo!
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
็นๅปๆฅๅฟไธญ้ซไบฎ็ๆๅญๅณๅฏ่ฎฉ AndrodiStudio ่ทณ่ฝฌๅฐ่ฏฅๆฅๅฟๆๅฐไฝ็ฝฎ๏ผ
Smoke.setLogPriority(Smoke.INFO);
Smoke ไฝฟ็จ้พๅผ้ๅฝ่ฐ็จ็่ฎพ่ฎกๆฅๅค็ๆฅๅฟ็ไฟฎ้ฅฐๅ่พๅบๅนถๅผๆพไบๆต็จ้ ็ฝฎๆฅๅฃ๏ผๅผๅ่ ๅฏไปฅๆ นๆฎ่ชๅทฑ็้่ฆ่ฟ่กๆฅๅฟๅค็ๆต็จ็ไฟฎๆน๏ผ
public void testProcessDIY() throws Exception {
SubSmoke subSmoke = new SubSmoke(InstrumentationRegistry.getContext(),"Smoke");
String drawBoxIdentify = Processes.getIdentify(DrawBoxProcess.class);
subSmoke.getProcesses()
.removeByIdentify(drawBoxIdentify) //If you do not like box!
.addCollector(new MyDIYLogCollector())
.addPrinter(new MyDIYLogPrinter());
subSmoke.debug("Hello");
}
public static class MyDIYLogCollector extends Smoke.Process {
@Override
public boolean proceed(Smoke.LogBean logBean, List<String> messages, Chain chain) {
LinkedList<String> newMessages = new LinkedList<>();
for (String message: messages) {
newMessages.add("Test" + message);
}
return chain.proceed(logBean,newMessages);
}
}
public static class MyDIYLogPrinter extends Smoke.Process {
@Override
public boolean proceed(Smoke.LogBean logBean, List<String> messages, Chain chain) {
for (String message: messages) {
Log.i("SmokeDIY",message);
}
return chain.proceed(logBean,messages);
}
}
ๆณ่ฆๆฅๅฟ็นๆฎ่ฟๆปค๏ผๆณ่ฆๅป้คๆกๆก๏ผๆณ่ฆๅ ๅ็ผ๏ผๆณ่ฆ่พๅบๅฐๅ ถไปๆงๅถๅฐ๏ผ ็ป็ปๅฏไปฅ้่ฟๅขๅ Process ๆฅๅฎ็ฐ๏ผ
ๅฝๆไปฌๅจๅผๅๆไธช SDK ๆถ๏ผไธๅฏ้ฟๅ ็๏ผๆไปฌไผ้่ฆๅฏนๅคๆไพไธไธชๆฅๅฃ๏ผ่ฎฉSDK ไฝฟ็จ่ ๅฏไปฅๆงๅถๆไปฌ SDK ๅ ็ๆฅๅฟๆๅฐ๏ผๆนไพฟ่ฟ่ก่ฐ่ฏ๏ผ
Smoke ่ชๅธฆไพๅค้จ่ฎพ็ฝฎ็ Printer๏ผ ๆด่ฟไธๆญฅ๏ผๅฆๆ่ฐ็จๆนไนไฝฟ็จ Smoke ๆจกๅ๏ผ่ฟๅฏไปฅๅฎ็ฐ SDK ๅ Smoke ๆฅๅฟๅฎไพๆ่ฝฝๅฐๅฏนๆนๆฅๅฟๅฎไพไธ๏ผๅฎ็ฐๆฅๅฟ่พๅบๆ ผๅผ็็ปไธ๏ผ
public void testAttachPrinter() throws Exception {
SubSmoke subSmoke = new SubSmoke(InstrumentationRegistry.getContext(),"Smoke",null);
subSmoke.attach(new Printer() {
@Override
public void println(int priority, String tag, String message) {
Log.println(priority,tag,"Smoke Printer: Hello");
Log.println(priority,tag,message);
}
});
subSmoke.debug("Hello, Printer!");
}
public void testAttachSub() throws Exception {
SubSmoke subSmoke = new SubSmoke(InstrumentationRegistry.getContext(),"SmokeParent",null);
subSmoke.getProcesses().addCollector(new Smoke.Process() {
@Override
public boolean proceed(Smoke.LogBean logBean, List<String> messages, Chain chain) {
messages.add(0,"Smoke A: Hello, Smoke B.");
return chain.proceed(logBean,messages);
}
});
SubSmoke subSmoke1 = new SubSmoke(InstrumentationRegistry.getContext(),"smokeChild",null);
subSmoke1.attach(subSmoke);
subSmoke1.info("Hello,Smoke.");
}
Smoke ไฝฟ็จ็ฑปๅๅๆนๆณๅไฝไธบ LOG ็ TAG๏ผๅจ Proguard ๆททๆทๅ๏ผๆขๅค LOG ไธญ็็ฑปๅใๆนๆณๅ็ๆนๆณๅฆไธ:
- Linux/Mac ไธๆง่ก smoke-java ๅทฅ็จไธ็ smoke_retrace.sh:
./smoke_retrace.sh mapping_file log_file
ๆๆฏๅฎๆถ LOG ่งฃๆ:
adb logcat | ./smoke_retrace.sh mapping_file
2.ๅฆๅคไนๅฏ็ดๆฅไฝฟ็จ Proguard ็ retrace.sh (winไธไธบ retrace.bat๏ผๆง่กๅฆไธๅฝไปค:
retrace -regex ".*\\[%c.%m\\]\\s*\\[.*\\]\\s*|(?:\\s*%c:.*)|(?:.*at\\s+%c.%m\\s*\\(.*?(?::%l)?\\)\\s*)" mapping_path log_path
ๅฏนไบ็ฌฌไธๆน็ไธ่ฅฟ๏ผๆปๆฏ่ฆไฟๆ็ๆ็ๅไธไฟกไปปๅปไฝฟ็จ๏ผ ๆฅๅฟๆจกๅไฝไธบไธไธช้่ฆๅ็นๅฐ App ไธญ่ฏธๅคๅฐๆน็ๆจกๅ๏ผไธๆฆๆ Bug ๅ็ๅๅๆๆดๆข้ๆฑ๏ผๆดๆขๆฅๅฟๆจกๅๅฐๆฏไธไธชๆตฉๅคง็ๅทฅ็จ๏ผ
ไธบไบ่งฃๅณ่ฟไธช้ฎ้ข๏ผSmoke ่ฎพ่ฎกไนๆถไนๅฐฝๅ่ฟ่กไบๆฅๅฃๅๅฎ็ฐ็ๅ็ฆป,้ไฝๅๆ Bug ๆๆฏ้ๆฑๅๆด็ไฟฎๆนๆๆฌ๏ผ
-
Smoke ๅบๅ Smoke ๅ SubSmoke ไธค้จๅ๏ผSmoke ๆฌ่บซไธบ็ฉบๆฅๅฃ็ฑป๏ผSubSmoke ๆๆฏๅ ทไฝๅฎ็ฐ๏ผ ๅฏนไบ App ๅบๆฏ๏ผๅผๅ่ ็ดๆฅไฝฟ็จ Smoke ็ฑปๆฅ่ฟ่กๆฅๅฟๆๅฐ๏ผ่ณไบๅ ถๆ ธๅฟ SubSmoke ๅฎไพๅๅฏไปฅ้ๆถๆดๆข๏ผ
-
SubSmoke ไฝไธบๆฅๅฟๆๅฐ็ๅ ทไฝๅฎ็ฐ๏ผๅ ถๅ ้จๆฌ่บซไนๆฒกๆๅคชๅค้ป่พ๏ผๅ ถไธป่ฆๆ ธๅฟๅฎ็ฐๅไพ่ตไบๅคไธช Process ็็ปๅ้ ็ฝฎใ ๅฆๆๅฎ่ทตไธญๅ็ฐๆไธช Process ๆBug๏ผๅผๅ่ ๅฎๅ จๅฏไปฅ็งป้คๆไฟฎๆน่ฏฅ Process๏ผไธ้่ฆ็ญ็ญไฝ่ ไฟฎๆนๅๅธๆฐ็็ๆฌ๏ผ
็ปผไธไธคไธชๆนๆก๏ผๆๅคงๅ้ไฝ Smoke ๅ ๆฌ่บซ Bug ๆๅๆไธ้็จ้่ฆๅคง่งๆจกๆฟๆข็ๆ ๅตๅๆๆฌ๏ผ
Smoke ๅจๅๆๆต่ฏๆ้็ๆ ๅตไธ้พไปฅไฟ่ฏ็จณๅฎๆง๏ผไธบไบ้ไฝ่ฏ้ๆๆฌ๏ผSmoke่ชๅธฆไบไธไธช่ช่บซๅผๅธธๅ่ชๅจ็ฆ็จ็ๅฐ็ญ็ฅ;
Copyright 2016-2017 Mingyuans
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.