精华内容
下载资源
问答
  • Android 代码混淆 混淆方案

    千次阅读 2020-11-03 14:05:24
    请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地,打包完成以后而又不不可以了,导致了许多困惑,本片文章来问大家解决困惑,希望对大家有帮助...

    本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路。请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地,打包完成以后而又不不可以了,导致了许多困惑,本片文章来问大家解决困惑,希望对大家有帮助。

    Android混淆最佳实践

    1. 混淆配置

    android{
    
    buildTypes {
            release {
                buildConfigField "boolean", "LOG_DEBUG", "false" //不显示log
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.config
                }
            }
    }
    

    因为开启混淆会使编译时间变长,所以debug模式下不开启。我们需要做的是:
    1.将releaseminifyEnabled的值改为true,打开混淆;
    2.加上shrinkResources true,打开资源压缩。
    3.buildConfigField 不显示log日志
    4.signingConfig signingConfigs.config配置签名文件文件

    自定义混淆规则

    自定义混淆方案适用于大部分的项目

    #指定压缩级别
    -optimizationpasses 5
    
    #不跳过非公共的库的类成员
    -dontskipnonpubliclibraryclassmembers
    
    #混淆时采用的算法
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
    
    #把混淆类中的方法名也混淆了
    -useuniqueclassmembernames
    
    #优化时允许访问并修改有修饰符的类和类的成员 
    -allowaccessmodification
    
    #将文件来源重命名为“SourceFile”字符串
    -renamesourcefileattribute SourceFile
    #保留行号
    -keepattributes SourceFile,LineNumberTable
    #保持泛型
    -keepattributes Signature
    
    #保持所有实现 Serializable 接口的类成员
    -keepclassmembers class * implements java.io.Serializable {
        static final long serialVersionUID;
        private static final java.io.ObjectStreamField[] serialPersistentFields;
        private void writeObject(java.io.ObjectOutputStream);
        private void readObject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }
    
    #Fragment不需要在AndroidManifest.xml中注册,需要额外保护下
    -keep public class * extends android.support.v4.app.Fragment
    -keep public class * extends android.app.Fragment
    
    # 保持测试相关的代码
    -dontnote junit.framework.**
    -dontnote junit.runner.**
    -dontwarn android.test.**
    -dontwarn android.support.test.**
    -dontwarn org.junit.**
    

    真正通用的、需要添加的就是上面这些,除此之外,需要每个项目根据自身的需求添加一些混淆规则:

    第三方库所需的混淆规则。正规的第三方库一般都会在接入文档中写好所需混淆规则,使用时注意添加。

    在运行时动态改变的代码,例如反射。比较典型的例子就是会与 json 相互转换的实体类。假如项目命名规范要求实体类都要放在model包下的话,可以添加类似这样的代码把所有实体类都保持住:-keep public class **.*Model*.** {*;}

    JNI中调用的类。

    WebViewJavaScript调用的方法

    Layout布局使用的View构造函数、android:onClick等。

    检查混淆结果

    混淆过的包必须进行检查,避免因混淆引入的bug
    一方面,需要从代码层面检查。使用上文的配置进行混淆打包后在<module-name>/build/outputs/mapping/release/目录下会输出以下文件:

    dump.txt
    

    描述APK文件中所有类的内部结构

    mapping.txt
    

    提供混淆前后类、方法、类成员等的对照表

    seeds.txt
    

    列出没有被混淆的类和成员

    usage.txt
    

    列出被移除的代码
    我们可以根据 seeds.txt 文件检查未被混淆的类和成员中是否已包含所有期望保留的,再根据 usage.txt文件查看是否有被误移除的代码。
    另一方面,需要从测试方面检查。将混淆过的包进行全方面测试,检查是否有 bug 产生。

    解出混淆栈

    混淆后的类、方法名等等难以阅读,这固然会增加逆向工程的难度,但对追踪线上 crash 也造成了阻碍。我们拿到 crash 的堆栈信息后会发现很难定位,这时需要将混淆反解。

    <sdk-root>/tools/proguard/路径下有附带的的反解工具(Window 系统为proguardgui.bat,Mac 或 Linux 系统为proguardgui.sh)。

    这里以 Window 平台为例。双击运行 proguardgui.bat 后,可以看到左侧的一行菜单。点击 ReTrace,选择该混淆包对应的 mapping 文件(混淆后在 <module-name>/build/outputs/mapping/release/ 路径下会生成 mapping.txt 文件,它的作用是提供混淆前后类、方法、类成员等的对照表),再将 crashstack trace 黏贴进输入框中,点击右下角的 ReTrace ,混淆后的堆栈信息就显示出来了。

    以上使用 GUI 程序进行操作,另一种方式是利用该路径下的 retrace 工具通过命令行进行反解,命令是

    retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
    

    例如:

    retrace.bat -verbose mapping.txt obfuscated_trace.txt
    

    注意事项:

    所有在 AndroidManifest.xml 涉及到的类已经自动被保持,因此不用特意去添加这块混淆规则。(很多老的混淆文件里会加,现在已经没必要)

    proguard-android.txt已经存在一些默认混淆规则,没必要在 proguard-rules.pro 重复添加

    混淆简介
    Android中的“混淆”可以分为两部分,一部分是Java 代码的优化与混淆,依靠 proguard混淆器来实现;另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源(资源压缩严格意义上跟混淆没啥关系,但一般我们都会放一起用)。

    代码压缩
    在这里插入图片描述
    代码混淆是包含了代码压缩、优化、混淆等一系列行为的过程。如上图所示,混淆过程会有如下几个功能:

    压缩。移除无效的类、类成员、方法、属性等;
    优化。分析和优化方法的二进制代码;根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。
    混淆。把类名、属性名、方法名替换为简短且无意义的名称;
    预校验。添加预校验信息。这个预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度。
    这四个流程默认开启。

    Android项目中我们可以选择将“优化”和“预校验”关闭,对应命令是-dontoptimize、-dontpreverify(当然,默认的 proguard-android.txt文件已包含这两条混淆命令,不需要开发者额外配置)。

    资源压缩

    资源压缩将移除项目及依赖的库中未被使用的资源,这在减少apk 包体积上会有不错的效果,一般建议开启。具体做法是在 build.grade文件中,将shrinkResources属性设置为true。需要注意的是,只有在用minifyEnabled true开启了代码压缩后,资源压缩才会生效。

    资源压缩包含了“合并资源”和“移除资源”两个流程。

    “合并资源”流程中,名称相同的资源被视为重复资源会被合并。需要注意的是,这一流程不受shrinkResources属性控制,也无法被禁止,gradle必然会做这项工作,因为假如不同项目中存在相同名称的资源将导致错误。gradle 在四处地方寻找重复资源:

    src/main/res/ 路径
    不同的构建类型(debug、release等等)
    不同的构建渠道
    项目依赖的第三方库
    合并资源时按照如下优先级顺序

    依赖 -> main -> 渠道 -> 构建类型
    

    假如重复资源同时存在于main文件夹和不同渠道中,gradle 会选择保留渠道中的资源。

    同时,如果重复资源在同一层次出现,比如src/main/res/src/main/res2/,则 gradle无法完成资源合并,这时会报资源合并错误。

    “移除资源”流程则见名知意,需要注意的是,类似代码,混淆资源移除也可以定义哪些资源需要被保留,这点在下文给出。

    自定义混淆规则

    在上文“混淆配置”中有这样一行代码

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    

    这行代码定义了混淆规则由两部分构成:位于 SDKtools/proguard/ 文件夹中的 proguard-android.txt 的内容以及默认放置于模块根目录的 proguard-rules.pro 的内容。前者是 SDK 提供的默认混淆文件,后者是开发者自定义混淆规则的地方。

    常见的混淆指令

    • optimizationpasses
    • dontoptimize
    • dontusemixedcaseclassnames
    • dontskipnonpubliclibraryclasses
    • dontpreverify
    • dontwarn
    • verbose
    • optimizations
    • keep
    • keepnames
    • keepclassmembers
    • keepclassmembernames
    • keepclasseswithmembers
    • keepclasseswithmembernames

    更多详细的请到官网

    需要特别介绍的是与保持相关元素不参与混淆的规则相关的几种命令:

    命令作用
    -keep防止类和成员被移除或者被重命名
    -keepnames防止类和成员被重命名
    -keepclassmembers防止成员被移除或者被重命名
    -keepnames防止成员被重命名
    -keepclasseswithmembers防止拥有该成员的类和成员被移除或者被重命名
    -keepclasseswithmembernames防止拥有该成员的类和成员被重命名

    保持元素不参与混淆的规则

      [保持命令] [] {
        [成员] 
    }
    

    “类”代表类相关的限定条件,它将最终定位到某些符合该限定条件的类。它的内容可以使用:

    • 具体的类
    • 访问修饰符(public、protected、private
    • 通配符*,匹配任意长度字符,但不含包名分隔符(.)
    • 通配符**,匹配任意长度字符,并且包含包名分隔符(.)
    • extends,即可以指定类的基类
    • implement,匹配实现了某接口的类
    • $,内部类

    “成员”代表类成员相关的限定条件,它将最终定位到某些符合该限定条件的类成员。它的内容可以使用:

    • 匹配所有构造器
    • 匹配所有域
    • 匹配所有方法
    • 通配符*,匹配任意长度字符,但不含包名分隔符(.)
    • 通配符**,匹配任意长度字符,并且包含包名分隔符(.)
    • 通配符***,匹配任意参数类型
    • …,匹配任意长度的任意类型参数。比如void test(…)就能匹配任意 void test(String a) 或者是 void test(int a, String b) 这些方法。
    • 访问修饰符(public、protected、private)

    举个例子,假如需要将com.biaobiao.test包下所有继承Activity的public类及其构造函数都保持住,可以这样写:

     -keep public class com.biaobiao.test.** extends Android.app.Activity {
        <init>
    }
    

    常用自定义混淆规则

    • 不混淆某个类
    -keep public class com.biaobiao.example.Test { *; }
    
    • 不混淆某个包所有的类
    -keep class com.biaobiao.test.** { *; }
    }
    
    • 不混淆某个类的子类
    -keep public class * extends com.biaobiao.example.Test { *; }
    
    
    • 不混淆所有类名中包含了“model”的类及其成员
    -keep public class * extends com.biaobiao.example.Test { *; }
    
    • 不混淆某个接口的实现
    -keep class * implements com.biaobiao.example.TestInterface { *; }
    
    • 不混淆某个类的构造方法
    -keepclassmembers class com.biaobiao.example.Test { 
        public <init>(); 
    }
    
    • 不混淆某个类的特定的方法
    -keepclassmembers class com.biaobiao.example.Test { 
        public void test(java.lang.String); 
    }
    }
    
    • 不混淆某个类的内部类
    -keep class com.biaobiao.example.Test$* {
            *;
     }
    

    自定义资源保持规则

    1. keep.xml
    shrinkResources true开启资源压缩后,所有未被使用的资源默认被移除。假如你需要定义哪些资源必须被保留,在 res/raw/ 路径下创建一个 xml 文件,例如keep.xml

    通过一些属性的设置可以实现定义资源保持的需求,可配置的属性有:

    • keep 定义哪些资源需要被保留(资源之间用“,”隔开)
    • discard 定义哪些资源需要被移除(资源之间用“,”隔开)
    • shrinkMode 开启严格模式
    • 当代码中通过Resources.getIdentifier() 用动态的字符串来获取并使用资源时,普通的资源引用检查就可能会有问题。例如,如下代码会导致所有以“img_”开头的资源都被标记为已使用。
      当代码中通过 Resources.getIdentifier() 用动态的字符串来获取并使用资源时,普通的资源引用检查就可能会有问题。例如,如下代码会导致所有以“img_”开头的资源都被标记为已使用。
    String name = String.format("img_%1d", angle + 1);
    res = getResources().getIdentifier(name, "drawable", getPackageName());
    

    我们可以设置 tools:shrinkModestrict来开启严格模式,使只有确实被使用的资源被保留。

    以上就是自定义资源保持规则相关的配置,举个例子:

    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
        tools:discard="@layout/unused2"
        tools:shrinkMode="strict"/>
    

    移除替代资源
    一些替代资源,例如多语言支持的 strings.xml,多分辨率支持的 layout.xml 等,在我们不需要使用又不想删除掉时,可以使用资源压缩将它们移除。

    我们使用 resConfig 属性来指定需要支持的属性,例如
    一些替代资源,例如多语言支持的strings.xml,多分辨率支持的 layout.xml等,在我们不需要使用又不想删除掉时,可以使用资源压缩将它们移除。

    我们使用 resConfig属性来指定需要支持的属性,例如

    android {
        defaultConfig {
            ...
            resConfigs "en", "fr"
        }
    }
    

    其他未显式声明的语言资源将被移除。

    最后附上一个我在实际项目中的混淆方案
    proguard-android.txt文件内容

    # 代码混淆压缩比,在0~7之间
    -optimizationpasses 5
    # 混合时不使用大小写混合,混合后的类名为小写
    -dontusemixedcaseclassnames
    # 指定不去忽略非公共库的类
    -dontskipnonpubliclibraryclasses
    # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
    -dontpreverify
    -verbose
    # 避免混淆泛型
    -keepattributes Signature
    
    # 保留Annotation不混淆
    -keepattributes *Annotation*,InnerClasses
    #google推荐算法
    -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
    # 避免混淆Annotation、内部类、泛型、匿名类
    -keepattributes *Annotation*,InnerClasses,Signature,EnclosingMethod
    # 重命名抛出异常时的文件名称
    -renamesourcefileattribute SourceFile
    # 抛出异常时保留代码行号
    -keepattributes SourceFile,LineNumberTable
    # 处理support包
    -dontnote android.support.**
    -dontwarn android.support.**
    # 保留继承的
    -keep public class * extends android.support.v4.**
    -keep public class * extends android.support.v7.**
    -keep public class * extends android.support.annotation.**
    
    # 保留R下面的资源
    -keep class **.R$* {*;}
    # 保留四大组件,自定义的Application等这些类不被混淆
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Appliction
    -keep public class * extends android.app.Service
    -keep public class * extends android.content.BroadcastReceiver
    -keep public class * extends android.content.ContentProvider
    -keep public class * extends android.preference.Preference
    -keep public class com.android.vending.licensing.ILicensingService
    
    # 保留在Activity中的方法参数是view的方法,
    # 这样以来我们在layout中写的onClick就不会被影响
    -keepclassmembers class * extends android.app.Activity{
        public void *(android.view.View);
    }
    # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
    -keepclassmembers class * {
        void *(**On*Event);
        void *(**On*Listener);
    }
    # 保留本地native方法不被混淆
    -keepclasseswithmembernames class * {
        native <methods>;
    }
    
    # 保留枚举类不被混淆
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    # 保留Parcelable序列化类不被混淆
    -keep class * implements android.os.Parcelable {
        public static final android.os.Parcelable$Creator *;
    }
    
    -keepclassmembers class * implements java.io.Serializable {
       static final long serialVersionUID;
       private static final java.io.ObjectStreamField[]   serialPersistentFields;
       private void writeObject(java.io.ObjectOutputStream);
       private void readObject(java.io.ObjectInputStream);
       java.lang.Object writeReplace();
       java.lang.Object readResolve();
    }
    #assume no side effects:删除android.util.Log输出的日志
    -assumenosideeffects class android.util.Log {
        public static *** v(...);
        public static *** d(...);
        public static *** i(...);
        public static *** w(...);
        public static *** e(...);
    }
    #保留Keep注解的类名和方法
    -keep,allowobfuscation @interface android.support.annotation.Keep
    -keep @android.support.annotation.Keep class *
    -keepclassmembers class * {
        @android.support.annotation.Keep *;
    }
    #3D 地图 V5.0.0之前:
    
    -dontwarn com.amap.api.**
    -dontwarn com.autonavi.**
    -keep class com.amap.api.**{*;}
    -keep class com.autonavi.**{*;}
    
    -keep   class com.amap.api.maps.**{*;}
    -keep   class com.autonavi.amap.mapcore.*{*;}
    -keep   class com.amap.api.trace.**{*;}
    
    #3D 地图 V5.0.0之后:
    -keep   class com.amap.api.maps.**{*;}
    -keep   class com.autonavi.**{*;}
    -keep   class com.amap.api.trace.**{*;}
    
    #定位
    -keep class com.amap.api.location.**{*;}
    -keep class com.amap.api.fence.**{*;}
    -keep class com.autonavi.aps.amapapi.model.**{*;}
    
    #搜索
    -keep   class com.amap.api.services.**{*;}
    
    #2D地图
    -keep class com.amap.api.maps2d.**{*;}
    -keep class com.amap.api.mapcore2d.**{*;}
    
    #导航
    -keep class com.amap.api.navi.**{*;}
    -keep class com.autonavi.**{*;}
    # Retain generic type information for use by reflection by converters and adapters.
    -keepattributes Signature
    
    # Retain service method parameters when optimizing.
    -keepclassmembers,allowshrinking,allowobfuscation interface * {
        @retrofit2.http.* <methods>;
    }
    
    # Ignore annotation used for build tooling.
    -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
    
    # Ignore JSR 305 annotations for embedding nullability information.
    -dontwarn javax.annotation.**
    
    # JSR 305 annotations are for embedding nullability information.
    -dontwarn javax.annotation.**
    
    # A resource is loaded with a relative path so the package of this class must be preserved.
    -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
    
    # Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
    -dontwarn org.codehaus.mojo.animal_sniffer.*
    
    # OkHttp platform used only on JVM and when Conscrypt dependency is available.
    -dontwarn okhttp3.internal.platform.ConscryptPlatform
    
    #fastjson混淆
    -keepattributes Signature
    -dontwarn com.alibaba.fastjson.**
    -keep class com.alibaba.**{*;}
    -keep class com.alibaba.fastjson.**{*; }
    -keep public class com.ninstarscf.ld.model.entity.**{*;}
    
    

    原文地址

    所有文章参考:

    展开全文
  • android 代码重启app

    千次阅读 2019-06-21 08:58:41
    android 代码重启app方法完事 方法 /** * 重启app * @param context */ public static void restartApp(Context context) { PackageManager packageManager = context.getPackageManager(); ...

    android 代码重启app

    方法

        /**
         * 重启app
         * @param context
         */
        public static void restartApp(Context context) {
            PackageManager packageManager = context.getPackageManager();
            if (null == packageManager) {
                LogUtils.errorLog("null == packageManager");
                return;
            }
            final Intent intent = packageManager.getLaunchIntentForPackage(context.getPackageName());
            if (intent != null) {
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                context.startActivity(intent);
            }
        }
    

    完事

    展开全文
  • Android 代码 空格处理

    千次阅读 2019-03-12 11:06:35
    &amp;#32; == 普通的英文半角空格 &amp;#160; == &amp;nbsp; == &amp;#xA0; == no-break space (普通的英文半角空格但不换行) &amp;#12288; == 中文全角空格 (一个中文宽度) ......

    &#32; == 普通的英文半角空格

    &#160; == &nbsp; == &#xA0; == no-break space (普通的英文半角空格但不换行)

    &#12288; == 中文全角空格 (一个中文宽度)

    &#8194; == &ensp; == en空格 (半个中文宽度)

    &#8195; == &emsp; == em空格 (一个中文宽度)

    &#8197; == 四分之一em空格 (四分之一中文宽度)

    相比平时的空格(&#32;),nbsp拥有不间断(non-breaking)特性。即连续的nbsp会在同一行内显示。即使有100个连续的nbsp,浏览器也不会把它们拆成两行。

    使用如:

     

    &#8230; 是“...”占位符

    <string name="user_profile_user_name">姓名&#8195;&#8195;</string>
        <!--&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-->

    相当于后面补两个空格

    展开全文
  • android代码动态添加View

    千次阅读 2018-11-23 13:38:20
    @Override protected void onCreate(Bundle savedInstanceState) { ... //Java代码中动态的生成View //首先我们在onCreate方法中创建一个Button实例: Button button = new Button(this);...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Java代码中动态的生成View
    
        //首先我们在onCreate方法中创建一个Button实例:
        Button button = new Button(this);
        //创建了Button实例下面我们就要指定它在哪个界面中显示:
        //首先第一步找到我们要显示的界面:
        //首先把setContentView()删掉(后文会讲)。
    
    
    
    
        //LayoutInflate使用来找到一个布局文件:需要先写一个XML布局
        ViewGroup inflate = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.alayout, null);
        //下一步就是要把我们的Button添加到RelativLayout中了
        //使用ViewGroup的addView方法:
          inflate.addView(button);
          
          button.setBackground(new ColorDrawable(Color.RED));
        button.setText("HelloWord");
        button.setId(200);
            //设置的大小
       // RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(100, 100);
        //用Math以及Wrap设置大小
        RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
      //  为什么没有效果呢,因为定义了LayoutParam但是没有指定哪一个View因此还需要添加一句
    
      button.setLayoutParams(params);
    

    // // 、设置位置信息
    // 使Button居中显示,
    // addRules()设置位置:

       params.addRule(RelativeLayout.CENTER_IN_PARENT);
       // addRules
    
       // addRule(int verb)   verb我们很好理解,就是各种规定位置的参数
       // addRule(int verb, int anchor)   ancher为ID
    
    
    
        Button button1 = new Button(this);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    
        layoutParams.addRule(RelativeLayout.ABOVE,200);
        button1.setLayoutParams(layoutParams);
        button1.setBackground(new ColorDrawable(Color.BLUE));
        button1.setText("袁静慈");
    
        inflate.addView(button1);
        setContentView(inflate);
    }
    

    }

    展开全文
  • 第一章 开始启程,你的第一行Android代码1.1.Android简介 1.1.1.Android系统架构 自下而上:Linux内核层(为硬件提供底层驱动。eg:显示驱动、音频驱动等)、系统运行时层(C/C++库和android运行时库,前者有Sqlite...
  • Android代码混淆之混淆规则

    万次阅读 多人点赞 2015-02-18 14:51:44
    因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看。  ProGuard是一个免费的Java类文件收缩,优化,...
  • 对《第一行代码》第一章学习后,进行归纳总结。主要涉及到知识点有:Android系统架构、Android已发布的版本、Android Studio 的下载和开发环境的搭建、新建模拟器、创建Android项目的步骤。
  • Android 代码模拟物理按键

    万次阅读 2018-10-15 17:54:08
    开发中有遇到这样的情况,物理按键个数有限, 想用代码模拟其他物理按键输入,这里用了shell 命令在程序运行时环境里模拟按键事件。 因命令执行会阻塞线程, 所以最好是在子线程里执行命令: new Thread(){ @...
  • Shape 能够绘制:line 线性oval 椭圆形rectangle 矩形ring 环形那么话不多说,我直接上xml和java代码之间的对应 xml当中Shape: &lt;?xml version="1.0" encoding="utf-8"?&gt; &...
  • Android 代码中修改控件宽高

    千次阅读 2018-05-16 10:08:17
    不要在o nCreate()和onResume()方法中测量控件的宽高,不然得到的数据都是0,可以在onWindowFocusChanged()方法中测量@Override public void onWindowFocusChanged(boolean hasFocus) { super....
  • Android 代码设置启动模式

    千次阅读 2018-01-09 21:36:36
    今天这里需要用代码设置一个Intent,如果和上面一致应该也是设置一个SingleTask之类的FLAG. 但是我们没有在Intent中找到SINGLETASK的FALG,我们找到了一个FLAG_ACTIVITY_SINGLE_TOP,从注释看If set, the ...
  • MyGPS for Android代码

    千次下载 热门讨论 2013-04-14 10:47:51
    一个简单的Android下GPS定位的程序 增加了卫星数量和定位卫星数量的显示,修改了定位精度,使手机通AGPS定位能更快一点
  • Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 &lt;TextView android:id="@+id/uppaid_time" android:layout_width="wrap_content" android:...
  • Android 代码检查工具SonarQube

    万次阅读 2014-12-26 14:51:03
    代码检查工具能帮我们检查一些隐藏的bug,代码检查工具中sonar是比较好的一个。官网Sonar 概述 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成...
  • 通常我们可以使用Android studio自带的terminal工具运行先adb shell 命令来进行这样不好的就是我们可能有的操作就要每次设备重启的时候都要手动的敲一遍这样的代码,十分麻烦。那么怎么才能
  • Android 代码实现屏幕截图功能

    千次阅读 2017-02-08 17:10:21
    private void screenshot() { // 获取屏幕 View dView = getWindow().getDecorView(); dView.setDrawingCacheEnabled(true); dView.buildDrawingCache(); Bitmap bmp = dView.getDrawingCache();
  • android代码获取layout和设置margin

    千次阅读 2017-03-03 13:44:13
    0x0001 原因需要动态设置一个textview的高度0x0002 codemsgTextView = (TextView) rootView.findViewById(R.id.scanning_status_msg); LayoutParams attributeSet = (LayoutParams) msgTextView.getLayoutParams();
  • Android 代码中获取颜色 Color

    万次阅读 2017-07-25 09:24:19
    tv_color.setTextColor(0x123456) // 这个6.0 的已经过时了 resources.getColor(R.color.abc_btn_colored_text_material); // 6.0 以上的 this.getColor(R.color.abc_background_cache_hint_sele
  • Android代码中设置字体大小

    万次阅读 多人点赞 2016-05-31 15:19:10
    android:textSize="@dimen/x40" 26.66px 然后在代码中想动态改变字体大小,于是直接用了 textView.setTextSize(TgetResources().getDimension(R.dimen.x45)); 发现字体变得巨大。。。。 后来才发现setText()...
  • 设置ImageView的src: image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); String path=Environment.getExternalStorageDirectory()+File.separator+”test.jpg”; Bitmap bm = BitmapFactory...
  • Android 代码中设置控件的style

    万次阅读 2016-07-01 13:08:22
    text">  bold  16sp xml使用: style="@style/text_style" ...android:layout_width="wrap_content" ...android:layout_height="wrap_content" ...java代码使用: TextView tx
  • Android代码中设置字体颜色的方法

    万次阅读 2018-07-16 16:22:40
    TextView txt=(TextView) findViewById...txt.setTextColor(android.graphics.Color.RED); // 系统自带的颜色类 //第2种: txt.setTextColor(android.graphics.Color.parseColor("#87CEFA")); // 使用Co...
  • Android 通过代码读取PC端共享文件夹 准备: 1 android端:SMB/CIFS协议 百度百科 2.PC端:(1)设置一个共享文件夹,权限是所有人 (2)要关闭防火墙!!! 要关闭防火墙!!! 要关闭防火墙!!! 开发: ...
  • Android 代码中实现返回键功能

    千次阅读 2015-12-11 11:58:35
    代码里实现返回键刚才自己的项目里用到了 有两种办法: 采用Runtime /** * Allows Java applications to interface with the environment in which they are running. Applications can not create an instance of
  • Drawable drawable= getResources().getDrawable(R.drawable.drawable); /// 这一步必须要做,否则不会显示. drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());...
  • Android 代码设置Color的几种方式

    万次阅读 2018-12-08 14:38:51
    tx.setTextColor(android.graphics.Color.RED); 利用数字设置 tx.setTextColor(0xffff00f); 利用xml中已经定义好的颜色代码 tx.setTextColor(getResources().getColor(R.color.red)); 利用16进制 字符串 tx....
  • Android代码规范内容非常多,但对我们最有用& 最有影响的莫过于 Android代码的命名规范 可是,有很多人容易忽略Android代码的命名规范,从而导致代码的可读性 & 维护性非常差,最终导致开发效率 & ...
  • 内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是就写了一下查看数据库表的方法代码代码实现import ...
  • Android 代码设置开机自启动App

    万次阅读 2017-07-07 17:20:19
    代码如下: 创建一个监听。 /** * create by:sunlei on 2017/7/7 15:48 * e-mail:872822645@qq.com * introduce: */ public class ContentReceiver extends BroadcastReceiver { @Overr
  • Android 代码中动态改变Shape

    千次阅读 2016-07-04 14:55:46
    在布局中,我们经常应用Shape来进行一些布局的优化,但有时候我们需要在代码中来进行修改我们引用的Shape.很简单,代码如下: RelativeLayout groupRankLayout = (RelativeLayout) findViewById(R.id.group_rank_layout)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,296,172
精华内容 518,468
关键字:

android代码