SDK踩坑全紀錄


No1:

Unity2017.1版本導出的android工程放到Android Studio上跑起來非常卡,Unity2017.3或4版本導出就沒問題。

對比后發現gradle文件有差異,特此標注

1)gradle版本改為2.3.0

2)sdk版本改為27或以下

3)android塊中加這句

aaptOptions {
    noCompress '.unity3d', '.ress', '.resource', '.obb'
}

資源壓縮的問題

No2:

Unity導出的android工程里暴露了唯一的Activity:UnityPlayerActivity,其實就是unity-class.jar包里的UnityPlayerActivity。

我們可以把暴露的Java類刪除,繼承unity-class.jar包里的UnityPlayerActivity,寫一個新的類,這樣的話,只要這個類實現了新的接口。Unity那邊就可以通過反射調用相同的接口,從而實現了Android與Unity之間交互。

No3:

今天一天都在找權限問題,明明在清單文件里注冊了權限,結果打成apk后,清單文件里權限就沒了,找了整整一天的原因,結果是接的sdk里隱藏了這句

<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove"    />

sdk是別人寫的,讓作者改吧

No4:

合並代碼邏輯,每新建一個分支,提交代碼后,都要合並到master主分支,原因是公共庫給其他工程用的時候,不需要找最新的版本,只需要下載master分支就是最新的了。

No5:

打包提示:Error:java.lang.RuntimeException: Some file crunching failed, see logs for details

原因:

1.構建Gradle的時候,Gradle會去檢查一下是否修改過文件的后綴名;

2.一般大多數是出現在圖片上,.jpg修改成了.png就會出現這個問題;

3.9patch圖片也可能出現這個問題。

解決方法:

gradle文件android塊中增加

aaptOptions { cruncherEnabled = false useNewCruncher = false }

No5:

錯誤:uses-sdk:minSdkVersion 1 cannot be smaller than version 4 declared in library 

原因:有類庫沒有配置最低兼容版本

解決:

defaultConfig { minSdkVersion 10 targetSdkVersion 19 }

增加即可

No6:

aar里面是不能把其他aar打進去的,解決方法只有

1.多引用一次aar

2.把aar解壓,分文件夾合成一個aar

No7:

library里如果compile了maven庫,那么library打成aar是不會包含maven里的內容的,主工程引用library打成的aar時,需要再次compile maven庫

No8:

報錯:Duplicate files copied in APK META-INF/LICENSE

解決:android塊中添加

 packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/ASL2.0' }

No9:
運行apk提示

原因:主工程的jni文件下只有x86,armeabi_v7a兩種架構,但是引入的aar或library里jni下除了x86,armeabi_v7a,還有其他的架構

解決:把多余的刪除就好了

No10:

unity導出的android工程后,我們需要刪除默認的UnityPlayerActivity啟動頁,然后再打成aar包,放到公共工程的lib中去,不然會有兩個啟動icon

No11:

maven倉庫分四種類型:group倉庫組、hosted本地倉庫、proxy代理倉庫、virtual虛擬倉庫

本地上傳的話,只能傳到hosted倉庫,所以gradle腳本只能寫

http://127.0.0.1:8081/nexus/content/repositories/thirdparty

No12:

報錯:Android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.message/com.example.message}; have you declared this activity in your AndroidManifest.xml?

原因:找不到activity,因為接入的sdk更新了,清單文件的配置改了

解決:重新接入最新版sdk

No13:

出包的時候,aar不要簽名或者不要打release包,不然apk打出來有問題,親測

No14:

apk游戲打不開,有可能是服務器端口權限沒開放

No15:

EventBus是必須用單例的,所以在不同library中,最好通過導jar的方式使用自己的EventBus

No16:

unity的onBackPressed方法是無法監聽到的,只有用監聽物理按鍵的方式去抓,還有,因為activity是繼承unityplayerActivity的,所以不要調super.onbackpressed方法!!!

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.d(TAG, "MainActivity--onBackPressed");
EventBus.getInstance().fireEvent(CommonEvents.MAIN_ACTIVITY_ON_BACK_PRESSED);
return true;
}
return super.onKeyDown(keyCode, event);
}

No17:

如何知道buildToolsVersion哪些版本是可用的?很簡單,sdk下載后能看到

No18:

Unity的登錄監聽和android層的登錄監聽可能不是同時開啟的,會導致登錄失敗,最好由unity調起android層的登錄監聽

No19:

涉及到google、facebook、twitter登錄時,apk的包名要和申請時的包名一致,否則無法登錄

No20:

facebook、twitter、google登錄需要簽名正確,facebook的簽名是后驗證的,過三天才會驗證

No21:

library的compile不會達到生成的aar中,所以需要在主工程重新compile

No22:

使用google pay提示“無法購買您要買的商品“

1.保證VersionCode,上傳的包和你測試的包一致
2.保證Payment List,google后台的單據名和你游戲中配置的一致
3.保證Payment Key,google后台key和你的key一致
4.保證Test User,你在測試階段可以正常支付你的游戲
5.保證googlePlay商店,這個一般來說只要彈出支付是沒問題的,但是如果商店無法使用,請檢查vpn
6.保證Package Name,包名一致
7.上傳到后台和測試的包簽名要一致(不一致傳不上去)
8.想要用其他谷歌賬號測試游戲,需要讓應用主賬號發送給其他賬號測試邀請連接,並讓其他賬號手動確認加入,才可以測試
9.有時候需要切換一下google后台的beta測試的發布和封閉模式,等十幾分鍾

No23:

公共模塊

問題一:app_id與app_key錯誤

  1. 沒有在經分后台配置app_idapp_key或者是填寫的app_idapp_key對不上,所以app_idapp_key參數請以經分后台為准。

問題二:反饋回來的數據渠道有錯

  1. 在配置文件中沒有根據需要上的渠道來配置,在需要上的渠道配置對應上的渠道。

問題三:登錄成功的回調沒有執行到以及部分方法沒有執行到問題

  1. 對接入的理解沒有清晰的認識,公共模塊組在對SDK進行封裝供unity游戲對接的時候,以unity游戲主動調取接口為基准,公共封裝作為一個Android SDKunity游戲對接的橋梁,只需要對Android SDk中的接口做對應封裝,不需要做過多的邏輯操作,不需要對Android SDK做主動調取,主動調取應該嚴格以unity游戲為主。

分享模塊

問題四:分享調不起或者報ShareDialog為null問題

  1. 分享的初始化沒有嚴格根據文檔的要求接入,分享的初始化應該接入到需要分享的界面即Activity界面下的onCreate()生命周期方法里面,假如你不止一個界面需要分享功能,那么初始化就不止一次,應該在需要分享的界面都初始化;其次在接入具體分享(例如Google分享)的方法時,圖片的路徑不能為空,並且路徑是手機本地圖片的具體路徑(請認真閱讀接入文檔,文檔已經詳細寫出)。

支付模塊

代碼問題

問題五:點擊登錄時彈出“please check your google account”問題

  1. 這個問題,原因有二:
  2. 1)接入googleSdk初始化接口沒有嚴格按照文檔放在指定位置。谷歌初始化需要放在登錄成功的監聽函數內。
  3. 2)手機沒有安裝GooglePlay或者沒有登錄Google帳號。
  4. google play商店 再打開一次授權就行了

非代碼問題

問題六:谷歌支付彈出界面,出現“無法購買您要買的商品”問題

  1. 在谷歌控制台“https://play.google.com/apps/publish”中,請嚴格配置好以下信息:
  2. 1)上傳到谷歌控制台的Apk版本號、簽名,和Android SDK的版本號、簽名保持一致,並確定測試版本已經在谷歌控制台發布。
  3. 2)谷歌控制台中配置需要購買的商品,且商品號與Android SDK調取的商品號嚴格保持一致。
  4. 3)測試機上的谷歌帳號已添加到谷歌控制台中的測試人員列表中,並且在已登錄該谷歌帳號的手機或者電腦中,點擊邀請鏈接並加入測試人員。
  5. 4)手機中的第一次登錄的谷歌帳號必須是邀請成功的測試帳號;或者手機中包含多個谷歌帳號,且彈出“無法購買您要買的商品”,請先刪除其他不是測試帳號的谷歌帳號再進行測試。

問題七:谷歌支付彈出其他非正常支付窗口問題

  1. 只要接入GoogleSdk后能彈出窗口,代碼都是沒有問題的。但是彈出非正常支付接口的時候,應該要考慮相關的谷歌控制台配置和Android SDK配置是否嚴格按照文檔配置。
  2. 以下為正常的配置:
  3. 1Android SDK的測試應用生成的APK已簽名,並將發布版的APK上傳到谷歌控制台。
  4. 2public key從谷歌控制台的“開發工具>權限與API”中獲取。並放到應用的配置文件中。
  5. 3)本地Android SDK的版本號、簽名與上傳到谷歌后台的APK的版本號、簽名保持一致。
  6. 4)在谷歌控制台添加測試人員帳號,並確保測試人員點擊邀請鏈接加入。
  7. 5)確保購買的商品號已經在谷歌控制台創建,並且生效,且分發地區確保已選擇了測試所在地區。

No24:

調用googlePay支付無法彈出支付界面,提示如下:

GooglePayUtil Purchase fail : Null data in IAB result (response: -1002:Bad response received)

原因:google play的權限管理中

 

No25:

android studio的setting的file encoding都改成utf-8了,中文還是亂碼

在build.gradle中加如下代碼

tasks.withType(JavaCompile) { options.encoding = "UTF-8" }

No26:

下載jenkins.war包后,進入Jenkins.war包目錄下,運行java -jar jenkins.war時報端口被占用的錯誤:java.net.BindException: Address already in use: bind

解決方法:修改Jenkins端口java -jar jenkins.war --httpPort=8081   8081不行就改8082

No27:

 No28:

查看apk簽名:

首先用解壓軟件解壓出META-INF目錄下的CERT.RSA文件

執行keytool -printcert -file D:\Desktop\CERT.RSA

或者直接keytool -printcert -jarfile apk路徑

No29:

游戲登陸小米賬號失敗,返回錯誤碼-102,界面提示《游戲服務》鑒權失敗,無法登錄。。。

解決方案:就算游戲沒有內購的計費點,小米開放平台也必須隨便配一個計費點,好坑啊!

No30:

編譯提示:Could not find com.android.support:support-v4:26.0.2.

原因:support annotations自25.4.0之后support包不在sdk中更新了,需要用谷歌的maven庫

解決方案:在主工程下添加

allprojects{ repositories{ maven{url "https://maven.google.com"} maven{url "https://dl.google.com/dl/android/maven2"} } }

No30:

接入UC的sdk時候,需要從后台下載一張九游的圖片,底部有gameid

這個gameid每個游戲都不一樣,還不能直接用ps改,必須從uc后台下載

No31:

華為手機沒有打印日志

1.在撥號界面輸入“*#*#2846579#*#*”

2.依次進入“后台設置-->2.LOG設置-->LOG開關”,選擇“LOG打開”

No32:

Windows命令查看文件MD5:

certutil -hashfile yourfilename.ext MD5

certutil -hashfile yourfilename.ext SHA1

certutil -hashfile yourfilename.ext SHA256

No33:

git分支名稱對大小寫是不敏感的,比如master主分支,你checkout Master也是可以切過去的,但是git pull會報錯

No34:

Jenkins改名字的話,如果項目依賴了服務器上的資源,有可能導致打包失敗,因為找不到以前的資源了

No35:

應用運行的時候如何報libxxx.so- text relocations的錯誤,原因是so庫里的targetSdk版本低於build.gradle的targetsdk版本,把targetsdk版本改小(一般小於23)就可以了

No36:

小米渠道提審的時候提示簽名和之前的不一致,而且提示每次提審的簽名都不一樣

原因,payment權限導致的

解決:清單文件刪除 <uses-permission android:name="com.xiaomi.sdk.permission.PAYMENT" /> 

在MiCommplatform.Init之前增加MiCommplatform.setNeedCheckPayment(false);

No37:

如果compile遠程地址,產生了jar包沖突。

其實這些遠程依賴的jar包編譯后是下載到了本地的,路徑是C:\Users\Administrator\.gradle\caches\modules-2\files-2.1

然后對應去找沖突的jar包,復制出來,改成本地依賴,去掉沖突的.class文件即可

No38:

安裝ubuntn后啟動報錯提示:此主機支持Intel VT-x,但Intel VT-x處於禁用狀態

解決方案:重啟電腦(不是虛擬機),按F2進入設置頁,找到advanced->intel virtual technology,把disabled改為enabled

No39:

啟動ubuntn時報錯:The root filesystem on /dev/sda1 requires a manual fsck

解決方案:

硬盤sda1檢測出現問題了,我用的解決辦法是輸入代碼:fsck -c /dev/sda1

執行后一直按y,然后就成功了,再重啟就好了

No40:

搜狗sdk1)手機號驗證碼登錄 2)搜狗賬號注冊 3)電腦注冊,app登錄 這三種情況都提示ERROR_CODE:2001

原因:無效應用,參數錯誤

No41:

打包提示:Failed to execute aapt

原因:清單文件有些資源是不存在的,需要刪掉

No42:

QQ接入sdk后使用qq賬號登錄,提示:該應用非官方正版應用,請去應用寶下載正版后進行qq登錄(錯誤碼100044)

原因:

1)如果游戲已上線,就是簽名和線上簽名不一致,還有可能是appid不對

2)如果游戲還沒上線,是因為沒上線的游戲屬於測試環境下,要用調試的開發者qq賬號才可以登錄

No43:

打包提示:找不到apply plugin: 'com.android.library'或者apply plugin: 'com.android.application' 其實是gradle沒引用

解決方案:在build.gradle里加入

buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' } }

No44:

打包提示:Failed to execute aapt

原因:有些資源找不到

No45:

打包報錯:Can't process class [com/swiftfintech/pay/utils/Util.class] (Unknown verification type [9] in stack map frame))

原因:jar包沖突,刪除即可

No46:

清單文件中多個替換是用逗號隔開

tools:replace="android:windowSoftInputMode,android:configChanges"

No47:

搜狗banner廣告的關閉按鈕是搜狗后台配置的,需要找搜狗的人打開

No48:

bycond對比工具失效解決辦法

1)cmd運行命令whoami /user 得到SID

2)修改SID后運行reg delete "HKEY_USERS\<SID>\Software\Scooter Software\Beyond Compare 4" /v CacheId /f 

No49:

打包提示清單文件沖突,出來一大坨,搜索error能確定具體的那個

No50:

有時候不在主工程,但是需要拿到資源id,通過以下方法

activity.getResources().getIdentifier(resName,"layout",activity.getPackageName())

如果是xml中的id,就這樣寫

activity.getResources().getIdentifier(resName,"id",activity.getPackageName())

就是說,本來R.XXX.資源名,XXX是什么,第二個參數就是什么

No51:

如果打包的時候報錯找不到另一個module的資源,在build.gradle里增加

compile project(path: ':module的名字')
即可

No52:

傾斜的TextView和ImageView根本不需要自定view去實現,xml中自帶屬性
android:rotation="-5"
填寫響應的角度就可以了
No53:
json解析如果存在兩個相同的字段,值會被覆蓋,小心
No54:
做開屏遇到一個問題,倒計時和跑馬燈同時存在,倒計時會導致跑馬燈每秒重新開始,出現一頓一頓的效果
解決方案是將跑馬燈或者倒計時的寬度布局改為固定寬度
No55:
騰訊和廣點通的sdk,騰訊登陸頁要在開屏也之前才能掃碼支付
No56:
引用本地aar,當A引用了一個aar,如果B依賴了A,那么B的build.gradle里也要加aar的路徑

No57:

如果打包的時候報錯找不到另一個module的資源,在build.gradle里增加

No58:

使用androidstudio打jar包:

在module的build.gradle中

task makeJar(type:Jar){ from('build/intermediates/packaged-classes/debug/') //從這個目錄下取出默認jar包
    into('build/') //將jar包輸出到指定目錄下
    include('classes.jar') rename('classes.jar', 'TestJar_V1.0.jar') //自定義jar包的名字
}

注意:gradle2.3的from路徑是from('build/intermediates/bundles/release/'),gradle3.1的from路徑是from('build/intermediates/packaged-classes/debug/')

makejar之前要先assembleDebug一下,生成aar,其實makejar就是把aar里的class.jar拿出來而已

No59:

Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig()); 

中source.getConfig()有可能為null;

source.getConfig()要改為source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888

No60:

打包報錯

If you are using the 'java' gradle plugin in a library submodule add targetCompatibility = '1.7' sourceCompatibility = '1.7' to that submodule's build.gradle file.

原因是導入的第三方jar包用的是JDK1.8編譯的,而你本地的工程或者工程里的插件是用JDK1.7編譯的

解決方案

android{ defaultConfig{ jackOptions{
           enabled true
          }
} compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

jackOptions看你本地工程情況,可加可不加

No61:

在android開發的時候,有時候會遇到這樣的問題

Error:Execution failed for task ':test:processDebugManifest'.> Manifest merger failed with multiple errors, see logs
但是要命的是,除了這個log,沒有什么其他的有用信息了,怎么辦?

處理方式是這樣的: 
首先進入命令行,輸入命令

gradlew processDebugManifest --stacktrace

其中,processDebugManifest是log里面提到的,這個命令是會了獲取更多的log信息。

No62:

unity出aar資源打包以后,app按電源鍵再打開會繞過鎖屏。原因是打release和打debug包,dll文件會不一樣,最好用release包來測

No63:

打包報錯:與元素類型 “item” 相關聯的 “name” 屬性值不能包含 ‘<’ 字符

到sdk目錄下找到/platform-tools/api/annotations.zip這個文件並解壓。

用記事本打開以下兩個文件,並且把標簽內的 ‘<’ 和 ‘>’ 字符分別替換成 "&lt;” 和 “&gt;”。

android/accounts/annotations.xml
android/hardware/camera2/annotations.xml
android/hardware/camera2/params/annotations.xml
android/app/slice/annotations.xml
android/widget/annotations.xml
android/view/annotations.xml
android/view/textclassifier/annotations.xml
android/bluetooth/le/annotations.xml
android/media/annotations.xml
android/preference/annotations.xml
android/text/annotations.xml
保存並壓縮,替換掉原來的annotatio

No64:

打包報錯:Too many classes in --main-dex-list

顧名思義就是主dex里的class太多了,其實已經設置了multiDexEnabled為true,但還是無效,這時候就需要dex刀來顯威力了

buildscript {

    dependencies {
        ...
        classpath 'com.ceabie.dextools:gradle-dexknife-plugin:1.5.9'
    }
}
apply plugin: 'com.ceabie.dexnkife'

在build.gradle同級新增一個dexknife.txt文件

# 全局過濾, 如果沒設置 -filter-suggest 並不會應用到 建議的maindexlist.
# 如果你想要某個包路徑在maindex中,則使用 -keep 選項,即使他已經在分包的路徑中.
-keep android.support.v4.view.**

# 這條配置可以指定這個包下類在第二dex中.
android.support.v?.**

# 使用.class后綴,代表單個類.
-keep android.support.v7.app.AppCompatDialogFragment.class

# 不包含Android gradle 插件自動生成的miandex列表.
-donot-use-suggest
-split **

# 將 全局過濾配置應用到 建議的maindexlist中, 但 -donot-use-suggest 要關閉.
#-filter-suggest

# 不進行dex分包, 直到 dex 的id數量超過 65536.
-auto-maindex

# dex 擴展參數, 例如 --set-max-idx-number=50000
# 如果出現 DexException: Too many classes in --main-dex-list, main dex capacity exceeded,則需要調大數值
-dex-param --set-max-idx-number=65536

# 顯示miandex的日志.
-log-mainlist

# 如果你只想過濾 建議的maindexlist, 使用 -suggest-split 和 -suggest-keep.
# 如果同時啟用 -filter-suggest, 全局過濾會合並到它們中.
-suggest-keep android.support.multidex.**

No65:

webview加載H5頁面時,如果無法彈出對話框,增加如下設置即可

WebView.setWebChromeClient(new WebChromeClient());

即可

No66:

報錯

Failed resolution of: Lorg/apache/http/params/BasicHttpParams;

原因是android 9.0限制了http,強制用https,第三方sdk也必須用https

解決方案在清單文件application中加入

<uses-library android:name="org.apache.http.legacy" android:required="false" />

即可

No67.

華為手機底部導航欄導致布局無法撐滿整個屏幕,這時候就需要隱藏導航欄

//隱藏虛擬按鍵,並且全屏
protected void hideBottomUIMenu() {
    if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) {
        View v = mActivity.getWindow().getDecorView();
        v.setSystemUiVisibility(View.GONE);
    } else if (Build.VERSION.SDK_INT >= 19) {
        View decorView = mActivity.getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

No68.

報錯,原因是Android P 后谷歌限制了開發者調用非官方公開API 方法或接口

解決方案是在Application中調用

private void closeAndroidPDialog(){
    try {
        Class aClass = Class.forName("android.content.pm.PackageParser$Package");
        Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);
        declaredConstructor.setAccessible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        Class cls = Class.forName("android.app.ActivityThread");
        Method declaredMethod = cls.getDeclaredMethod("currentActivityThread");
        declaredMethod.setAccessible(true);
        Object activityThread = declaredMethod.invoke(null);
        Field mHiddenApiWarningShown = cls.getDeclaredField("mHiddenApiWarningShown");
        mHiddenApiWarningShown.setAccessible(true);
        mHiddenApiWarningShown.setBoolean(activityThread, true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

No69:

報錯:java.lang.UnsatisfiedLinkError

解決:build.gradle里增加

ndk {
     abiFilter "armeabi-v7a"
}

 

歡迎關注我的微信公眾號:安卓圈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM