Android开发者心酸史

安卓逆向从0到1学习总结 前言     PS:该文已经首发于公众号信安之路!!!     初识安卓逆向是在2019年的暑假,到现在也快一年了,这一年来有刚从web渗透转来的迷茫,有成功破解了第一个app的喜悦,也有通宵熬夜逆向的心酸,到现在感觉自己成功踏进逆向大门的满足感。原本打算在入门之后弄个安卓逆向教程作为总结,但是吧,写文章教程,各大论坛都有,而且还写得挺好,例如52论坛的<<教我兄弟学逆向>>教程,自己再去写就没多大意思了;做视频教程吧,因为个人原因,没有那么多时间去录制视频和剪辑视频。谨以此文总结 阅读详情

Android意外的诞生

Android和Linux一样,一个人完成雏形的编码,巨头林立中称之为意外

Windows Mobile

Windows Mobile是微软针对移动产品而开发的精简操作系统

Pocket PC 2000

2000年4月19日

image

Mobile 6.5

2009年2月发布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sd43yzuw-1575015710034)(https://cdn.arstechnica.net/wp-content/uploads/2009/10/htc_winmo65_ars.jpg)]

Kin

Microsoft Kin标榜为社交电话. 这些功能跨越功能手机的门槛[7],可以使用Facebook, Twitter, Windows Live, and MySpace等社群.

2010年5月13发布

image

2010年6月30日终止

微软公司的官员告诉《纽约时报》说,他们对Verizon推动Kin的发展不够积极感到遗憾。仅上市48天。

Verizon,是一家美国移动网络运营商

Windows Phone

Windows Phone具有桌面定制、图标拖拽、滑动控制等一系列前卫的操作体验。

微软在该系统中使用了叫做Metro UI(后改名Modern)的新界面,完全改变了应用封装格式,所以Windows Phone 7的应用与Windows Mobile应用完全不兼容。

2010年10月11日晚上9点30分发布

image

CLR公共语言Runtime

Windows Phone使用.NET CLR来应用程序,CLR是Common Language Runtime的简称,和Java虚拟机一样也是一个Runtime环境;Windows Phone 7所有第三方程序均要经过CLR来运行。与Windows Phone 7不同的是,微软的Windows Phone 8采用与Windows 8相同的NT内核,可不经CLR直接运行原生码桯式;换上新内核的Windows Phone 8开始向所有开发者开放原生代码(C和C++),应用的性能将得到大幅提升。因此Windows Phone 8几乎兼容所有Windows Phone 7.X的应用程序,但Windows Phone 7.X无法运行为Windows Phone 8开发的所有原生程序。

软体结构体系

Windows Phone 7中的软件层,即软件结构体系,主要由两个部分组成,它们分别是Screen部分和Cloud部分。而Screen部分和Cloud部分则又分别由不同的部分组成,Screen部分由“Tool and Support”和“Runtimes”组成,Cloud则由“Developer Portal Services”和“Cloud Service”组成。Screen部分可以理解为本地,Cloud部分可以理解为云端,它们都是Windows Phone 7软件体系中不可缺少的部分。

Screen部分中的“Tool and Support”是开发应用所必需的开发工具和技术支持,“Runtimes”则是开发应用的Framework,提供所需要的API和功能。Windows Phone 7提供了两种框架,分别是Silverlight Framework与XNA Framework。

Silverlight Framework是以XAML文件为基础的应用程序设计框架,用来开发基本应用、网络应用、多媒体应用和控件。

XNA Framework则是用来开发基础的游戏设计框架,用来开发2D游戏、3D游戏和游戏控件。

Silverlight Framework和XNA

Framework都是在.NET平台上的应用程序开发架构,能够有效率地协助开发人员开发应用程序,而且开发人员只要稍微修改现有的Silverlight应用程序或XNA应用程序,就可以将Silverlight应用程序或XNA应用程序移植到Windows Phone 7上执行。

Cloud部分中的“Developer Portal

Services”是开发者开发应用程序所必需的注册账号、认证、发布、更新管理以及Market Place的付费管理,由于Windows Phone 7开发必须拥有注册的账号才能进行真机测试,否则只能在模拟器上进行测试。“Cloud Service”则是云端服务所需要的服务器API。

编程语言

微软当前只允许开发者使用C#和Visual Basic来进行Windows Phone 7的应用开发。此外,在Windows Phone 7应用程序的开发中不允许使用Native Code,也不允许使用C/C++语言(Windows Phone 8已经向开发者开放了C/C++),每个程序安装包(.xap)的大小最大只允许400MB,同时微软也对应用程序占用的RAM大小也做出了相应的限制。

开发限制

微软为了规范Windows Phone的用户体验,对开发者开发应用进行了严格的约束,开发者必须严格遵循这些开发约束和条款来进行应用开发。例如,开发者不能开发涉及到手机摄像头的应用程序;开发者不能对应用程序的界面进行私自的定制;涉及到系统类的应用必须使用系统提供的界面来运行。

Android

离开Danger后,Andy曾再次隐居开曼群岛,想开发一款数码相机,但是没有找到支持者。他很快回到熟悉的领域,创办Android,开始启动下一代智能手机的开发。这次的宗旨,是设计一款对所有软件开发者开放的移动平台
2005年,Andy靠自己的积蓄和朋友的支持,艰难地完成了这一项目。在与一家风投洽谈的同时,Andy突然想到了Larry Page,于是给后者发了一封邮件。仅仅几周时间,Google就完成了对Android的收购。接下来的故事,已经载入史册。

2005年4000万美元收购

开源节点

在2007年11月5日,Google公司正式向外界展示了这款名为Android的操作系统,并在这天Google建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成。这一联盟将支持谷歌发布的手机操作系的统以及应用软件,并共同开发Android系统的开放代码。此时,Android系统的定位已确定,基于Linux、开源、免费供手机厂商使用等,谷歌则将其服务深度集成在系统中以获取利润。

1.1

2008年9月22号发布的Android第一版。HTC Dream

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZuykNbd-1575015710037)(https://cnet4.cbsistatic.com/img/7b3e2PtMAM7BchfLuji77UjX404=/980x551/2018/08/31/4bd92183-19fb-4bff-8169-363b65e71ac1/g1-use-3602.jpg)]

2009年4月发布Android 1.6

image

HTC顶峰时期HTC Hero

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPiRIr2Q-1575015710038)(https://www.androidcentral.com/sites/androidcentral.com/files/deviceimages/samsung-galaxy-s.png)]

Galaxy S

2.3.x

Gingerbread(姜饼) :2010年12月7日发布。

主要的更新如下:
增加了新的垃圾回收和优化处理事件;原生代码可直接存取输入和感应器事件、EGL/OpenGLES、OpenSL ES;++新的管理窗口和生命周期的框架++;支持VP8和WebM视频格式,提供AAC和AMR宽频编码,提供了新的音频效果器;支持前置摄像头、SIP/VOIP和++NFC(近场通讯)++;简化界面、速度提升;更快更直观的文字输入;一键文字选择和复制/粘帖;改进的电源管理系统;新的应用管理方式。

IOS

iPhone OS 1

2007年 6月

乔布斯在2007年推出了首款iPhone,那时,为它提供服务支持的软件,还只是被附属简单地提及了一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0OGtuYx-1575015710038)(https://d2um6umu4gwssp.cloudfront.net/apple/wp-content/uploads/2016/06/iphone-1.jpg)]

iPhone OS 2

2008年 7月

故事的另一个结果是“AppStore”出现了:它将数百万的 iTunes Music 用户转变为潜在的App用户。

在iPhone OS诞生初期,还没有应用商店可供下载第三方的应用程序。乔布斯在当时鼓励开发者开发网页应用而不是原生应用,导致在当时应用程序质量不高,功能有限。直到几个月后,苹果改变了主意,并在2008年3月发布了第一款iOS软件开发包。并在当年7月推出App Store,这是iOS历史上的一个重要里程碑,它的出现开启了iOS和整个移动应用时代。

收入三七分成的制度和良好的生态环境迅速吸引了大量开发者。很快,iPhone几乎变成了一款“万能”的手机:量角器,水平仪,游戏机,其中还不乏一些相当具有逼格的“喝啤酒”,“吹蜡烛”等游戏。并且在此后的几年中苹果不停地完善App Store的功能。直到现在,App Store里的应用数量都是苹果自己最值得骄傲的地方之一。

iPhone OS 3 / iOS 3

2009年6月

新版本的 iOS 带来了许多新功能,比如复制粘贴、著名的 Spotlight 搜索和语音控制。

除此之外,App还出现了备受争议的新外观:拟物设计(skeuomorphism)。

iOS 4

2010年 6月全新的高分辨率Retina屏幕。

IOS7 2013年扁平化, Android则是2014年6月25日5.0版本

Dark主题2015年Marshmallow被移除

塞班

1980年David Potter成立Psion公司。1998年在爱立信、诺基亚、摩托罗拉和Psion的共同合作下成立塞班公司。1999年塞班公司推出Symbian OS v5.x操作系统。2000年全球第一款Symbian系统手机:爱立信R380正式出售。

2001年塞班公司推出Symbian OS v6.x。2003年推出 v7.x4,创始人之一的摩托罗拉退出塞班公司。2004年推出 v8.x版,2005年升级为 v9.x版。

2006年全球Symbian手机总量达到一亿部。2008年诺基亚收购塞班公司,塞班成为诺基亚独占系统。

2009年LG、索尼爱立信等各大厂商纷纷宣布退出塞班平台,转而投入新系统领域。至2010年塞班仅剩诺基亚一家支持。

2011年3月,Symbian被传“开源”,之后更名为诺基亚Belle。11月,塞班在全球的市场占有率降至22.1%,霸主地位已彻底被Android取代,中国市场占有率则降为23%。12月21日,诺基亚宣布放弃Symbian品牌。

2008年发布。Series 60第五版

俗称:S60v5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohfhjBWU-1575015710041)(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRO-f7kHUaLqXX2DNJokCA_9Niy7VDTc_BM7zDfoexPE6hetIP_)]

Chrome

2008年9月2日发布beta测试版本

V8 (JavaScript引擎)

V8在运行之前将JavaScript编译成了机器代码,而非字节码或是解释执行它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。

Android Runtime(缩写为ART)

2013年10月31日年作为Android 4.4系统中的一项测试功能正式对外发布,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。它与Dalvik的主要不同在于:Dalvik采用的是JIT技术,而ART采用Ahead-of-time(AOT)技术。ART同时也改善了性能、垃圾回收(Garbage Collection)、应用程序出错以及性能分析。

2013年3月13日Google官方发布博客文章称,安迪·鲁宾将离开Android部门而转向公司内的其它事务。其原职位由Chrome部门副主管桑德尔·皮蔡兼任。此举也引发了外界对Google日后是否会将Chrome与Android整合的猜想。[4]

其他历史节点:

2006年10月,谷歌以16.5亿美元收购影音内容分享网站YouTube,这是谷歌公司成立以来最大笔的并购。

2012年5月,谷歌以125亿美元收购摩托罗拉移动。

2013年10月3日,谷歌收购Flutter,该公司的主要业务是手势识别技术。

2015年4月,谷歌获得防剧透系统专利。

正文

读过万历十五年的人都清楚,万历十五年并没有发生什么记录史册的大事。谈不是什么开国,安史之乱,伐纣什么的大事。但我们要记得2007年这个节点,它是现在格局的关键因素。

前置:

现在有一个问题是如何向非Android开发解释Android是个什么东西。《大象 Thinking In UML》里对面向对象几个特点的描述非常棒,我也尝试映射一下各端开发自己理解的隐喻。

前端面向的最终是视图,也就是,无论你写了多美丽的代码和算法,最后展示给用户的就是你的界面,就是设计给你的那个界面。

后台面向需要渲染成各种格式的数据,xml, json等,后端需要给前端需要的数据格式,例如列表数据[{},{}]。

Java程序员其实很容易互相做彼此的工作。所以18年移动端寒冬之后,很多Android转了后台开发,SpringBoot降低了门槛,尴尬的是android没有Spring套装给后台入门。

那我们明白了Android的最终的工作就是“渲染”页面,那来看看Android的视图怎么组织

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

页面上居中显示一行正文Hello World!

感觉还可以,就是比html复杂了一点

<html>
<p>Hello World</p>
</html>

假如后台的数据交换方式是xml, Android可以直接解析返回的xml, 然后直接渲染出界面。但是好像没人这么用。很早之前,前后端不分离的时候,后台貌似也需要渲染jsp内嵌的格式是html。大致大家都可以称之为DOM,就是document,代表了你的布局文件。

var a = document.getElementById("id");
val tvHello = root.findViewById<TextView>(R.id.tv_hello)

我们姑且将xml布局称之为画布,因为它唯一提供核心的东西就是Canvas对象。

那么画布没有被展开之前,谁也看不到,所以需要一个画板,将画布展开。另外的比喻就是剪纸,xml就是剪纸,需要贴在窗户上,我们称之为Window。这个概念在前端也有,在IOS应该也是存在的。到这其实大家的概念和做法都差不多,谁都有Canvas::draw方法。

但在承载window的时候就有些分歧了

我们拿Android的亲兄弟Chrome做对比,看看想不想双胞胎

Chrome吃内存,Android吃内存
Chrome一个标签,一项任务就是一个独立进程,Android一个程序就是一个独立进程,一个程序可以存在多个进程。
Chrome插件是单独进程,Android插件也是单独进程,优点肯定是大大的,任何一个进程崩溃,其他App都可以围观。

当然还有很多的相似点,毕竟亲兄弟,Flutter能开发Android,也能开发ChromeOS。

所以,咱们来介绍一下Android的Window承载器Activity(活动), 如果按现在Android3.0以的架构来映射,这倒霉玩意就是Chrome的一个标签。能想象吗?开启一个Activity就是开启了一个带URL的浏览器标签。所以写一个Activity就是写了一个本地Html和Js。

好了,到这,我们终于可以把Activity的另一个附加属性抽象映射到了前端JS,没错这玩意简单页面,映射的就是JSP(themeself),复杂界面就是JS。介绍了这么多,估计回去下载个IDE就能写登录功能了。

到这,有任何开发经验的人基本上都已经入门Android了。

抽象的映射完了,就开始正式介绍一些倒霉玩意了。

上图:

image

show Me the Code
public final class UsersActivity extends ListActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       //...
       new ListUsers().execute();
   }

   private final class ListUsers extends AsyncTask<Void, Void, Void> {

       @Override
       protected Void doInBackground(Void... voids) {
           // final SQLiteOpenHelper sqLiteOpenHelper = ...
           // JsonObjectRequest jsObjRequest = new JsonObjectRequest
           // (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
           // MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);
           // showData(user);
           return null;
       }
   }
}

  • God Activity

上古时代Android1.0到3.0都是这个写法

操作数据库,访问网络,解析数据,切换线程以及渲染数据

All in one多合一

image

AsyncTask怎么用,如何防止内存泄漏。
四大组件是什么,怎么用
Activity如何返回结果
Service有那几种启动方式

第二次迭代MVP(4.0-5.1)
  • God Presenter

MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

image

MVP这种模式很早就存在了,应用在Android上是因为Fragment

  • Added in API level 11
  • Deprecated in API level 28

This class was deprecated in API level 28.
Use the Support Library Fragment for consistent behavior across all devices and access to Lifecycle.

我们解释Fragment是不能扔掉的垃圾,Fragment在国内被广泛应用时,大概在2016年以后。因为之前BUG太多,和Async一样难用,现在是共识的使用方式,虽然还是那么不好用。

Fragment是Android的视图生命周期控制器(带生命周期的自定义View),是Activity上的View层级中的一部分,一般可以把它看做一个轻量级的Activity。与传统的Activity相比,它只占用更少的资源,并且提供更大的编码灵活性、在超低版本上的兼容性等。

使用Fragment,即使是在肥肠差劲的平台(例如API 19以下连ART都没有的的老系统)上也能得到较好的运行效果,并且能将过渡动画兼容到更低的版本(通过FragmentTransition指定)。

早期的Fragment出现过很多问题,比如没有onBackPressed(),没有启动模式,重复创建,辣鸡的回退栈,迷之生命周期等等,导致很多开源作者自己独立开发了用于Fragment管理的框架,其中比较出名的有YoKeyword大佬的Fragmentation。

No bibi, Show Code

第一个是短信Activity,294行代码
第二个是对应的UiController,4629行代码

这个是经典的MVC架构,引入MVP之后就多了一个类和写不完的接口,优点是,一套业务逻辑可以对应多个页面,平板的出现不得不如此来做。

下面的是另外一个直播App的主页面的接口约定,带上注释427行

第三次迭代MVP + managers(5.1-7.0)

这些类有很多名字:uitls、helpers、fooBarBuzz-ator、等等。因此我们引入 Manager。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dcNqXYm-1575015710044)(https://five.agency/wp-content/uploads/2016/11/Diagram_4-1.png)]

如果项目写在17年之前,能有这样的架构,已经很棒,维护起来已经很容易了。


也就是,到16年,Google也没告诉我们,Android是否存在一个标准通用的,没那么多BUG系统组件和框架。

在17年,我们几乎所有Android开发者要感谢的一位大神Jake Wharton和Square,2017年从Square离职去了Google。

他给我们带来了那些轮子

  • butterknife 24213
  • dagger
  • DrawerBehavior 903
  • NineOldAndroids 4492
  • leakcanary 23183
  • retrofit 33038
  • picasso 16895

黎明之后

  • RxBinding 8917
  • kotterknife 2243
  • timber 7144 Android日志框架
  • retrofit2-kotlinx-serialization-converter 345

image

名言:

When Google bought Android, I honestly think they treated it just as some other side project.

是他们才让我们感觉到Android还有一点优势,能在IOS开发者面前抬得起头。

我们身后的巨人Google做了什么

面对Android开发者一直被IOS开发和前端开发鄙视,Google做了什么?
2016年,support-v7, databinding-alpha(这玩意MVVM模式的Android实现),当时属于脑残项目,19年又被提上了Jetpack。

2017年,放弃自己的HttpUrlConnection, 使用okhttp3作为网络框架(简单的说,开发者把坑踩完了,发现了更牛逼的存在)

和Java打了官司,才决定用Kotlin。
Android碎片化严重,ReactNative霸占市场,马后炮出了Flutter和新的操作系统。

被欧盟开罚单,之前说好的靠内置应用赚钱破灭了,开始逐渐闭源。

2018年,Jetpack,简单的说,开发者们,Google还是靠得住的,你看我们想起你们来了,你们不用去自己造轮子了,我们都给你们提供alpha版的AndroidX,必须用啊,不用你就是找事情,一天提醒你三遍。

2019年,Jetpack一部分是1.0了,Flutter的热度成功盖过了Kotlin原生开发。

前一段时间中美贸易战,Android和华为之前的关系很紧张,其实华为早就有备胎,不是现在的那个什么鸿蒙,而是很早的麒麟OS,让我们想到了悲剧的阿里云OS。备胎早晚会转正,只是现阶段转正的代价不可估量。

话说,都这么烂了,为啥还开发Android,还有那么多人入坑

入门简单,计算机相关专业的,你可以说你没学过oc,但不能说你没学过Java

入门便宜,一台Mac等于三台PC,开发不需要注册账号,不需要花一分钱。

对开发者不友好,对手机厂商友好啊,不花钱,随便改,随便造,你只要开机启动的时候协商power by android就完了,毕竟当时塞班诺基亚收购了,除了它,就剩下WindowsPhone,大家都知道,自己和自己不兼容。

So,现在啥样?

Google的拷问

Google:

还想做Android开发不?

开发者:

想

Google:

先去学Kotlin


Google:

还想做Android开发不?

开发者:

想

Google:

先去学Jetpack


Google:

还想用AndroidStudio开发Android不?

开发者:

想

Google:

先去把项目升级到AndroidX支持,要啥啥support


开发者:

Android是亲生的?

Google:

大家的女儿,Flutter才是亲生的,Chrome的媳妇儿

十岁的Android何去何从

Android越来越来越像IOS,IOS也越来越像Android

kotlin官方提供了编译Native代码还是很激动的,最起码看到了当年没有完成的事情仍有希望被完成,用Java写IOS app

什么ReactNavtive, Flutter都要让路。

Apple不让怎么办,kotlin, Flutter会和JS一样,分一杯移动端的蛋糕。Flutter会更强势,因为他自带先进的渲染库,可以做JS做不了的游戏。

那来瞅瞅Android可能即将流行的架构

大公司的组件化,以阿里巴巴的开源路由ARouter的诞生为起点,主打模块的复用性和可拆分性,同一套登录逻辑没有第二遍,新项目除了Domain和问题领域,其他都可以拿来主义。淘宝先上线扫垃圾,支付宝随后就来。

小公司的Single Activity,The Clean Architecture,最小的系统依赖,专心在业务领域建模。这么干的国内有重构后的知乎

虽然这两个方法处于不同的层面,你就一款App,给谁去复用,增加项目维护成本。组件化本身就拆散了很多东西。理想状态可以实现组件之间的小型前后端分离。

前后端分离

路由这个概念存在,大致就明白这是个啥

The Clean Architecture

这个是2012年,《代码简洁之道》的作者Uncle Bob发布在博客上的内容。

面向的是面向对象开发者,很拗口,都懂。

OO,OOD,OOAD,TDD,DDD

想到最近人间蒸发的南京音乐人李志的一句歌词,

他们在这世界上不停的奔跑,一不小心就改变了我们

这个简洁的架构也不是目前Android开发的银弹,虽然已经可以在Android上来应用这个繁杂的,多层的,但可维护的架构。奈何kotlin中,函数是一等公民。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpbG3hYD-1575015710045)(https://blog.cleancoder.com/uncle-bob/images/2012-08-13-the-clean-architecture/CleanArchitecture.jpg)]

So, So?, So!
abstract class UseCase<out Type, in Params> where Type : Any {

    abstract suspend fun run(params: Params): Either<Failure, Type>

    operator fun invoke(params: Params, onResult: (Either<Failure, Type>) -> Unit = {}) {
        val job = async(CommonPool) { run(params) }
        launch(UI) { onResult(job.await()) }
    }

    class None
}

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        // start Koin context
        startKoin {
            androidContext(this@MainApplication)
            androidLogger()
            modules(appModule)
        }
    }
}

val appModule = module {
    // single instance of HelloRepository
    single<HelloRepository> { HelloRepositoryImpl() }

    // Simple Presenter Factory
    factory { MySimplePresenter(get()) }

    // Simple Java Presenter
    factory { MyJavaPresenter(get()) }

    // scope for MyScopeActivity
    scope(named<MyScopeActivity>()) {
        // scoped MyScopePresenter instance
        scoped { MyScopePresenter(get()) }
    }

    // MyViewModel ViewModel
    viewModel { MyViewModel(get()) }
}

十年,大致和移动端的Android开发者,度过了婴儿期和儿童期,还有很长的路要走。

图片均来自于网络,如有侵权,请联系删除

用于Kotlin序列化的Retrofit 2 Converter.Factory。-Android开发 Kotlin序列化转换器Retrofit 2 Converter.Factory,用于Kotlin序列化。 用法在使用stringBased或bytesBased工厂方法构建Retrofit实例时,添加一个转换器工厂:Kotlin序列化转换器用于Kotlin序列化的Retrofit 2 Converter.Factory。 用法使用asConverterFactory扩展功能构建Retrofit实例时,添加一个转换器工厂:val contentType =“ application / json” .toMediaType()val retrofit = Retrofit.Builder().baseUrl(“ https://example.com/”) .addConverterFactory(Json.asConverterFactory(contentType)).build()响应主体类型(例如Call )和@Body类型(例如@Body用户:User)现在将使用 立即下载

相关推荐

小程序选项卡以及swiper套用(跨页面)

选项卡tab和swpier之间的套用 其实我之前写过一篇选项卡的切换demo,大家阔以参考一下 小程序多个选项卡切换 那今天写这个demo呢,是因为项目需求,所以仅供参考。 我是拿到了home.wxml的数组下标, 通过url传参的方式去将这个id传到下一个页面, 下一个页面接收以后再将id赋值给对应的tabI或者currentId(swiper 的下标) 实现上一个页面进来以后直接进入对应的页...

Rechal_Mei的博客 3597

Jake大神的三把刀

Jake Wharton,Android开发领域传奇一般的存在,熟悉Android开发的同学应该都听说过,即便没有,也应该会经常用到他主导或参与贡献的开源项目,他在GitHub上开源了多个Android兼容性、依赖注入相关的知名项目,目前就职Square, 也参与贡献了Square公司开源的诸如Retrofit, okhttp等热门项目。 Jake大神喜欢以刀命名自己的项目,可能他觉得这能很

qq_24429935的博客 616

AAAI2024最佳解读|FontDiffuser One-Shot Font Generation via Denoising Diffusion with Multi-Scal

本文提出了一种名为FontDiffuser的基于扩散的单次字体生成方法,旨在通过去噪扩散模型生成模仿参考图像风格的字体,同时保留源图像的内容。尽管现有的字体生成方法在性能上取得了一定的进展,但在处理复杂字符和大风格变化时仍面临挑战。FontDiffuser通过引入多尺度内容聚合(MCA)模块,有效结合不同尺度的全局和局部内容线索,从而增强复杂字符的笔画保留能力。此外,文章还提出了一种风格对比细化(SCR)模块,用于风格表示学习,利用风格提取器从图像中分离风格,并通过精心设计的风格对比损失来监督扩散模型。

haimianxiaobao11的博客 1190

constructor AsyncTask is deprecated.

constructor AsyncTask is deprecated

3353

CloudCompare点云变换保姆级教程:从平移、旋转到绕任意点旋转,一次搞定

本文提供CloudCompare点云变换的全面教程,涵盖从基础平移、旋转到绕任意点旋转的高级技巧。通过详细的操作步骤和实战案例,帮助用户掌握点云数据处理的核心技能,提升三维模型对齐和变换的效率与精度。

weixin_28717969的博客 289

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 2(step by step)

数字逻辑第二章习题和详细步骤 2-1 ~ 2-78

weixin_62651190的博客 2305

【搬运】AsyncTask is Deprecated, Now What?

AsyncTask 在android11 已经被废除了,那么多线程应该使用什么实现呢。

qq_33298609的博客 2240

硬件工程师的破局之路:为何你才是考取软考高级架构师的“天选之子”?

硬件工程师如何转型系统架构师:独特优势与实战路径 文章揭示了硬件工程师在考取系统架构设计师证书时的独特优势。作者指出,硬件工程师的全局思维、接口设计能力和可靠性经验正是系统架构的核心要素。通过将硬件经验升维为架构思维(从引脚到接口、从单板到系统、从实现到权衡),硬件背景反而成为竞争优势。文章建议通过知识补全、建立架构决策日志和术语转换练习来备考,并强调硬件工程师在软硬协同时代的独特价值——既能统领硬件设计,又能为软件搭建最佳舞台。文末鼓励硬件工程师以更高视野看待职业发展,将系统架构师认证视为水到渠成的职业升

云轩阁 532

震惊!AsyncTask将被弃用?

AsyncTask被弃用了,怎么办? 这是篇翻译自 Vasiliy的文章 原文地址https://www.techyourchance.com/asynctask-deprecated/ 在过去的十年里,AsyncTask一直是Android并发 代码开发中最广为使用的解决方案。 然而,它备受争议。一方面,AysncTask很强大,并且在大量的Android应用中依然很好用,另一方面,很多专业...

rqX的博客 1万+

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现(完结,附带项目源码)

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4651

YOLO11涨点优化:卷积魔改 | DCNv2升级版本,助力检测

在DCN的基础上,增加了2个创新点,分别是调制模块和使用多个调制后的DCN模块,从形成了DCN的升级版本——DCNv2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 967

线程之为什么弃用 AsyncTask

AsyncTask 是 Android 提供的一个用于在后台线程执行任务并在主线程更新 UI 的类。然而,从 Android 11 (API level 30) 开始,AsyncTask 已被弃用(deprecated),并且在未来的 Android 版本中可能会被移除。因此,尽管在旧版本的 Android 中你仍然可以使用 AsyncTask,但不建议在新的开发项目中继续使用它。

追梦的鱼儿 1902

RDKit | 基于Murcko骨架聚类化合物库

化合物多样性评估 一种方法是使用合适的指纹技术将化合物矢量化并评估他们之间的距离。这种方法经常被使用,但是对于人类很难直观地理解化合物之间的距离。 基于Murcko骨架,分子大致聚集在化合物骨架中,并且每个簇中的顶部化合物都作为候选化合物。此方法非常符合人类的直觉,因此可以预期人将通过查看候选化合物列表来自动缩小化合物的范围。 Murcko骨架 Mur...

DrugOne 3766

Android app嵌入广告开发心酸史

自从加入Android开发以来一直有通过app插入广告上传到应用市场赚点外快的想法,但平时忙于公司开发而没有时间,年末了没有那么忙了,便想着搞搞个app试试,最后决定了先整个五子棋练练手,算是上道先,但没想到遇到的困难时重重。 首先为了图能能够赶紧上线,从github上clone了一个五子棋项目,嵌入了有米广告,过程根据官方文档复制粘贴就好,不过需要注意要加入 &lt;uses-permi...

b1249813239的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android 程序猿的保活心酸史

说起android 保活真是一把鼻涕一把泪,由于国内厂商对系统的大刀阔斧各种变态的省电机制,真不知道当初自己为什么会写android T.T ………………… 虽然谷歌爸爸在每个Android版本都在手机电量方面努力进行优化,不过还是没有一个解决后台服务泛滥电量消耗过快的很好的办法(PS:骚一句就是之所以android手机越来越卡就是因为很多APP在后台耍流氓,导致你根本杀不掉进程,然后手机的...

要有一颗想肥胖的心 1724

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

一个Android开发妹子的找工作心酸史

阿里:实习二面被KO 1,人生接到的第一个电话面试来自大家都说好的阿里,心情激动,说话颤抖,本以为没有戏,然而第二天接到了二面的电话有点小激动。然后就是被ko了,死的原因很简单,那时候单纯的自己什么都不知道,一点知识储备都么有。别人问我异常,还有怎么调试代码,出错怎么解决。我就一句上网搜~是不是觉得我有点傻逼。是的就是傻逼。。。。。 总结:要学习如何处理错误和异常,看Java基础。 ...

denggu8595的博客 490

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Eclipse转战Android Studio心酸史

eclipse用了三四年了,对于转战Android Studio真的是被逼无奈,不过AS作为Google的亲儿子,对于Android开发肯定也有很大的好处,特此记录转换时遇到的问题及解决方案。    1.转战原因     当一个工程足够大时,总的方法数超过了65535个,编译的时候就会报错: java.lang.IllegalArgumentException: method ID no

kongge的专栏 580

初次Android 6.0升级Android 8.0的心酸总结

前置条件 1.需要先确定你要升级的Android版本(这里我是从6.0升级到8.0,也就是compileSdkVersion从23升级到26),无论是升级到什么版本,你的AS都至少需要升级到3.0以上的版本才会支持。 2.确定你的Android版本后,就要确定对应的Gradle版本(Gradle的版本需要注意Android Gradle Plugin Version和Gradle Version 的对应关系,详情可以查看 https://www.cnblogs.com/diyishijian/article

woshixinyou0的博客 7193

心酸,30岁深漂失业3个月,从巅峰跌落谷底,大龄Android开发必须要懂的事

分享一份NDK基础开发资料分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!分享一份NDK基础开发资料[外链图片转存中…(img-NroirCz9-1715305694138)]

2401_83703893的博客 1047

Android开发者必看,面试安卓工程师会问到那些问题

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家我的【Github】会分享一些关于Android进阶方面的知识,也会分享一下最新的面试题~如果你熟练掌握GitHub中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

m0_60666841的博客 1012

一个纯技术程序员的求职心酸历程

前几天有个应届毕业生的程序员在微信上找到我,并向我吐槽了一下他目前的心酸现状。我对此除了表示同情以外,只能剩下鼓励了,对于不能帮助他,我深感我自己力量的薄弱,意识到了我必须强大才行,这样才能帮助别人。如果你是一个无名小卒,那么自身都难保,还凭什么说去帮助别人呢?因为我想让这个世界变的美好一点点...

chuanggua5622的博客 496

国内几大Android应用市场

Android最大的应用市场自然数Google的电子市场,可惜对大陆的开发程度实在非常有限(这到底要怪谁?!),一般的开发者想把自己的应用传上去实在是很困难,至于收费的,不管是上传还是下载,都是难如登天的事情。 这种情况下,国内的Android应用市场就有了比较好的发展前景,国内现在Android用户差不多近千万,基本只是在电子市场上瞄瞄免费的应用,于是乎各大原生的市场,竞争的不亦乐乎,随便数数

hubeixuxiaojun的专栏 2847

Android-x86心酸获奖

By cwhuang, 2010 年 12 月 10 日 今天下午在世貿一館舉行的「2010 開放原始碼創新應用大賽」頒獎典禮中,Android-x86 計劃以 froyo-x86 的移植成果,獲得職業組特優獎(第二名)。這是本計劃進行以來,獲得的最大肯定。 回顧

七夜雪主 2687

菜鸟安装android NDK的心酸路

<!-- @page {margin:2cm} pre.western {font-family:"文泉驛微米黑"} pre.cjk {font-family:"文泉驛微米黑"} pre.ctl {font-family:"DejaVu Sans Mono",monospace} p {margin-bottom:0.21cm} --> 首先 下载N

yang765441183的专栏 1283
上一篇: 程序员思维修炼: 开发认知潜能的九堂课
下一篇: 给朋友的Android实用轮子
PirateBrook
博客等级 码龄11年 90粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值