360项目-14

本文介绍如何自定义Application类以实现全局初始化逻辑,并展示了如何通过全局异常捕获来提高应用稳定性。此外,还详细讲解了代码混淆的方法及其注意事项。最后,通过实例介绍了如何在应用中嵌入广告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

## 自定义Application ##

- 写一个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 {

            @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();
            }
        }

        ----------------------

        清单文件中配置

          <application
                android:name=".MyApplication"


- 手机卫士自定义Application

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

 

转载于:https://my.oschina.net/u/2884845/blog/784012

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值