## 自定义Application ##android
- 写一个demo缓存
/**
* 自定义全局Application 应用全局的初始化逻辑能够放在此处运行
* 这是一个单例类, 整个应用只有一个
* @author Kevin
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
System.out.println("MyApplication onCreate");
}
public void doSomething() {
System.out.println("doSomething....");
}
}安全
----------------------服务器
public class MainActivity extends Activity {app
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("MainActivity onCreate");
MyApplication app = (MyApplication) getApplication();// 获取自定义的Application
app.doSomething();
}
}ide
----------------------布局
清单文件中配置网站
<application
android:name=".MyApplication".net
- 手机卫士自定义Application3d
MobileSafeApplication
## 全局捕获异常 ##
- 模拟异常, 好比int i = 1/0, 演示崩溃状况
- 代码实现
/**
* 自定义全局Application
*
* @author Kevin
*
*/
public class MobileSafeApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 设置未捕获异常处理器
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
}
class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
// 未捕获的异常都会走到此方法中
// Throwable是Exception和Error的父类
@Override
public void uncaughtException(Thread thread, Throwable ex) {
System.out.println("产生了一个未处理的异常, 可是被哥捕获了...");
// 将异常日志输入到本地文件中, 找机会上传到服务器,供技术人员分析
File file = new File(Environment.getExternalStorageDirectory(),
"error.log");
try {
PrintWriter writer = new PrintWriter(file);
ex.printStackTrace(writer);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
// 结束当前进程
android.os.Process.killProcess(android.os.Process.myPid());
}
}
}
## 代码混淆 ##
- 代码未混淆的前提下,打包,并进行反编译, 发现源码均可以看到, 很不安全
- 找到项目根目录下的文件project.properties, 打开混淆注释
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
- 分析文件proguard-android.txt
- 将proguard-android.txt文件拷贝到项目根目录,方便之后修改
proguard.config=proguard-android.txt:proguard-project.txt
- 从新打包并反编译,查看效果
- 结论: 混淆后,会将类名,方法名编译成a,b,c,d等混乱的字母, 提升代码阅读成本,加强安全性
- 注意: 混淆后致使某些功能没法正常运行, 好比涉及到aidl文件的几个模块, 包括缓存清理,挂断电话.须要在配置文件中增长以下配置:
-keep class android.content.pm.** {
*;
}
或者
-keep public class android.content.pm.IPackageDataObserver { *;}
-keep public class android.content.pm.IPackageStatsObserver { *;}
-keep public class android.content.pm.PackageStats { *;}
-keep public class android.telephony.NeighboringCellInfo { *;}
-keep public class com.android.internal.telephony.ITelephony { *;}
过滤掉全部android包名下的aidl文件, 就能保证正常运行了.
## 嵌入广告 ##
- 分析app, 广告公司, 广告平台的关系
广告平台至关于中间商, 是app和广告公司的媒介, 抽成盈利
- 盈利方式
- 展现次数, 1000次 1毛5左右 ,
- 点击次数, 1次 1毛5左右
- 有效点击, 1次 1元左右
50 0000用户 展现50 0000次 500 * 0.15元 75块
- 广告公司
有米, 百度, 360, 万普, panda
- 国外广告公司
StartApp
- 项目演示
- 在有米网平台网站上建立应用, 生成app id
- 下载SDK, 查看SDK文档
- 按照文档流程配置本地代码
- 导入jar包
- 配置清单文件
- 在主页面添加初始化代码
// 初始化广告sdk, 输入用户id和app id
// 有米广告
AdManager.getInstance(getApplicationContext()).init("e8d85a704956ee3d",
"0f78058c84a83592", true);
- 在主页面布局文件中配置广告控件 - 混淆时注意跳过广告sdk验证, 由于广告sdk已经通过了混淆,再混淆的话会出错