build.gradle dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'org.apache.bcel:bcel:6.1' }
<FindbugsPlugin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://findbugs.googlecode.com/svn-history/r13379/trunk/findbugs/etc/findbugsplugin.xsd" pluginid="ru.sberbank.android.log.plugin" provider="Find Android.Util.Log class" defaultenabled="true" website="https://find-sec-bugs.imtqy.com"> <Detector class="ru.sbt.detector.AndroidLogCallDetector"/> <BugPattern type="ANDROID_LOG_CALL_DETECTED" abbrev="ANDR_LOG" category="CORRECTNESS"/> </FindbugsPlugin>
<MessageCollection> <Detector class="ru.sbt.detector.AndroidLogCallDetector"> <Details>ANDROID_LOG_CALL_DETECTED alala.</Details> </Detector> <BugPattern type="ANDROID_LOG_CALL_DETECTED"> <ShortDescription>android.util.Log usage detected !</ShortDescription> <LongDescription>android.util.Log usage detected !</LongDescription> <Details> <![CDATA[ <p> Please not use android.util.Log ! Use 'ru.sberbank.mobile.core.log.Logger' instead. ]]> </Details> </BugPattern> <BugCode abbrev="ANDR_LOG">android.util.Log usage detected !</BugCode> </MessageCollection>
javap -c LoginActivity.class Compiled from "LoginActivity.java" public class ru.sbrf.testandroidapp.LoginActivity extends android.support.v7.app.AppCompatActivity implements android.app.LoaderManager$LoaderCallbacks<android.database.Cursor> { public ru.sbrf.testandroidapp.LoginActivity(); protected void onCreate(android.os.Bundle); Code: 0: aload_0 1: aload_1 2: invokespecial #10 // Method android/support/v7/app/AppCompatActivity.onCreate:(Landroid/os/Bundle;)V 5: ldc #11 // String aaa 7: ldc #12 // String bbb 9: invokestatic #13 // Method android/util/Log.d:(Ljava/lang/String;Ljava/lang/String;)I 12: pop 13: aload_0 14: ldc #15 // int 2130968603 16: invokevirtual #16 // Method setContentView:(I)V
public class AndroidLogCallDetector extends BytecodeScanningDetector implements StatelessDetector { public static final String BUG_TYPE = "ANDROID_LOG_CALL_DETECTED"; public static final String ANDROID_UTIL_LOG = "android/util/Log"; public static final String ALLOWED_LOGER_CLASS = "ru.sberbank.mobile.core.log.Logger"; private final BugReporter bugReporter; private String clsName; public AndroidLogCallDetector(BugReporter bugReporter) { this.bugReporter = bugReporter; } @Override public void visitClassContext(ClassContext classContext) { JavaClass cls = classContext.getJavaClass(); clsName = cls.getClassName(); //skip allowed logger class if (!ALLOWED_LOGER_CLASS.equals(clsName)) { super.visitClassContext(classContext); } } @Override public void sawOpcode(int seen) { if (seen == Const.INVOKESTATIC && ANDROID_UTIL_LOG.equals(getClassConstantOperand())) { BugInstance bug = new BugInstance(this, BUG_TYPE, NORMAL_PRIORITY).addClassAndMethod(this) .addSourceLine(this); bugReporter.reportBug(bug); } } }
./gradlew jar
<i><?</i>xml version="1.0"<i>?></i> <!DOCTYPE module PUBLIC "Check Configuration" "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd"<i>></i> <module name="Checker"> <property name="charset" value="UTF-8" /> <property name="severity" value="warning" /> <module name="TreeWalker"> <module name="EqualsHashCode" /> <module name="CovariantEquals" /> <module name="MagicNumber" /> <module name="DeclarationOrder" /> <module name="JavadocMethod"> <property name="scope" value="public" /> <property name="allowMissingParamTags" value="true" /> <property name="allowMissingThrowsTags" value="true" /> <property name="allowMissingReturnTag" value="true" /> <property name="allowThrowsTagsForSubclasses" value="true" /> </module> <module name="LineLength"> <property name="max" value="160" /> <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://" /> </module> <module name="EmptyBlock"> <property name="option" value="TEXT" /> <property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH" /> </module> <module name="NeedBraces" /> <module name="MissingSwitchDefault" /> <module name="ModifierOrder" /> <module name="OverloadMethodsDeclarationOrder" /> </module> </module>
apply plugin: 'checkstyle' task checkstyle(type: Checkstyle) { configFile file("$project.rootDir/app/checkstyle.xml") source 'src/main/java' include '**/*.java' exclude '**/gen/**' exclude '**/R.java' exclude '**/BuildConfig.java' classpath = files() } tasks.withType(Checkstyle) { reports { xml.enabled false html.enabled true } }
20 static public double getCount(){ 21 if(true) Log.<i>i</i>("a","b"); 22 return 43.2*15.0; 23 }
Source: https://habr.com/ru/post/342634/
All Articles