Skip to content

A pure, flexible, extendable log library for Android.

License

Notifications You must be signed in to change notification settings

mingyuans/Smoke

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

LicenseBuild StatusDownload

็ฎ€ไป‹

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'

ๅˆๅง‹ๅŒ–&ไฝฟ็”จ

Java ๅนณๅฐ

Smoke.install("Smoke",null);

Smoke.debug("Hello,Smoke!");

Android ๅนณๅฐ

Smoke.install("Smoke",AndroidProcesses.androidDefault());

Smoke.debug("Hello,Smoke!");

Android ๅนณๅฐไธ‹ๆ—ฅๅฟ—ๆ–‡ไปถ่ฎฐๅฝ•

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
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

ๆ”ฏๆŒไธ”ๆŽจ่ไฝฟ็”จMessageFormatๅฝขๅผ็š„ๆ—ฅๅฟ—ๆ ผๅผๅŒ–๏ผ›

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
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

ๆ”ฏๆŒXML/JSON่‡ชๅŠจๅˆคๆ–ญๅนถๆ ผๅผๅŒ–ๆ‰“ๅฐ

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 ๅ’Œ ๆ—ฅๅฟ—้…็ฝฎ็ปงๆ‰ฟๅ…ณ็ณป

ๅคš็บง 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!
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

ๆ”ฏๆŒ AndroidStudio ไธญไปฃ็ ๅฎšไฝ

็‚นๅ‡ปๆ—ฅๅฟ—ไธญ้ซ˜ไบฎ็š„ๆ–‡ๅญ—ๅณๅฏ่ฎฉ AndrodiStudio ่ทณ่ฝฌๅˆฐ่ฏฅๆ—ฅๅฟ—ๆ‰“ๅฐไฝ็ฝฎ๏ผ› image

ๆ”ฏๆŒๆ—ฅๅฟ—็ญ‰็บง่ฟ‡ๆปค

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 ไฝฟ็”จ่€…ๅฏไปฅๆŽงๅˆถๆˆ‘ไปฌ 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.");
}

ๆททๆท†ๅŽ็š„ LOG ๆขๅค

Smoke ไฝฟ็”จ็ฑปๅๅ’Œๆ–นๆณ•ๅไฝœไธบ LOG ็š„ TAG๏ผŒๅœจ Proguard ๆททๆท†ๅŽ๏ผŒๆขๅค LOG ไธญ็š„็ฑปๅใ€ๆ–นๆณ•ๅ็š„ๆ–นๆณ•ๅฆ‚ไธ‹:

  1. 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

ๆŽฅๅฃๅ’Œๅฎž็Žฐๅˆ†็ฆป,้™ไฝŽ Bug ๅ’Œ ้œ€ๆฑ‚ๅ˜ๆ›ดๅธฆๆฅ็š„ไฟฎๆ”นๆˆๆœฌ

ๅฏนไบŽ็ฌฌไธ‰ๆ–น็š„ไธœ่ฅฟ๏ผŒๆ€ปๆ˜ฏ่ฆไฟๆŒ็€ๆ€€็–‘ๅ’ŒไธไฟกไปปๅŽปไฝฟ็”จ๏ผ› ๆ—ฅๅฟ—ๆจกๅ—ไฝœไธบไธ€ไธช้œ€่ฆๅŸ‹็‚นๅˆฐ App ไธญ่ฏธๅคšๅœฐๆ–น็š„ๆจกๅ—๏ผŒไธ€ๆ—ฆๆœ‰ Bug ๅ‘็”Ÿๅ’ŒๅŽๆœŸๆ›ดๆข้œ€ๆฑ‚๏ผŒๆ›ดๆขๆ—ฅๅฟ—ๆจกๅ—ๅฐ†ๆ˜ฏไธ€ไธชๆตฉๅคง็š„ๅทฅ็จ‹๏ผ›

ไธบไบ†่งฃๅ†ณ่ฟ™ไธช้—ฎ้ข˜๏ผŒSmoke ่ฎพ่ฎกไน‹ๆ—ถไนŸๅฐฝๅŠ›่ฟ›่กŒไบ†ๆŽฅๅฃๅ’Œๅฎž็Žฐ็š„ๅˆ†็ฆป,้™ไฝŽๅŽๆœŸ Bug ๆˆ–ๆ˜ฏ้œ€ๆฑ‚ๅ˜ๆ›ด็š„ไฟฎๆ”นๆˆๆœฌ๏ผš

  1. Smoke ๅบ“ๅˆ† Smoke ๅ’Œ SubSmoke ไธค้ƒจๅˆ†๏ผŒSmoke ๆœฌ่บซไธบ็ฉบๆŽฅๅฃ็ฑป๏ผŒSubSmoke ๆ‰ๆ˜ฏๅ…ทไฝ“ๅฎž็Žฐ๏ผ› ๅฏนไบŽ App ๅœบๆ™ฏ๏ผŒๅผ€ๅ‘่€…็›ดๆŽฅไฝฟ็”จ Smoke ็ฑปๆฅ่ฟ›่กŒๆ—ฅๅฟ—ๆ‰“ๅฐ๏ผ›่‡ณไบŽๅ…ถๆ ธๅฟƒ SubSmoke ๅฎžไพ‹ๅˆ™ๅฏไปฅ้šๆ—ถๆ›ดๆข๏ผ›

  2. SubSmoke ไฝœไธบๆ—ฅๅฟ—ๆ‰“ๅฐ็š„ๅ…ทไฝ“ๅฎž็Žฐ๏ผŒๅ…ถๅ†…้ƒจๆœฌ่บซไนŸๆฒกๆœ‰ๅคชๅคš้€ป่พ‘๏ผŒๅ…ถไธป่ฆๆ ธๅฟƒๅฎž็Žฐๅ‡ไพ่ต–ไบŽๅคšไธช Process ็š„็ป„ๅˆ้…็ฝฎใ€‚ ๅฆ‚ๆžœๅฎž่ทตไธญๅ‘็ŽฐๆŸไธช Process ๆœ‰Bug๏ผŒๅผ€ๅ‘่€…ๅฎŒๅ…จๅฏไปฅ็งป้™คๆˆ–ไฟฎๆ”น่ฏฅ Process๏ผŒไธ้œ€่ฆ็ญ‰็ญ‰ไฝœ่€…ไฟฎๆ”นๅ‘ๅธƒๆ–ฐ็š„็‰ˆๆœฌ๏ผ›

็ปผไธŠไธคไธชๆ–นๆกˆ๏ผŒๆœ€ๅคงๅŒ–้™ไฝŽ Smoke ๅ› ๆœฌ่บซ Bug ๆˆ–ๅŽๆœŸไธ้€‚็”จ้œ€่ฆๅคง่ง„ๆจกๆ›ฟๆข็š„ๆƒ…ๅ†ตๅ’Œๆˆๆœฌ๏ผ›

่‡ชๅธฆ็š„ๅฐ็ญ–็•ฅ

Smoke ๅœจๅ‰ๆœŸๆต‹่ฏ•ๆœ‰้™็š„ๆƒ…ๅ†ตไธ‹้šพไปฅไฟ่ฏ็จณๅฎšๆ€ง๏ผ›ไธบไบ†้™ไฝŽ่ฏ•้”™ๆˆๆœฌ๏ผŒSmoke่‡ชๅธฆไบ†ไธ€ไธช่‡ช่บซๅผ‚ๅธธๅŽ่‡ชๅŠจ็ฆ็”จ็š„ๅฐ็ญ–็•ฅ;

Licence

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.