All Projects โ†’ mingyuans โ†’ Smoke

mingyuans / Smoke

Licence: Apache-2.0 license
A pure, flexible, extendable log library for Android.

Programming Languages

C++
36643 projects - #6 most used programming language
java
68154 projects - #9 most used programming language
c
50402 projects - #5 most used programming language
python
139335 projects - #7 most used programming language
CMake
9771 projects
shell
77523 projects

Projects that are alternatives of or similar to Smoke

Meteor-logger-file
๐Ÿ”– Meteor Logging: Store application log messages into file (FS)
Stars: โœญ 24 (+100%)
Mutual labels:  logger
GoogleCloudLogging
Swift (Darwin) library for logging application events in Google Cloud.
Stars: โœญ 24 (+100%)
Mutual labels:  logger
beautiful logger
Yet another logger API in Java with beautiful features
Stars: โœญ 60 (+400%)
Mutual labels:  logger
logger
Gin middleware/handler to logger url path using rs/zerolog
Stars: โœญ 119 (+891.67%)
Mutual labels:  logger
sqlite micro logger arduino
Fast and Lean Sqlite database logger for Microcontrollers
Stars: โœญ 128 (+966.67%)
Mutual labels:  logger
Proglog
๐Ÿ“ Logs and progress bars manager for Python
Stars: โœญ 87 (+625%)
Mutual labels:  logger
turbo-log
Fast log message inserting for quick debug.
Stars: โœญ 66 (+450%)
Mutual labels:  logger
guzzle-log-middleware
A Guzzle middleware to log request and responses automatically
Stars: โœญ 61 (+408.33%)
Mutual labels:  logger
apollo-log
A logging extension for the Apollo GraphQL Server
Stars: โœญ 64 (+433.33%)
Mutual labels:  logger
liquibase-slf4j
Liquibase SLF4J Logger.
Stars: โœญ 42 (+250%)
Mutual labels:  logger
faraday-detailed logger
A detailed request and response logger for Faraday.
Stars: โœญ 56 (+366.67%)
Mutual labels:  logger
random-logger
Docker image for a random log generator.
Stars: โœญ 104 (+766.67%)
Mutual labels:  logger
ham-go
Amateur radio related code written in go
Stars: โœญ 24 (+100%)
Mutual labels:  logger
neptune-client
๐Ÿ“’ Experiment tracking tool and model registry
Stars: โœญ 348 (+2800%)
Mutual labels:  logger
Simple-Log
dnkpp.github.io/Simple-Log/
Stars: โœญ 13 (+8.33%)
Mutual labels:  logger
ShipBookSDK-Android
A logging system for Android
Stars: โœญ 19 (+58.33%)
Mutual labels:  logger
pio
Low-level package that provides an easy way to centralize different output targets. Supports colors and text decoration to all popular terminals
Stars: โœญ 21 (+75%)
Mutual labels:  logger
dry-logger
[WIP] Logging library
Stars: โœญ 16 (+33.33%)
Mutual labels:  logger
fluent-forward-go
A high-performance Go client for Fluentd and Fluent Bit
Stars: โœญ 26 (+116.67%)
Mutual labels:  logger
studio-log
๐Ÿ‘ป A tiny JSON logger with emoji support
Stars: โœญ 39 (+225%)
Mutual labels:  logger

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.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].