⑴ 如何在电脑版(安卓模拟器)上用手机号注册微信呢
找到并管理SD卡文件 微信 所添加的图片所在的本地文件 就在SD卡的 镜像文件里 SD卡是个镜像文件,大小为新建时设的数值,我的1024m, 地址为:C:Documents and Settings****.androidavd****.avdsdcard.img (其中第一个****是你电脑的用户名,第二个****是你自己建的AVD名) 找到sdcard.img就可随意读写文件了,我一般用ultraiso, 修改完记得保存(此方法前提是要先关掉模拟器)C:DocumentsandSettings****.androidavd****.avdsdcard.img 这个 看不懂吗 C盘 里的目录盘.
⑵ android开发要不要用dagger2
用Dagger2在Android中实现依赖注入
依赖注入这个模式(模式已经用烂了,这里再烂一次)是用来给应用的各部分解耦的。使应用开发更加可扩展,更容易维护。通过本文你会学到如何使用Dagger2来处理依赖。
简介
如果以对象需要另外的一个对象才能完成一个完整功能的话,那么这里就存在一个依赖。比如,悟空要用金箍棒才能三打白骨精,要筋斗云才能十万八千里。悟空有对金箍棒和筋斗云的依赖。你可以在悟空对象里初始化金箍棒,也可以用一个工厂方法批量生产金箍棒。使用依赖注入可以无需一个专门的类来初始化这些依赖对象。这样就实现了解耦。
本教程会使用最新的Dagger2(当前的版本是2.2)。这里是官网。你可以在这里找到最新的发布。
准备
Android Studio是必须的。其他:
1. Dagger2 基础
注解讲解:
@Mole这个annotation修饰的类专门用来提供依赖
@Provides这个annotation修饰的方法用在Mole类里
@Inject用来annotation一个依赖(可以是构造方法、field或者一般的方法)
@Component连接@Mole和注入的桥梁
这些名词看起来非常抽象。下面稍微解释一下。依赖反射并没有什么神奇的地方。只不过是我们需要单独写初始化依赖的地方由其他的框架代替了。这个依赖关系也有我们常写的代码转移到了“配置文件”中。
在很久以前,依赖注入的框架就是这样处理依赖注入的:读取配置文件的依赖关系,然后用反射的方法初始化被依赖对象并赋值给调用依赖的对象。比如,我们之前在悟空类中初始化金箍棒:
public class Wukong {
private Jingubang jingubang;
public Wukong(){
// 依赖
this.jingubang = Jingubang();
}
}
后来有了使用配置文件的依赖注入(这里都是虚构的文件格式):
<xml>
<com.xiyou.Wukong>
<dependency field="jingubang">
<com.xiyou.Jingubang />
</dependency>
</com.xiyou.Wukong>
</xml>
在悟空使用金箍棒的时候,依赖注入框架自动初始化好了金箍棒,并赋值给了悟空。
现在使用Dagger2。这里就有不得不说的牛X的地方了。因为是在Android里能用的资源没有后端那么多。尤其反射消耗比较大!所以Dagger为了满足移动开发节约资源的需要,没有使用反射实现依赖注入。而是在编译的时候同时生成依赖注入的相关代码。生成代码的根据就是前文中说明的那些注解(annotation)以及使用这些annotation的类、接口。
总结起来就一句话,Dagger把你需要在悟空类里写的金箍棒类的初始化代码都根据注解替你自动生成了!只不过这种生成的代码比明晃晃的使用new初始化的方法更加复杂一些。
Dagger2 开发步骤
把大象装冰箱一共分几步:
定义依赖和被依赖的对象的类,悟空类和金箍棒类。“悟空类”和“金箍棒类”的构造函数用@Inject注解修饰。
定义一个@Mole注解的类,一般叫做XXXMole。里面写的@Provides注解修饰的方法。这些@Provides方法返回“悟空类”和“金箍棒类”对象。比如@Provides Wukong provideWukong(){ return new Wukong(); }
创建一个interface,并用@Component注解修饰。一般叫做XXXComponent。里面写一个注入方法:void inject(Wukong wk);。这里Wukong只是一个例子。任何你准备要注入的类都可以代替上面参数的Wukong类。
在需要注入的地方写@Inject的field。
最后,Dagger会根据上面的内容和最后的@Component接口生成一个DaggerXXXComponent的类型,使用这个类型来实现注入。上面的1到3步可以理解为依赖的配置。最后的XXXComponent代替古老的Reflect方式实现注入。
第一步的@Inject修饰的构造函数和`@Mole`的`provideXXX`方法二者可以省略一个。
Dagger可以根据其中的任意一种配置创建依赖的对象。都写上等于有了双保险。
上文提到过多次。Dagger 2厉害的地方就在于这个库完全不用反射,而是用在编译期生成代码的方式实现的依赖注入。这个特点导致在Android Studio配置的时候需要做一些额外的工作。
这里假设你已经创建了一个新的Android应用项目。下面打开build.gradle文件,我们一步一步的来完成Dagger2的配置。
3. Android Studio的配置
第一步、
apply plugin: 'kotlin-android' // 非必须
apply plugin: 'kotlin-android-extensions' // 必须!!!
为什么要加一个新的plugin呢?这个是为后面使用的kapt和provided提供支持的。gradle本身不支持这两个操作。
第二步、
buildscript {
ext.kotlin_version = '1.0.1-2'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
}
第三步、
dependencies {
// ...其他略...
compile 'com.google.dagger:dagger:2.2'
kapt 'com.google.dagger:dagger-compiler:2.2'
provided 'javax.annotation:jsr250-api:1.0'
}
dagger, 我们要用的正主。
dagger-compiler, 用来生成代码。
java.annotation, 提供Dagger意外的注解
最后,同步Gradle。
使用Dagger 2
下面就是Dagger一展身手的时候了。
首先,我们已经有悟空和金箍棒了。代码如下:
悟空:
import javax.inject.Inject;
/**
* Created by uncle_charlie on 6/4/2016.
*/
public class Wukong {
@Inject
JinGuBang jinGuBang;
@Inject
public Wukong() {
}
public String useJinGuBang() {
return this.jinGuBang.use();
}
}
金箍棒:
import javax.inject.Inject;
/**
* Created by uncle_charlie on 6/4/2016.
*/
public class JinGuBang {
@Inject
public JinGuBang() {
}
public String use() {
return "user Jing gu bang";
}
}
悟空对金箍棒有依赖,所以金箍棒属性有@Inject注解修饰。
因为两个类都需要Dagger创建,所以在构造函数上都有@Inject注解。
第二步、创建@Mole类
创建@Mole注解的类,并在其中添加@Provides注解修饰的方法。这些方法创建被依赖的对象。
import dagger.Mole;
import dagger.Provides;
/**
* Created by uncle_charlie on 6/4/2016.
*/
@Mole
public class XiYouMole {
@Provides
// @Singleton
Wukong provideWukong() {
return new Wukong();
}
@Provides
// @Singleton
JinGuBang provideJinGuBang() {
return new JinGuBang();
}
}
@Singleton注解表明,这个被依赖的对象在应用的生命周期里只有一个实例。
这个里的@Provides方法和前一步说到的@Inject注解的构造函数两个可以只写一个。
第三步、@Component接口,连接@Mole和@Inject
@Mole和@Provides方法提供了被依赖的对象。@Inject在@Component接口出现的地方则是指明了需要注入的地方(一般是一个field)。@Component接口就是用来把他们连接起来的。
import android.app.Activity;
import javax.inject.Singleton;
import dagger.Component;
/**
* Created by uncle_charlie on 6/4/2016.
*/
@Component(moles = {XiYouMole.class})
@Singleton
public interface XiYouComponent {
void inject(Wukong wk);
void inject(Activity a);
}
其中inject()方法里使用的对象,就是包含@Inject的field的需要注入的对象。
在这个接口中也可以不用inject()方法,而使用provideXXX()方法后面会有更多介绍。
注意:@Component接口一定要在直接中指明@Mole类型
第四步、使用@Component接口获取对象
经过前面的步骤,依赖和被依赖对象关系都已经配置好了。下面就来获取被依赖对象来注入依赖对象。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "##MainActivity";
@Inject
Wukong wukong;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView welcomeTextView = (TextView) findViewById(R.id.welcome_textview);
// 1
XiYouComponent xiYouComponent = DaggerXiYouComponent
.builder()
// 2
.xiYouMole(new XiYouMole())
.build();
xiYouComponent.inject(this);
// 3
welcomeTextView.setText(wukong.useJinGuBang());
}
}
首先主要到属性@Inject Wukong wukong;已经在MainActivity声明了。这里表明一个依赖关系:这个activity依赖于悟空,并准备注入悟空对象。
Dagger2会在编译器自动生成依赖注入的代码,所以在添加上面的代码之前需要编译一下。DaggerXiYouComponent就是Dagger根据我们的XiYouMole类生成的代码。
在这一步给DaggerXiYouComponent的builder添加XiYouMole的实例。如果这个Mole只需要用到无参构造函数的话可以用一种省略用法:create()方法。可以简写为:
DaggerXiYouComponent
.builder()
// 2
//.xiYouMole(new XiYouMole())
//.build()
.create();
Component接口的对象调用inject(this)方法之后注入即完成。所以可以直接使用@Inject Wukong wukong;属性来调用方法:welcomeTextView.setText(wukong.useJinGuBang());最后在activity中显示方法返回的文字。
运行代码,看看结果吧。
结论
以上内容可以概括为:什么被依赖,就把什么放在@Mole类里(或者什么被依赖,就给什么添加@Inject的无参构造函数)。什么有依赖(@Inject属性),就把什么放在@Component接口的inject()方法参数里。(或者有什么@Inject属性,就在@Component接口里provide什么对象)。这个概括不一定严密,但是基本用法全部包括了。
依赖注入是很有用的。以上的内容只是Dagger2依赖注入的一部分。各位读者还需要根据官方文档多加练习才能更好的理解依赖注入和Dagger的各种用法。
⑶ 做Android 开发怎么选择手机
做Android开发选择手机时,主要从原生性、版本号、屏幕适配三方面考虑。
1. 原生性
原生Android系统是指Google公司发布,没有经过第三方修改的安卓系统。由于Android是开源系统,所以,有的厂商在引入时,会修改其框架层的源码以适应当地的市场或者定制自己的专属功能。显然,经第三方修改过的安卓系统,不再保证原生安卓的普适性,所以在开发时,可能会出现一些未知的BUG。因而,有条件的情况下,建议尽量选择谷歌Nexus系列的手机(设备)进行初期版本的开发测试,以保证最大的兼容性。
2. 版本号
Android版本号是不同时期发布的的Android系统版本编号,对用户而言,它限制了Android的功能特性,对开发者而言,它限制了Android编程接口的种类和数量。由于安卓版本号众多(截止2016年9月,最新的Android正式版本是7.0),各地区的迭代周期不一,导致搭载不同Android版本的设备分布很不均匀,这就是安卓版本的“碎片化”。
不过,Android各版本之间并不是完全独立,而是向后兼容的,也就是说,保证低版本的特性在高版本上也能实现,但是不保证高版本的特性可以在低版本上展示。因而,开发者选择的测试设备搭载的Android版本越低,其开发的应用兼容性就越强。可是实际开发中,不能单一考虑兼容性,还要考虑市场因素。兼容太低版本的设备会极大地限制Android新特性的体现,降低趣味性与互动性,而且还会增加维护成本。
如下图是谷歌对Android版本号的分布统计图(截止到2016年5月),可以看到,低于Android 4.0版本号的设备市场占有率已经少于3%,所以,建议Android开发者在选择手机时最低兼容到4.0就可以了。
最后,在Android开发中,初期的测试建议在Android模拟器上完成,它可以提供比手机等真实设备更广泛的特性定制。在产品逐渐成熟并计划投放到市场时,再参考以上因素,选择有代表性的手机或其它安卓设备进行调试。
⑷ 编译调试Android系统原生App - 以Settings为例
本文已过时,最新文章:向大家推荐《使用 AS 开发 System App》 https://xiaozhuanlan.com/system-app
Android原生系统带有许多原生的App,比如 浏览器、录音机、计算器、设置 等,有些时候,我们需要用到一些系统的功能,或者是对已有的功能做二次开发,比如我上学时给一个公司做过一个Launcher和Wizard,就需要用到系统设置中的某些功能,比如Wifi、声音、显示等功能,于是就需要从Settings源码中提取出需要的功能。
特别是公司自己定制Android系统,需要在上面做一些 系统级的App 的时候,原生App已有的功能就可以通过编译其源码的方式直接拿过来改改就能用,而且可用度很高。
这里有两种情况,分为 原生 的和 公司定制 的系统。无论是原生的还是定制的,类似于Settings这样需要使用到 系统级或隐藏API 的App,都需要系统签名文件和编译系统源码后得到相应的jar包才可以在IDE中编译,因为标准SDK根本没有那些API可供调用。
举个栗子:
需要额外的Jar就需要自己编译系统源码啦,这个是比较麻烦的,有兴趣可以试试自己编译定制自己的Android系统。
** 注意,既然是定制的,源码、jar、签名文件,还有系统都是一一对应的,你不能拿其他公司的系统签名来给你公司的系统app签名,这样无法运行的。 **
有了源码,下一步当然是要跑起来啦。
建议都使用Eclipse来编译,不要使用AS,因为AS编译大型的原生App能卡到你吐血,而且出错提示也不友好。但是用过AS的人都不想再碰Eclipse了有没有??别急,可以先用Eclipse编译过了,再贴到AS中,这样好很多,也很节省时间。
初始化:
放入源码:
修正res错误:
修正src错误:
使用到系统级API的,或者AndroidManifest.xml文件中声明了
那么没有系统签名,直接debug签名运行是不行的,需要向底层工程师要系统的签名文件,在源码目录
build\target\proct\security
下的 platform.pk8 和 platform.x509.pem ,如果你想看此次编译Settings是否已成功了,可以适当的在入口加一下Log,然后导出未签名的apk,使用系统签名进行签名后,放到 /system/app/ 下替换掉Settings.apk,然后重启系统,打开设置,看看Logcat是否输出里加入的Log。
在不知道系统签名可以转换成debug签名前,老实说我一直都是用Log的方式调试,太特么痛苦了。现在知道后整个人都懵逼了。
我们都希望可以像调试普通app那样调试系统app,以下是如何通过 openssl 将 platform.pk8 和 platform.x509.pem 转换成 debug.keystore 文件:
三个命令
此方法来自: http://curlog.com/2016/08/30/android-pk2debug-keystore/
Mac自带openssl,Linux和Win需要安装。
然后就可以使用得到的debug签名配置到eclipse后愉快的调试啦,当然,得先把系统中已经存在的app先删除掉。然后重启系统,至于如何配置eclipse的debug签名,请Google。
使用过AS后,当然希望在AS中也可以调试系统App,抽空再写篇相关编译和调试的文章。如果这篇文章帮到你了,给个赞呗。