事象の水平線

横を無理やり伸ばしたので、デザインがおかしいけど、気にしない。完璧に時代に取り残されたHTMLをいまさらいじるのがめんどくさい。個人的ブックマーク代わりなメモ書きブログ。

APK Expansion でうまく動かないと思ったら、googleのソースにバグがあったのでメモ。

APK Expansion に関するwhat? how? は以下参照
Expansion Filesについて(1) - obb作成編 - キノコの自省録
Expansion Filesについて(2) - obb利用編 - キノコの自省録
Expansion Filesについて(3) - obbダウンロード編 - キノコの自省録
[android] APK Expansion Files | Drowsy Dog's Diary
[android] APK Expansion Files(2) | Drowsy Dog's Diary
Androidの拡張ファイルから動画を再生する | Kludge factory
APK Expansion Files – チラシの裏

jobb を使って作ったobbはマウントできない環境があるとかないとか。
で、無圧縮zipがいけるぽいのでやってみた。

で、LibraryとしてReferする以下のコードがbugっぽい。

public class APKExpansionSupport {
// The shared path to all app expansion files
private final static String EXP_PATH = "/Android/obb/";

static String[] getAPKExpansionFiles(Context ctx, int mainVersion, int patchVersion) {
String packageName = ctx.getPackageName();
Vector ret = new Vector();
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// Build the full path to the app's expansion files
File root = Environment.getExternalStorageDirectory();
File expPath = new File(root.toString() + EXP_PATH + packageName);

// Check that expansion file path exists
if (expPath.exists()) {
if ( mainVersion > 0 ) {
String strMainPath = expPath + File.separator + "main." + mainVersion + "." + packageName + ".obb";
File main = new File(strMainPath);
if ( main.isFile() ) {
ret.add(strMainPath);
}
}
if ( patchVersion > 0 ) {
String strPatchPath = expPath + File.separator + "patch." + mainVersion + "." + packageName + ".obb";
File main = new File(strPatchPath);
if ( main.isFile() ) {
ret.add(strPatchPath);
}
}
}
}
String[] retArray = new String[ret.size()];
ret.toArray(retArray);
return retArray;
}
これ、コードをコピペして書き換え忘れちゃいました。じゃないんでしょーか。
patch がわのFile main は名前だけの問題なんで実質関係ないですが。

これによって、バージョン違いのpatchからデータが取り出せず。という状況になりました。
で、赤文字のint mainVersion を patchVersion へ書き換えて動いたわけですが。
ちなみに、mainとpatchと両方ともzipファイルで無いとzipファイルじゃないよとか言って落ちます。

ちなみにちなみに、Accessing expansion patch files bug (and solution)なんてのが2014年に書かれているけど。直ってないんですね。いまだにEclipseでやってるんで、AndroidStudioだとSDK直ってるとかないですよね?

PageTop
検索で出てくるのは、情報が古いものが多い。
libraryで引っかかった気がしたら、”proguard libraryName”で検索するのが速そう。

基本的なことは【AndroidでのProGuard 使い方】とか参照

以下メモ。

【Android】難読化ツールProguard設定まとめ
http://kontany.net/blog/?p=86
<<引用>>
でproguardが適用されるのは、リリースビルドされる時です。
まず、ビルドの詳細ログが見られるようにするため、設定を変更します。
[Window] → [Preference] → [Android] → [Build] → [Build output]と順に選択していき、[Verbose]を選択。


吐かれるログを見て、無事終了したらプロジェクト直下に新たに「proguard」フォルダが生成され、中には「dump.txt」「mapping.txt」「seeds.txt」「usage.txt」の計4ファイルが入っている。
エラーが出た場合は、基本的にエラーで怒られたクラス名などを-keepしてあげれば改善される。まぁ個々は頑張るしかない。
(コンソールにBuild Logが流れてるようなときは、青いPCアイコンからAndroidに切り替えて見れる@Eclipse)
console_android.png


bug?
大量に出る
Warning: com.google.common.base.Equivalence: can't find referenced class javax.annotation.Nullable

こんなやつ(おそらくcommons.codec)
<<以下参照>>
http://stackoverflow.com/questions/27423614/add-jar-file-path-added-in-library-project-in-proguard
http://d.hatena.ne.jp/rudi/20110205/1296914415
http://qiita.com/amay077/items/328cd2dd6ad6d483b7b1
以下を追加(無視)で解決らしい
-dontwarn com.google.common.**




Android で Proguard を使う(ADT17以降)
http://qiita.com/amay077/items/328cd2dd6ad6d483b7b1
<<引用>>
-libraryjars について
外部ライブラリを使っている(/libs に jar を入れてる)場合、それらを -libraryjars xxx.jar と列挙しなければならないと 思っていた が不要らしい。
-libraryjars に列挙したら最初の一つしか library jar として認識してくれなくて「なにこれ?」と思ってググったら、
Using ProGuard with Android - StackOverflow 回答日-2012/06/28
1) ProGuard manual > Troubleshooting > Note: duplicate definition of program/library class
The Android Ant/Eclipse builds already specify -injars/-libraryjars for you. If you specify them again in your configuration, ProGuard notes that they are duplicated. So don't specify -injars/-libraryjars.
libs配下は既定で定義済だから proguard-project.txt の方で再定義しなくてよいらしい




proguard with sqlcipher
<<以下参照>>
https://gist.github.com/developernotes/3040592
結局以下だけでOK
-keep class net.sqlcipher.** { *; }




proguard with conceal
<<以下参照>>
https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-facebook-conceal.pro
以下を追加でOK
# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.proguard.annotations.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.proguard.annotations.DoNotStrip *;
}

-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
void set*(***);
*** get*();
}



<<参照>>
ProGuardとLogCatとAdMobが織りなす罠
結局Logcatは手で消そうかな。と思った。

PageTop
AuBee elm (covia Fleaz neo) をFoma SIM用に買ったので AnTuTu v6.0.1 をやってみた。メモ。
ついでに比較で、bnp500、priori2(FT142A)、MemoPad HD7(ME173)

AuBee elm
CP-B43.png

BNP500
BNP500.png

Priori2 (FT142A) kitkat
FT142A.png

MemoPad HD7 (ME173)
ME173.png

PageTop
BLUEDOT BNP-500k (Archos 50b Oxygen) が、中華スマホにありがちな『ナビゲーションキーの戻るが右側』だったので、左側のメニューキーと入れ替えてみました。
ADBです。   rooted端末でやってますが、root要らないんじゃないかな?たぶん。

1./system/usr/keylayout/Generic.kl にキー割り当てが記述されているので、PCに持ってきます。
PC側のローカルのパスはお好きな場所でどうぞ。(一例としてデスクトップにしてます)

>adb pull /system/usr/keylayout/Generic.kl C:\Users\xxx\Desktop
444 KB/s (9096 bytes in 0.020s)


テキストファイルとして開くと、こんな感じだったので
~~略~~
key 139 MENU WAKE_DROPPED
key 140 CALCULATOR
# key 141 "KEY_SETUP"
key 142 POWER WAKE
key 143 POWER WAKE
# key 144 "KEY_FILE"
# key 145 "KEY_SENDFILE"
# key 146 "KEY_DELETEFILE"
# key 147 "KEY_XFER"
# key 148 "KEY_PROG1"
# key 149 "KEY_PROG2"
key 150 EXPLORER
# key 151 "KEY_MSDOS"
key 152 POWER WAKE
# key 153 "KEY_DIRECTION"
# key 154 "KEY_CYCLEWINDOWS"
key 155 ENVELOPE
key 156 BOOKMARK
# key 157 "KEY_COMPUTER"
key 158 BACK WAKE_DROPPED
~~略~~


2.以下のようにMenuBackを 入れ替えて保存
~~略~~
key 139 BACK WAKE_DROPPED
key 140 CALCULATOR
# key 141 "KEY_SETUP"
key 142 POWER WAKE
key 143 POWER WAKE
# key 144 "KEY_FILE"
# key 145 "KEY_SENDFILE"
# key 146 "KEY_DELETEFILE"
# key 147 "KEY_XFER"
# key 148 "KEY_PROG1"
# key 149 "KEY_PROG2"
key 150 EXPLORER
# key 151 "KEY_MSDOS"
key 152 POWER WAKE
# key 153 "KEY_DIRECTION"
# key 154 "KEY_CYCLEWINDOWS"
key 155 ENVELOPE
key 156 BOOKMARK
# key 157 "KEY_COMPUTER"
key 158 MENU WAKE_DROPPED
~~略~~


3.保存したファイルを、端末へ戻します。

>adb push C:\Users\xxx\Desktop\Generic.kl /system/usr/keylayout/Generic.kl
failed to copy 'C:\Users\xxx\Desktop\Generic.kl' to '/system/usr/keylayout/Generic.kl'
: Read-only file system

#読み込み専用と怒られたので、shellで読書き(rw)でマウントしなおします。

>adb shell

root@BNP-500:/ # mount -o rw,remount /dev/block/mtdblock3 /system
mount -o rw,remount /dev/block/mtdblock3 /system
root@BNP-500:/ # exit
exit

>adb push C:\Users\xxx\Desktop\Generic.kl /system/usr/keylayout/Generic.kl
555 KB/s (9096 bytes in 0.016s)

#うまくいったようなので、パーミッションを確認しておきます。


>adb shell
root@BNP-500:/ # ls -la /system/usr/keylayout
ls -la /system/usr/keylayout
-rw-r--r-- root root 165 2014-09-03 21:04 ACCDET.kl
-rw-r--r-- root root 894 2014-09-03 21:03 AVRCP.kl
-rw------- root root 9096 2016-01-07 18:14 Generic.kl
-rw-r--r-- root root 737 2014-09-03 21:03 Vendor_0079_Product_0011.kl
~~以下略~~

#パーミッションが600なので、644にしてあげます。


root@BNP-500:/ # chmod 644 /system/usr/keylayout/Generic.kl
chmod 644 /system/usr/keylayout/Generic.kl
root@BNP-500:/ # ls -la /system/usr/keylayout
ls -la /system/usr/keylayout
-rw-r--r-- root root 165 2014-09-03 21:04 ACCDET.kl
-rw-r--r-- root root 894 2014-09-03 21:03 AVRCP.kl
-rw-r--r-- root root 9096 2016-01-07 18:14 Generic.kl
-rw-r--r-- root root 737 2014-09-03 21:03 Vendor_0079_Product_0011.kl
~~以下略~~

root@BNP-500:/ #


あとは、端末を再起動。
で、うまくいきました。

<<参考>>
Galaxy S4(SC-04E)のボタンの機能割り当てをAndroid純正ROM(AOSP)風に変更する方法。
よく使うadbのコマンド
[Android] Read-only file system

PageTop
BNP-500の分割Romを何とかしようとrooted後、Eclipseからデバッグしようとしたら、
Installation failed due to invalid APK file!
といわれて、ADB経由でインストールが出来ない。

で、結論はStack Overflowの以下にありました。
Permission denied causing “Installation failed due to invalid APK file”
Eclipse installation failed due to invalid APK file?

Try this over ADB:

# cd /data/local
# mv tmp tmp-old # (or simply rm -rf tmp)
# mkdir /mnt/sdcard/tmp
# ln -s /mnt/sdcard/tmp ./tmp


ということ。
詳しくは、Stack Overflow を読んでください。

当初、端末のターミナルからやってだめでしたが、PCからADB経由でうまくいきました。

PageTop