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已經通過了混淆,再混淆的話會出錯

相關文章
相關標籤/搜索