> 1.ant打包完成:AndResguard(微信资源包混淆)
> 2.jenkins项目自动化(自动化构建android项目)
> 3.sqlitecipher数据库加密
> 4.https编程(服务器配置+客户端编程):银行、金融领域使用,
> 5.逆向编程:在加密算法安全领域使用,解决陌生类编码
> 6.leakcanary:分析检测内存泄漏(支付宝、淘宝、京东商城)
> 7.二维码:zxing,扫描+生成
### 01.android打包流程
> 1.生成R文件-> R.java,调用sdk的aapt.exe
> 2.编译aidl->生成java文件,调用aidl.exe
> 3.编译java文件 -> 生成class文件,调用1.7jdk的javac
> 4.解压第三方jar包 -> 生成class文件,调用jdk的jar
> 5.生成classes.dex文件,调用sdk的dx.bat
> 6.编译资源文件,生成resources.ap_,调用aapt
> 7.生成未签名apk,调用apkbuilder
> 8.生成签名apk,使用keystore
### 02.微信资源包混淆介绍
> 微信资源包混淆项目:[https://github.com/shwenzhang/AndResGuard](https://github.com/shwenzhang/AndResGuard)
![](img/tu16.png)
> 资源包混淆作用
* 1.避免其他人拷贝图片资源
* 2.把apk变小(apk瘦身步骤)
> 开发中到底用不用:看需求,可以使用资源包混淆,
### 03.微信资源包混淆AndResguard常用命令
> 1.配置config.xml文件
> 2.简单命令(对签名和未签名apk都可以)
java -jar andresguard.jar ..\build\MobileSafe_signed.apk
> 3.指定配置文件或输出目录
java -jar andresguard.jar ..\build\MobileSafe_signed.apk -config config.xml -out heima
> 4.使用7zip打包
java -jar andresguard.jar ..\build\MobileSafe_signed.apk -config config.xml
-7zip 7za.exe -out heima_new
### 04.ant打包手机卫士-集成AndResguard
### 05.jenkins安装
> jenkins网站:[https://jenkins.io/](https://jenkins.io/)
> 安装:资料/jenkins.msi
> 安装完成:自动打开浏览器使用8080端口
### 06.jenkins系统配置
> 修改端口号,不能使用8080
> 打开安装目录jenkins.xml
--httpPort=18080
> 重启服务器
> 系统管理/系统设置:配置jdk和ant环境
![](img/tu17.png)
### 07.jenkins项目自动化-项目提交到SVN
> 1.VisulSVN服务器:创建仓库
> 2.SVN Checkout:和SVN服务器关联
> 3.文件添加到版本控制
> 4.commit提交到服务器
### 08.jenkins项目自动化-项目配置
> 1.使用jdk
> 2.管理SVN版本服务器仓库地址:通过用户名/密码授权
> 3.使用ant构建:选择任务名
### 09.jenkins项目自动化-手动构建
![](img/tu18.png)
> 1.从SVN服务器检出代码
### 10.android项目版本更新周期
> 多长时间更新一次版本:
标准:1个月、一个多月更新一次
遇到节节假日:比如双十一,发布活动版本,可能周期更快
不标准:1周更新一次、一天更新,不建议(用户体验差)
### 11.jenkins项目自动化-自动构建
> 定时打包:构建触发器/设置构建周期(最快频率2分钟)
> 需要获取输出apk文件:配置存档文件
### 11.jenkins项目自动化-自动构建(2)
> 遇到构建失败,配置存档文件**/*.apk报红色警告,重新创建新项目(不要重名)
### 12.https介绍
> 访问安全网站CA结构校验是否安全
> CA:授权机构,赛门铁克、交钱认证https网站
> 实现山寨百度,是https
### 13.https服务器配置
> 如何把一个http编程https安全网站
> tomcat文档:[http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html](http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html)
> 配置https的keystore
apache-tomcat-7.0.72\conf\server.xml
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="conf/meituan.jks" keystorePass="123456"
clientAuth="false" sslProtocol="TLS" />
### 13.https客户端编程-信任管理器
//通过信任管理器工厂生成管理器
TrustManagerFactory tfm = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//为了能够访问没有认证的https网站,
// 需要设置信任管理器(相当于保安)
//1.创建安全上下文对象:看api文档
SSLContext context = SSLContext.getInstance("TLS");
//2.管理信任管理器
TrustManager[] tm = tfm.getTrustManagers();
context.init(null, tm, null);//逆向编程:先写对象,通过快捷键创建对应类型
HttpsURLConnection conn = (HttpsURLConnection) new URL("https://10.0.2.2:8443/heima.json").openConnection();
ins = conn.getInputStream();
//使用信任管理器
conn.setSSLSocketFactory(context.getSocketFactory());
### 15.https客户端编程-导出证书
> 通过keystore导出证书
keytool -exportcert -alias meituan -file meituan.cer -keystore meituan.jks
### 16.https客户端编程-使用证书
TrustManagerFactory tfm = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
CertificateFactory cf = CertificateFactory.getInstance("X.509");
ks.load(null);//清空默认证书信息
InputStream certIn = getAssets().open("meituan.cer");
Certificate cert = cf.generateCertificate(certIn);//证书对象
certIn.close();
ks.setCertificateEntry("meituan", cert);
tfm.init(ks);//初始化信任管理器工厂
### 17.sqlite数据库加密介绍
> 正式项目有数据:缓存数据到本地(文件、db)
> QQ联系人、微信聊天记录
> 不加密:神庙逃亡(绿砖,死亡复活),损失非常大,
### 18.sqlite数据库-不加密
/**
* 添加到数据库
* @param v
*/
public void insert(View v) {
String content = mEt.getText().toString().trim();
BaseOpenHelper openHelper = new BaseOpenHelper(mContext);
SQLiteDatabase db = openHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", content);
db.insert("t_user",null, values);
db.close();
//清空内容
mEt.setText("");
}
/**
* 查询
* @param v
*/
public void query(View v) {
BaseOpenHelper openHelper = new BaseOpenHelper(mContext);
SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor cursor = db.query("t_user", new String[]{"username"}, null, null, null, null, null);
if(cursor != null){
while(cursor.moveToNext()){
//遍历数据
String username = cursor.getString(0);
System.out.println(username);
}
cursor.close();
}
db.close();
}
### 18.sqlite数据库加密实现
> sqlite数据库加密项目:[https://github.com/sqlcipher/sqlcipher](https://github.com/sqlcipher/sqlcipher)
![](img/tu19.png)
> 不能使用android sqlite包名,使用别人的
> 获取SQLiteDatabase需要传入密码
String content = mEt.getText().toString().trim();
BaseOpenHelper openHelper = new BaseOpenHelper(mContext);
SQLiteDatabase db = openHelper.getWritableDatabase(password);
ContentValues values = new ContentValues();
values.put("username", content);
db.insert("t_user",null, values);
db.close();
//清空内容
mEt.setText("");
### 19.leakcanary检测内存泄漏介绍
> 内存泄漏和内存溢出
内存泄漏:水龙头漏水,一滴一滴
内存溢出:盆接水,盆满了溢出,OOM
> 为什会泄漏内:退出页面,对象没有被及时回收
### 20.leakcanary集成依赖
> 支付宝/设置/关于/版权信息:里面有开源项目leakcanary
> 多使用开源项目:提供开发效率
> 添加依赖:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
> 出现入口Application初始化
private Context context;
public static RefWatcher getRefWatcher(Context context) {
GalaxyApplication application = (GalaxyApplication) context.getApplicationContext();
return application.refWatcher;
}
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
//初始化Leak
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
refWatcher = LeakCanary.install(this);
}
### 21.leakcanary检测内存分析
> 基类检测内存泄漏
RefWatcher refWatcher = GalaxyApplication.getRefWatcher(getContext());
refWatcher.watch(this);
![](img/tu20.png)
### 22.leakcanary-单例导致的内存泄漏
> leakcanary上线前分析内存,不能发布上线
> 解决方案:应用上线不能出现leakcanary图标,没有leakcanary 吐司
> 使用版本控制分支解决
> 1.初始化git
git init
git add .
git commit -m "first commit"
> 2.创建新的分支:专门用户集成leak项目
### 23.内存泄漏产生原因
> 1.不要过多使用static成员变量:基本数据类型可以static,对象数据类型不建议static
> 2.Context不建议static,如果使用static指向application
> 3.数据库用完关闭
> 4.Cursor使用完关闭
> 5.流使用完成关流
### 24.二维码zxing使用-集成zxing
> 参考文档:[https://github.com/open-android/Zxing](https://github.com/open-android/Zxing)
### 25.二维码zxing使用-生成二维码
public void gencode(View v) {
String content = mEt.getText().toString().trim();
Bitmap bitmap = null;
try {
bitmap = BitmapUtils.create2DCode(content);
mIv.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
### 26.二维码zxing使用-扫码
public void scan(View v){
//startActivity(new Intent(MainActivity.this, CaptureActivity.class));
//扫描完成获取结果
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQCODE_SCAN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//获取返回结果
String result = data.getStringExtra("qrcode_result");
Toast.makeText(this, ""+result, Toast.LENGTH_LONG).show();
if(requestCode == REQCODE_SCAN){
/* String result = data.getStringExtra("qrcode_result");
Toast.makeText(this, ""+result, Toast.LENGTH_LONG).show();*/
}
}
### 27.二维码zxing使用-处理扫码结果
if(requestCode == REQCODE_SCAN){
/* String result = data.getStringExtra("qrcode_result");
Toast.makeText(this, ""+result, Toast.LENGTH_LONG).show();*/
String result = data.getStringExtra("qrcode_result");
Toast.makeText(this, "" + result, Toast.LENGTH_LONG).show();
if(result.contains("http://")){
//网站:浏览器打开,隐式意图打开
/*
*/
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");
intent.setData(Uri.parse("http:" + result));
startActivity(intent);
}
}