在Android中,TextView是我们最常用的用来显示文本的控件。 一般情况下,TextView中的文本都是一个样式。... android.text.style.BackgroundColorSpan; import android.text.style.BulletSpan; import android.text.style.DrawableMarginSpan... android.text.style.ImageSpan; import android.text.style.RelativeSizeSpan; import android.text.style.ScaleXSpan...; import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; import android.text.style.SubscriptSpan... android.text.style.TypefaceSpan; import android.text.style.URLSpan; import android.text.style.UnderlineSpan
; import android.graphics.Typeface; import android.os.Bundle; import android.text.SpannableString; import...; import android.text.style.BackgroundColorSpan; import android.text.style.BulletSpan; import android.text.style.ForegroundColorSpan...; import android.text.style.RelativeSizeSpan; import android.text.style.ScaleXSpan; import android.text.style.StrikethroughSpan...; import android.text.style.StyleSpan; import android.text.style.SubscriptSpan; import android.text.style.SuperscriptSpan...; import android.text.style.TextAppearanceSpan; import android.text.style.TypefaceSpan; import android.text.style.URLSpan
4、JNI中的一些概念 natvie:Java语言中修饰本地方法的修饰符(也可以理解为关键字),被该修饰符修饰的方法没有方法体 Native方法:在Java语言中被native关键字修饰的方法是Native...在Java里,每一个一个process可以产生多个JavaVM对象,但是在android上,每一个process只有一个Dalvik虚拟机对象,也就是在android进程中是通过有且只有一个虚拟机对象来服务所有...* 因为我们没有真的启动虚拟机,它们都被存储在基本框架中并没有发布。 * 使用Push / Pop管理存储。...REG_JNI(register_android_graphics_Typeface), REG_JNI(register_android_graphics_Xfermode), REG_JNI...另外,ART虚拟机在GC算法有所优化,为了减少内存碎片化问题,在GC之后有可能会移动对象内存的位置,对于Java层程序并没有影响,但是对于JNI程序要注意了,对于通过指针来直接访问内存对象时,Dalvik
前言 这是我们系列自定义字体在Android上的第2篇文章。在之前,我们已经看到如何使用自定义字体并将不同的样式应用于TextView。...虽然在这篇文章中解释了使用多种字体的简单方法,但请谨慎行事。任何具有太多字体的UI都会变得混乱!通过XML直接设置字体非常方便,而不需要额外的Java代码。...第一步是在/values/文件夹中添加一个attrs.xml。内容如下所示: 在代码和XML中访问该属性。接下来,让我们在/values/strings.xml中添加我们要用作String资源的字体名称: <?...2、使用字体 - 属性 我们需要在xml文件中添加一行: xmlns:app="http://schemas.android.com/apk/res-auto" 在您的最高视图层次元素。
将生成的 Apk 文件使用 ApkTool 进行解包,之后在 Sublime Text 3 中打开,下面附上下载链接: 链接: https://pan.baidu.com/s/1EbZsk106YLV22TgoVkbhbw...tv_user_name" id="0x7f070085" /> .line 28 const v0, 0x7f070085 // invoke-virtual 调用带参数的虚拟方法.../MainActivity;)V // invoke-virtual/range {vx..vy}, 方法名 调用以寄存器范围为参数的虚拟方法。...ID 或字符串 const-string v1, "\r|\n" // 同上 const-string v2, "" // invoke-virtual{参数}, 方法名调用带参数的虚拟方法...,我们简单看下 onClick 中如何处理: // 调用 onClick 方法 传如 View # virtual methods .method public onClick(Landroid/view
文章目录 一、 图片质量压缩方法 二、 查找对应的 Native 方法源码 三、 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 【Android 内存优化】图片文件压缩 ( Android...Native 方法源码查找方法 : ① 文件名相同 : 一般情况下 Java 源码中的 Java 类的类名与对应的定义 Native 方法的 C++ 源码文件名称相同 ; ② 源码搜索 : 如果找不到...方法定义在 frameworks\base\core\jni\AndroidRuntime.cpp 中 , 在该方法中又调用了 libnativehelper\JNIHelp.cpp 中的 jniRegisterNativeMethods...方法 , 在该方法中调用了 JNIEnv 的 RegisterNatives 方法注册了这一批 Bitmap.java 的函数 ; 2....Bitmap.cpp 中完整动态注册代码 : 其中对关键代码进行了注释 ; // 调用的 register_android_graphics_Bitmap 注册函数方法定义在该头文件中 #include
1、将自定义字体应用于所有TextView 应用中我们会经常用到自定义字体的TextView。我们需要每次都去设置TextView的字体。...但是,如果您在整个应用程序中多次使用它,那么效率低下(多次分配fontface)和代码(重复相同的代码)是无效的。...> fontCache = new HashMap(); public static Typeface getTypeface(String fontname, Context context...现在,由于我们有一种访问我们的自定义字体的方法,我们来实现一个扩展TextView的类。 3、扩展TextView 接下来,我们将创建一个新的Java类,它扩展了TextView。...4、使用类 只需在XML视图中使用该类,它会自动使用您的自定义字体。没有必要的Java代码!
代码文件 MainActivity.java 在布局对应的文件中我们加入控件的加载和事件代码 ? ? 然后我们定义一个native的方法,用于实现NDK开发,如下图的 ?...刚建好时方法名为红色的,我们还是按ALT+ENTER,直接在C++的文件中自动生成对应的函数方法名。 ?...native-lib.cpp 由于在C++我们也用到了JAVA的Bitmap的类,所以我们在include里面要加入android/bitmap.h ?.../Bitmap$Config;)Landroid/graphics/Bitmap;"); jobject bitmap = env->CallStaticObjectMethod(java_bitmap_class.../Bitmap$Config;)Landroid/graphics/Bitmap;"); jobject bitmap = env->CallStaticObjectMethod(java_bitmap_class
近期开始关注手机安全了,以往都是在PC上玩,对这个领域也想了解一下,可是拿什么来开刀呢?.../text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z move-result v0 if-nez v0, :cond_0 这是一个非常关键的方法的实现...,我们看到该方法有两个参数,一个是AccessPoint类的对象,另一个是String字符串,方法的一开始就实例化了一个StringBuilder的对象,然后使用append不断的拼接该字符串,大概的拼接规则是这样的...;->show()V 这段代码就是使用AlertDialog类的一系列方法弹出对话框,把密码显示出来。...本例中的这个APK也是有报错的,好在还不多,都一一解决了。其实我本来想把资源报错这个问题的细节写进来,但其实这是个体力活!而且每款软件都不同,几乎没有借鉴意义。
在实际分析中,还可以使用IDA Pro直接分析APK文件,使用dex2jar与jd-gui配合进行Java源码级的分析等。这些分析方法会在本书后面的章节中详细介绍。...Android程序时,string.xml文件中的所有字符串资源都在gen//R.java文件的String类中标识,每个字符串都有唯一的int类型的索引值。...可以猜测:ApkTool内部使用baksmali将APK中的DEX文件反编译为smali文件,但ApkTool在反编译APK时没有处理instant-run.zip中的DEX文件,因此,在反汇编输出信息中没有程序真正的反汇编代码...可以在Android Studio中通过菜单项“File”→“Project Structure...”进行设置,更简单的方法是在buildTypes的release项下添加如下内容。...其中,->this$0是内部类MainActivity$1中的一个synthetic字段,存储的是父类MainActivity的引用。
test:目录名称 导入到Eclipse File -> Open Projects from File System 加壳或混淆过的apk提取出来的目录结构跟本案例的不同,本案例用的是没有加壳也没有混淆的...无法选中文本框 让用户无法选中指定的文本框,我用的方法是在xml文件里找到对应的控件里添加android:focusable="false"属性。..."@id/hosturl_textview" android:layout_width="150.0dip" android:layout_height="wrap_content" android:text...在EditText控件标签的最后添加android:focusable="false"属性,即可实现无法选中该文本框。...只要在程序中“捕捉”到这个消息,再启动之即可。记住,Android框架说:Don’t call me, I’ll call you back。
这要从dex的文件格式说起,在把源码编译、转化为dex文件格式时,dex文件中会有一个区域包含了所有源码中定义或引用的方法列表。这个区域中所有方法项的总数就是方法数。.../content/Intent;)V Method: startActivityForResult (Landroid/content/Intent;I)V 可以看出,这里面的方法是包含代码中引用的方法的...方法1 避免在内部类中访问外部类的私有方法/变量 当在Java内部类(包括内部匿名类)中访问外部类的私有方法/变量时,编译器会生成额外的方法,这也会增加方法数,建议编码时尽量避免。...,但是虚拟机却认为Foo和Foo$Inner是两个不同的类,为了支持Foo$Inner访问Foo的private成员,编译器会生成两个额外的方法,而生成的这些方法也算在方法总数里面 /*package*...方法2 避免调用派生类中的未被覆盖(override)的方法 考虑下面的代码 publicclass DemoActivity extends Activity { @Override
,特别是包名比较深的话,就更加明显了 声明Native方法的类需要用javah生成头文件, 在以前的开发中需要自己手动生成,现在是工具帮我们生成了而已 初次调用JIN方法时需要建立关联,影响效率,在建立关系的时候是全局搜索的...虚拟机就会找到这个函数并调用该函数,因此可以在该函数中做一些初始化的动作,其实这个函数就是相当于Activity中的onCreate()方法。...反射能做到的,在JNI中通过类似的反射也是可以做到的,这些方法原型在jni.h文件里面,比如 大家可以多去看看那些方法,基本上各种类型的方法都有,运行如下: 3 JNI数据类型 上面我们提到JNI...()方法没有参数,返回值为空所以对应的描述符为: "()Landroid/app/Application;",括号类为参数,其他的表示返回值,通过javap -s -p 也可以看的出来的,一般对应规则如下...4 JNI在Android中的实际应用 前面说了,JNI在整个Android系统中发挥了重要的作用,是连接底层和框架层的桥梁,在Android源码中更是大量的JNI代码,我们来说一个实际的例子:获取签名并且校验签名
facedetector.cpp CPP文件中写两个方法的实现,首先定义了一个CascadeClassifier ?...的类里面加入一个加载训练文件的方法 ?...然后通过ALT+ENTER会在native-lib.cpp生成对应的方法 native-lib.cpp ? 我们在这里直接调用facedetector类中的loadcascade即可。...然后在native-lib.cpp中原来的getCameraframebitbmp方法后屏蔽掉我们原来的检测,改为调用facedetector类中的detectorface,如下: ?.../Bitmap$Config;)Landroid/graphics/Bitmap;"); jobject bitmap = env->CallStaticObjectMethod(java_bitmap_class
Paint 基本使用 《Paint的方法主要可以抽象成两大类》: 1.1 负责设置获取图形绘制、路径相关的 1.setStyle(Paint.Style style) 设置画笔样式,取值有 Paint.Style.FILL...:填充内部 Paint.Style.FILL_AND_STROKE :填充内部和描边 Paint.Style.STROKE :仅描边、 注意STROKE、FILL_OR_STROKE与FILL模式下外轮廓的位置会扩大...Typeface getTypeface() Typeface setTypeface(Typeface typeface) 获取与设置字体类型。...Android默认有四种字体样式:BOLD(加粗)、BOLD_ITALIC(加粗并倾斜)、ITALIC(倾斜)、NORMAL(正常),我们也可以通过Typeface类来自定义个性化字体。...float getTextSkewX() void setTextSkewX(float skewX) 获取与设置文字倾斜,参数没有具体范围,官方推荐值为-0.25,值为负则右倾,为正则左倾,默认值为0
在 NqApplication 类 method protected attachBaseContext(Landroid/content/Context;)V 中都分别调用了这些函数: 3..invoke-static...通过分析 JNI 方法注册到 Dalvik 虚拟机的过程,可以得到 java 层 native 函数与 so 层函数 对应的关系为: native nq10 -> b9df1ce797fd03603fd7137afff2957.../content/Con text;)V 该函数是将 assets 文件夹中的 DexToLoad.apk 与 nqdata 拷贝到/data/data+包名/.cache 目录中,然后调用 nq10...在 arch-arm\usr\include\linux\ inotify.h 头文件中定如下: #define IN_OPEN 0x00000020 ,根据线程函数可以看出它是监视/proc/pid/...java 层 CopyBinaryFile 函数中被调用到,我们在 so 中对 b9df1ce797fd03603fd7137afff2957 函数下断点,动态分析看它都做了些什么?
(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection) W/System.err: StrictMode...可见,即使它的实现代码中没有出现任何非公开SDK的引用,实际上它依赖的第三方组件内部也使用了非公开SDK接口。...在实际使用过程中,我们的宿主对于业务接入在增量上有极其苛刻的要求。Shadow接入时只使用了15.1KB,160个方法。...如果插件Activity不是一个真的Activity,只是一个跟Activity有差不多方法的普通类,这件事就简单多了,只需要让壳子Activity持有它,转调它就行了。...Shadow做了一个非常简单事,通过运用AOP思想,利用字节码编辑工具,在编译期把插件中的所有Activity的父类都改成一个普通类,然后让壳子持有这个普通类型的父类去转调它就不用Hack任何系统实现了
那么Transform在这个时候其实就是一个完全没有被脱糖过的代码,所以还是要感谢那位同学的评论,让我在马上意识到了这个问题,所以才有了这篇水文。...Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。 上面是java对于lambda的释义,那么什么是lambda的本质呢。...对于ClassNode来说,所有的栈帧上的方法调用都会被转化成AbstractInsnNode,而一个INVOKEDYNAMIC则对应的是InvokeDynamicInsnNode实现类,所以方法上只要有...我就是根据这个类里面获取到的动态链接所指向的函数信息,找到了对应的静态方法。 那么到这里,我们已经成功获取到了Lambda指向的静态方法了,所以后续我们也就又可以为所欲为了啊。...TODO 但是这个由于是一个静态方法,所以当前如果只是插入一些静态方法应该都是没问题的,如果是要生成相对来说更复杂的代码,比如之前写的双击优化就不行了啊。这个我后面在盘一盘想一想。
方法运算时从栈中的局部变量区取数据进行运算将结果存放在操作数栈中,最后返回的时候从操作数栈中弹出结果 而davlik虚拟机运行时中也为每一个线程维护了一个PC计数器和一个调用栈,不同的是这个调用栈中维护了一个寄存器列表...,至于虚拟寄存器分配多少个是根据方法结构体中的registers字段给出,davlik虚拟机根据这个字段创建一份虚拟的寄存器列表。...: invoke-super {寄存器 :代表调用者和参数},方法所属的类;->方法名称(参数类型)返回值【V代表无返回值】 invoke-super {p0,p1},Landroid/app/ActivityGroup...;->onCreate(Landroid/os/Bundle;)V 调用接口: invoke-interface {寄存器【和方法一样也是调用者和方法参数信息】}, 方法所属的接口全名;->方法名(参数类型...0或者相等时跳转(与if-nez相反) 方法返回: return-void 没有返回值 破解程序 分析修改smail文件 1.修改完smali文件安装到手机上 重新编译,回编译命令为 apktool