360项目-14

## 自定义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已经通过了混淆,再混淆的话会出错

相关文章
相关标签/搜索