Admob からメール「最新版の SDK にアップグレードしてください」

Android で Admob 利用のアプリ開発者にはメールがきてるはず.

受信トレイ

8/1 にサービス終了するという古い Admob SDK ライブラリの件っぽい.

Android 向け Google AdMob SDK(単体版)のサポート終了について
Play ストアでは、単体版の Google AdMob SDK を利用する新規アプリやアップデートされたアプリの受付を 2014 年 8 月 1 日をもって終了いたします。この単体版の SDK は広告 ID をサポートしていないため、この日以降は Google Play 広告ポリシーに準拠したものではなくなります。

で, 「新しい Admob の実装をしなさい」という話のよう.

そのときの利点は以下であると書いてある.

端末識別子を全面的にサポート
Google の iOS や Google Play 向けのサービス SDK で、Android 広告 ID などの匿名の端末識別子が全面的にサポートされるようになりました。こうした識別子が使えるようになることで、マーケティング担当者は価値の高いユーザー に的確にアプローチして接点を持つことが可能となり、開発者は eCPM や広告掲載率の向上によって収益性を高めることができます。

シームレスな自動アップデート(Android)
このたび Google Mobile Ads SDK が Google Play サービスに完全に統合されました。これにより、アプリで AdMob のマイナー アップデートとパフォーマンスの改善が自動化されるようになり、APK のアップデートや Play ストアへの再送信が不要になります。

けどまあ, 利点がなくても 8/1 には変更実装しなければならないということなので実際にやってみよう, と.

Google が指定するリファレンスページは以下.

Downloads - Google Mobile Ads SDK — Google Developers

スタート ガイド - Google Mobile Ads SDK — Google Developers

Google Play 開発者サービスへの移行 - Google Mobile Ads SDK — Google Developers

ざっと見て変更項目は3つっぽい.

1. ライブラリ参照先の変更
2. AndroidManifest.xml の変更
3. ソースコードの変更

とりま, やってみた.

続きを読む >>


AndroidStudio からアプリを停止したりデータを消したりアンインストールできるプラグイン「ADB Idea」

Android Studio から 現在作業しているアプリに対して以下の操作がターミナルを開けることなく, GUI上から操作できます.

ADB Uninstall App
ADB Kill App
ADB Start App
ADB Restart App
ADB Clear App Data
ADB Clear App Data and Restart

アプリを停止したり, そのアプリ内のデータを削除する場合などに便利です.

Android Studio(IDEA) のプラグインとして, 公開されています.

JetBrains Plugin Repository :: ADB Idea

pbreault/adb-idea · GitHub

Android Studio 上からは, [Preferences]-[Plugins] から検索してインストールできます.

Browse_Repositories_と_Preferences

インストール後, 前述のADBコマンドを実行する方法は2通り.

続きを読む >>


Android Studio [Help] メニューから [Search] で設定項目に素早くたどりつけるようになってた件

しれっと機能追加されてたのか,

いや, 気付かなかっただけのか.

上部メニュー[Help]から[Search]に設定したい単語を入力すると,

その下に関係する設定項目がプルダウンなかんじでサジェストされるのですが,

そのサジェスト項目を選択すると,

上部のメニューそれぞれが自動でビロ~ンとプルダウンされて,

どこからその設定画面に行けるのか分かりやすくなってる.

例)「import」関連の設定項目を探したい場合

VCS_と_Help

設定項目が多くて行ったり来たりして, めんどくさかった設定変更が

素早く移動できて設定の試行錯誤したいとき便利になってます.という話.

以下, 「Find Action」と併用すればさらに便利になるでしょう.

AndroidStudioの設定場所やショートカットは「FindAction(テキストランチャー)」が捗りすぐる件


Gradle 0.9.+/0.9.2 error: Unable to load class 「com.android. builder.testing.api.DeviceProvider」

なんかこの辺 うまいことできねえのかな, Android Studio側で.

> Could not create plugin of type 'AppPlugin'.

以前も あったけど, Maven Central Repository との時間差だったりしたけれど.

classpath 'com.android.tools.build:gradle:0.9.+'

classpath 'com.android.tools.build:gradle:0.9.0'

「Unable to load class ‘com.android.builder.testing. api. DeviceProvider’.」と言い始める AndroidStudio

最新の状況をみていると, Maven Central Repository 側で公開されていても, gradle キャッシュが壊れてしまっているので, そのキャッシュを一度消すと良いらしい.

    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }

To fix:

gradle --refresh-dependencies

or delete

~/.gradle/caches

これでいけましたよ.

Gradle_0_9___0_9_2_error__Unable_to_load_class__com_android_builder_testing_api_DeviceProvider__-_Stack_Overflow

Gradle 0.9.+/0.9.2 error: Unable to load class 'com.android.builder.testing.api.DeviceProvider' - Stack Overflow


adb コマンドで 補完 させる

Cross_Reference___sdk_bash_completion_adb_bash

adb コマンドがめんどくさい場合は
コマンドを補完(completion)してもらいましょう.

何が補完できるか.

・オプション
・サブコマンド
・デバイスにインストールしているパッケージ名
・ローカル/リモートファイル名
・パソコンに接続しているデバイスシリアル名
...

# /* vim: set ai ts=4 ft=sh: */
#
# Copyright 2011, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

_adb() {
    unset -v have
    type $1 &> /dev/null && have="yes"

    if [ "$have" != "yes" ]; then
        return
    fi

    local where i cur serial
    COMPREPLY=()

    serial="${ANDROID_SERIAL:-none}"
    where=OPTIONS
    for ((i=1; i <= COMP_CWORD; i++)); do
        cur="${COMP_WORDS[i]}"
        case "${cur}" in
            -s)
                where=OPT_SERIAL
                ;;
            -p)
                where=OPT_PATH
                ;;
            -*)
                where=OPTIONS
                ;;
            *)
                if [[ $where == OPT_SERIAL ]]; then
                    where=OPT_SERIAL_ARG
                elif [[ $where == OPT_SERIAL_ARG ]]; then
                    serial=${cur}
                    where=OPTIONS
                else
                    where=COMMAND
                    break
                fi
                ;;
        esac
    done

    if [[ $where == COMMAND && $i -ge $COMP_CWORD ]]; then
        where=OPTIONS
    fi

    OPTIONS="-d -e -s -p"
    COMMAND="devices connect disconnect push pull sync shell emu logcat lolcat forward jdwp install uninstall bugreport help version start-server kill-server get-state get-serialno status-window remount reboot reboot-bootloader root usb tcpip"

    case $where in
        OPTIONS|OPT_SERIAL|OPT_PATH)
            COMPREPLY=( $(compgen -W "$OPTIONS $COMMAND" -- "$cur") )
            ;;
        OPT_SERIAL_ARG)
            local devices=$(command adb devices 2> /dev/null | grep -v "List of devices" | awk '{ print $1 }')
            COMPREPLY=( $(compgen -W "${devices}" -- ${cur}) )
            ;;
        COMMAND)
            if [[ $i -eq $COMP_CWORD ]]; then
                COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") )
            else
                i=$((i+1))
                case "${cur}" in
                    install)
                        _adb_cmd_install "$serial" $i
                        ;;
                    pull)
                        _adb_cmd_pull "$serial" $i
                        ;;
                    push)
                        _adb_cmd_push "$serial" $i
                        ;;
                    reboot)
                        if [[ $COMP_CWORD == $i ]]; then
                            args="bootloader recovery"
                            COMPREPLY=( $(compgen -W "${args}" -- "${COMP_WORDS[i]}") )
                        fi
                        ;;
                    shell)
                        _adb_cmd_shell "$serial" $i
                        ;;
                    uninstall)
                        _adb_cmd_uninstall "$serial" $i
                        ;;
                esac
            fi
            ;;
    esac

    return 0
}

_adb_cmd_install() {
    local serial i cur where

    serial=$1
    i=$2

    where=OPTIONS
    for ((; i <= COMP_CWORD; i++)); do
        cur="${COMP_WORDS[i]}"
        case "${cur}" in
            -*)
                where=OPTIONS
                ;;
            *)
                where=FILE
                break
                ;;
        esac
    done

    cur="${COMP_WORDS[COMP_CWORD]}"
    if [[ $where == OPTIONS ]]; then
        COMPREPLY=( $(compgen -W "-l -r -s" -- "${cur}") )
        return
    fi

    _adb_util_complete_local_file "${cur}" '!*.apk'
}

_adb_cmd_push() {
    local serial IFS=$'\n' i cur

    serial=$1
    i=$2

    cur="${COMP_WORDS[COMP_CWORD]}"

    if [[ $COMP_CWORD == $i ]]; then
        _adb_util_complete_local_file "${cur}"
    elif [[ $COMP_CWORD == $(($i+1)) ]]; then
        if [ "${cur}" == "" ]; then
            cur="/"
        fi
        _adb_util_list_files $serial "${cur}"
    fi
}

_adb_cmd_pull() {
    local serial IFS=$'\n' i cur

    serial=$1
    i=$2

    cur="${COMP_WORDS[COMP_CWORD]}"

    if [[ $COMP_CWORD == $i ]]; then
        if [ "${cur}" == "" ]; then
            cur="/"
        fi
        _adb_util_list_files $serial "${cur}"
    elif [[ $COMP_CWORD == $(($i+1)) ]]; then
        _adb_util_complete_local_file "${cur}"
    fi
}

_adb_cmd_shell() {
    local serial IFS=$'\n' i cur
    local -a args

    serial=$1
    i=$2

    cur="${COMP_WORDS[i]}"
    if [ "$serial" != "none" ]; then
        args=(-s $serial)
    fi

    if [[ $i -eq $COMP_CWORD && ${cur:0:1} != "/" ]]; then
        paths=$(command adb ${args[@]} shell echo '$'PATH 2> /dev/null | tr -d '\r' | tr : '\n')
        COMMAND=$(command adb ${args[@]} shell ls $paths '2>' /dev/null | tr -d '\r' | {
            while read -r tmp; do
                command=${tmp##*/}
                printf '%s\n' "$command"
            done
        })
        COMPREPLY=( $(compgen -W "$COMMAND" -- "$cur") )
        return 0
    fi

    i=$((i+1))
    case "$cur" in
        ls)
            _adb_shell_ls $serial $i
            ;;
        /*)
            _adb_util_list_files $serial "$cur"
            ;;
        *)
            COMPREPLY=( )
            ;;
    esac

    return 0
}

_adb_cmd_uninstall() {
    local serial i where cur packages

    serial=$1
    i=$2
    if [ "$serial" != "none" ]; then
        args=(-s $serial)
    fi

    where=OPTIONS
    for ((; i <= COMP_CWORD; i++)); do
        cur="${COMP_WORDS[i]}"
        case "${cur}" in
            -*)
                where=OPTIONS
                ;;
            *)
                where=FILE
                break
                ;;
        esac
    done

    cur="${COMP_WORDS[COMP_CWORD]}"
    if [[ $where == OPTIONS ]]; then
        COMPREPLY=( $(compgen -W "-k" -- "${cur}") )
    fi

    packages="$(
        command adb ${args[@]} shell pm list packages '2>' /dev/null 2> /dev/null | tr -d '\r' | {
            while read -r tmp; do
                local package=${tmp#package:}
                echo -n "${package} "
            done
        }
    )"

    COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${packages}" -- "${cur}") )
}

_adb_shell_ls() {
    local serial i cur file
    local -a args

    serial=$1
    i=$2
    if [ "$serial" != "none" ]; then
        args=(-s $serial)
    fi

    where=OPTIONS
    for ((; i <= COMP_CWORD; i++)); do
        cur="${COMP_WORDS[i]}"
        case "${cur}" in
            -*)
                where=OPTIONS
                ;;
            *)
                where=FILE
                break
                ;;
        esac
    done

    file="${COMP_WORDS[COMP_CWORD]}"
    if [[ ${file} == "" ]]; then
        file="/"
    fi

    case $where in
        OPTIONS)
            COMPREPLY=( $(compgen -W "$OPTIONS" -- "$cur") )
            _adb_util_list_files $serial "$file"
            ;;
        FILE)
            _adb_util_list_files $serial "$file"
            ;;
    esac

    return 0
}

_adb_util_list_files() {
    local serial dir IFS=$'\n'
    local -a toks
    local -a args

    serial="$1"
    file="$2"

    if [ "$serial" != "none" ]; then
        args=(-s $serial)
    fi

    toks=( ${toks[@]-} $(
        command adb ${args[@]} shell ls -dF ${file}"*" '2>' /dev/null 2> /dev/null | tr -d '\r' | {
            while read -r tmp; do
                filetype=${tmp%% *}
                filename=${tmp:${#filetype}+1}
                if [[ ${filetype:${#filetype}-1:1} == d ]]; then
                    printf '%s/\n' "$filename"
                else
                    printf '%s\n' "$filename"
                fi
            done
        }
    ))

    # Since we're probably doing file completion here, don't add a space after.
    if [[ $(type -t compopt) = "builtin" ]]; then
        compopt -o nospace
    fi

    COMPREPLY=( ${COMPREPLY[@]:-} "${toks[@]}" )
}

_adb_util_complete_local_file()
{
    local file xspec i j
    local -a dirs files

    file=$1
    xspec=$2

    # Since we're probably doing file completion here, don't add a space after.
    if [[ $(type -t compopt) = "builtin" ]]; then
        compopt -o plusdirs
        if [[ "${xspec}" == "" ]]; then
            COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") )
        else
            compopt +o filenames
            COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") )
        fi
    else
        # Work-around for shells with no compopt

        dirs=( $(compgen -d -- "${cur}" ) )

        if [[ "${xspec}" == "" ]]; then
            files=( ${COMPREPLY[@]:-} $(compgen -f -- "${cur}") )
        else
            files=( ${COMPREPLY[@]:-} $(compgen -f -X "${xspec}" -- "${cur}") )
        fi

        COMPREPLY=( $(
            for i in "${files[@]}"; do
                local skip=
                for j in "${dirs[@]}"; do
                    if [[ $i == $j ]]; then
                        skip=1
                        break
                    fi
                done
                [[ -n $skip ]] || printf "%s\n" "$i"
            done
        ))

        COMPREPLY=( ${COMPREPLY[@]:-} $(
            for i in "${dirs[@]}"; do
                printf "%s/\n" "$i"
            done
        ))
    fi
}


if [[ $(type -t compopt) = "builtin" ]]; then
    complete -F _adb adb
else
    complete -o nospace -F _adb adb
fi

Cross Reference: /sdk/bash_completion/adb.bash

以下のようなコンソール出力になります.

「adb」と文字を入力したあとのひとつスペースに注意しながらのです.


~ $ adb <TAB>
-d                 devices            help               pull               shell              usb
-e                 disconnect         install            push               start-server       version
-p                 emu                jdwp               reboot             status-window      
-s                 forward            kill-server        reboot-bootloader  sync               
bugreport          get-serialno       logcat             remount            tcpip              
connect            get-state          lolcat             root               uninstall          


~ $ adb -<TAB>
-d  -e  -p  -s  


~ $ adb -s 
01f9739f4fd1471c     192.168.10.101:5555  


~ $ adb push a.apk /<TAB>
/acct/              /dev/               /init.environ.rc    /mnt/               /sdcard/            /ueventd.rc
/cache/             /etc/               /init.mako.rc       /persist/           /seapp_contexts     /vendor/
/charger            /file_contexts      /init.mako.usb.rc   /proc/              /sepolicy           
/config/            /firmware/          /init.rc            /property_contexts  /storage/           
/d/                 /fstab.mako         /init.superuser.rc  /res/               /sys/               
/data/              /init               /init.trace.rc      /root/              /system/            
/default.prop       /init.cm.rc         /init.usb.rc        /sbin/              /ueventd.mako.rc    

~ $ adb uninstall <TAB>
Display all 217 possibilities? (y or n)
android                                                com.facebook.orca
com.adamrocker.android.input.simeji                    com.facebook.pages.app
com.adobe.flashplayer                                  com.farproc.wifi.analyzer
com.adobe.reader                                       com.gmail.jp.raziko.radiko
com.alensw.PicFolder                                   com.google.android.apps.adm
com.amazon.mp3                                         com.google.android.apps.ads.publisher
com.americanexpress.android.acctsvcs.japan             com.google.android.apps.authenticator2
com.andrew.apollo                                      com.google.android.apps.books
com.android.apps.tag                                   com.google.android.apps.chromecast.app

特に, ローカル/リモートディレクトリの補完が快適です.

そんな bash の 補完(completion)なスクリプトは他にもいろいろ見つかります.

android-completion/android at master · mbrubeck/android-completion · GitHub

metasystem/modules/android/shell/bash-completion.sh at master · garethstockwell/metasystem · GitHub

adb - romannurik-code - Roman's miscellaneous sample code - Google Project Hosting

お試しあれ.